选择数据行并将其提取到另一个工作表

时间:2015-03-20 20:50:27

标签: excel vba excel-vba

我正在处理包含股票信息的大型工作表,其中的列组织如下:

    ID     DATE       TIME     PRICE       QUANTITY    NBE

它持续500k +行,我有10张以上的纸张。我只需要提取每个交易日的前两笔交易,并在新工作表(Sheet1)上创建一个新列表。每天的第一笔交易总是在“09:00:00”。

到目前为止,我编写了这段代码,其中我尝试复制我需要的两行,然后将它们粘贴到Sheet1中,从而创建新列表。它运行没有错误,但没有任何显示......

Sub Macro1()

i = 2
Range("C2").Select
Range(Selection, Selection.End(xlDown)).Select

For Each Cell In Selection
 If Day(.Range("B" & cRow).Value) <> Day(.Range("B" & cRow - 1).Value) Then
    ActiveCell.EntireRow.Copy
    ActiveWorkbook.Sheets("Sheet1").Rows(i).Paste
    ActiveCell.Offset(1).Copy
    ActiveWorkbook.Sheets("Sheet1").Rows(i + 1).Paste
    i = i + 2
End If
Next Cell

End Sub

我不应该选择并将副本粘贴在一起吗?或者是否可以从activecell创建一个包含2行和6列的范围,然后复制该范围的粘贴?

编辑1:它不能正常工作..我像上面一样更新了它,但我仍然在这里得到一个错误438 ActiveWorkbook.Sheets(“Sheet1”)。行(i).Paste

编辑2:我是一个大菜鸟。刚刚意识到并非所有的第一笔交易都是在9:00:00进行的,所以我需要选择基于有没有一天的行,并选择前两个。 我可以改用这个条件:如果日(范围(“B”和cRow).Value)&lt;&gt;日(范围(“B”&amp; cRow - 1).Value)然后?

3 个答案:

答案 0 :(得分:1)

我打赌您的Time列格式化为日期/时间字段,因此您将字符串09:00:00与长字符(日期/时间)进行比较,它永远不会是相等。

试试这个:

if Format(Cell.Value, "hh:mm:ss") = "09:00:00" Then

你的英语一点都不差......

答案 1 :(得分:0)

使用以下行参考工作表时

ActiveWorkbook.Sheets(Sheet1).Rows(i).Paste

Sheet1可能是未正确定义的变量。如果“Sheet1”是工作表的实际名称,则将其括在双引号中

ActiveWorkbook.Sheets("Sheet1").Rows(i).Paste

在看了@ FreeMan的答案后......你应该先做到这一点。修复他说过要做的事后,你可能会收到错误9下标错误。

答案 2 :(得分:0)

这应该快点做到

确保您在工作表上包含数据并运行它,并将它从第2行开始复制到同一工作簿中的sheet1上

你应该确保sheet1也是空的,使用.clearContents

Sub Macro1()

    Dim lngFirstRow As Long
    Dim lngLastRow As Long
    Dim cRow As Long
    Dim shSrc As Worksheet

    Dim lngNextDestRow As Long
    Dim shDest As Worksheet

    Application.ScreenUpdating = False

    Set shSrc = ActiveWorkbook.ActiveSheet
    Set shDest = ActiveWorkbook.Sheets("Sheet1")

    With shSrc

        lngFirstRow = 2
        lngLastRow = .Cells.Find(What:="*", After:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
        lngNextDestRow = 2

        For cRow = lngFirstRow To lngLastRow Step 1

            If Format(.Range("C" & cRow).value, "hh:mm:ss") = "09:00:00" Then

                .Rows(cRow).EntireRow.Copy Destination:=shDest.Range("A" & lngNextDestRow )

                   .Rows(cRow+1).EntireRow.Copy Destination:=shDest.Range("A" & lngNextDestRow+1 )

                lngNextDestRow = lngNextDestRow + 2

            End If
        Next cRow

    End With

    Application.ScreenUpdating = True
End Sub