根据另一个数组选择一个数组中的值

时间:2015-07-14 21:55:24

标签: excel vba excel-vba

我之前在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 

我无法弄清楚原因。但是,我很确定它有更大的问题,它可能实际上不会实现我试图做的事情,即使我解决了这个问题。导致错误。

目前,我希望有人可以提供帮助的具体事项是:

  1. 导致错误的原因是什么?

  2. 如何定义k使其增加2(参见上面代码中的注释)

  3. 但是,我知道可能有更好的方法来做到这一点 - 如果是这样,其他建议将不胜感激!

1 个答案:

答案 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