我正在处理包含股票信息的大型工作表,其中的列组织如下:
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)然后?答案 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