我之前在VBA中做过一些相对简单的事情,但我认为在这个项目中我需要使用变量和可能的数组,这些目前似乎超出了我的目标。
我有4列数据:col。 A是开始时间,col。 B是相应的结束时间(每个约30个),col。 C是数据点的时间戳(在A列和B列中指定的时间段期间和之间收集;这些列中有40,000多行数据)和col。 D是在col中引用的每个时间点观察到的数据。 C.每个文件都有不同的开始/结束时间,所以我想创建一个可以从单元格中读取它们的宏。
我需要将A列和B列中指定的每个时间段中的时间戳和数据点放入单独的列中(例如,时间段1数据将在F和G列中,时间段2数据将在H和我,等等)。所以,我想编写一个基本上搜索col的宏。 C表示第一个时间段的开始和结束时间之间的值,并将相关的值复制/粘贴到相应的新列中。
我一直在谷歌上搜索疯狂,但我很难将各种代码组合在一起,以解决不同的步骤。这是我到目前为止(以及一些说明我认为事情本应该做的事情):
Sub CopyRows2()
Dim endTime As Range, startTime As Range
Dim copyRange As Range, lastRow As Range, timePoint As Range
Dim i As Long, k As Long
Set startTime = ActiveSheet.Cells(i, 2).Value
lastRow = ActiveSheet.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row 'find the last row of the time periods
Set timePoint = ActiveSheet.Cells(2, 3) 'start looking for times in cell C2
Do Until lastRow = ""
For i = 2 To lastRow
Set endTime = startTime.Offset(0, 1) 'identify the end of the time period
If timePoint.Value >= startTime.Value Then 'find the row with the first data point in the time period
If copyRange Is Nothing Then 'this "copyRange" stuff is based on: http://stackoverflow.com/questions/9790924/excel-vba-how-to-select-rows-based-on-data-in-a-column
Set copyRange = ActiveSheet.Rows(i)
Else
Set copyRange = Union(copyRange, ActiveSheet.Rows(1))
End If
End If
Next i
If Not copyRange Is Nothing Then
ActiveSheet.copyRange.Copy ActiveSheet.Cells(2, k) 'k is meant to be the column number, which will keep incrementing by 2 but I don't know how to tell it to do that
End If
Loop
End Sub
现在它给了我一个错误:
"应用程序定义或对象定义的错误"
在这一行:
Set startTime = ActiveSheet.Cells(i, 1).Value
我无法弄清楚原因。但是,我很确定它有更大的问题,它可能实际上不会实现我试图做的事情,即使我解决了这个问题。导致错误。
目前,我希望有人可以提供帮助的具体事项是:
导致错误的原因是什么?
如何定义k使其增加2(参见上面代码中的注释)
但是,我知道可能有更好的方法来做到这一点 - 如果是这样,其他建议将不胜感激!
答案 0 :(得分:1)
假设数据从第2行开始。确保范围D1不为空。
Sub CopyRows2()
Dim lastRow As Long
Dim lastCol As Long
Dim ws As Worksheet
'clear enough columns for ~30 data sets
Columns("E:CA").ClearContents
Set ws = Worksheets("Sheet2")
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
x = 2
With ws
'fill columns A+B to correspond with C
Do Until Cells(lastRow, 1) <> ""
If .Cells(x, 2) <> .Cells(x, 3) Then
.Range("A" & x + 1 & ":B" & x + 1).Insert Shift:=xlDown
.Cells(x + 1, 1) = .Cells(x, 1)
.Cells(x + 1, 2) = .Cells(x, 2)
End If
x = x + 1
Loop
'move blocks
i = 2
c = 1
Do Until i > lastRow
'change in column A
If .Cells(i + 1, 1) <> .Cells(i, 1) Then
.Range("c" & i - c + 1 & ":D" & i).Copy
lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
.Cells(1, lastCol + 1).PasteSpecial
c = 0
End If
i = i + 1
c = c + 1
Loop
End With
End Sub