使用连续数据列中的特定条件选择范围

时间:2012-01-08 00:19:08

标签: excel vba loops excel-vba

我想让VBA选择一个Range,覆盖恒定数量的列但是与excel中的连续数据集的行数不同,只捕获包含匹配时间戳的行(在这种特定情况下,尽管匹配的能力任何标准显然都更具动态性。我想把这个Range送到另一个我有的宏。在我的宏在捕获的范围上运行其进程之后,我希望它使用下一个捕获的范围再次遍历整个过程。

      A       B       C           D       E       F
1     x       x       12:10       x       x       x
2     x       x       12:10       x       x       x
3     x       x       12:10       x       x       x
4     x       x       12:40       x       x       x
5     x       x       12:40       x       x       x
6     x       x       12:40       x       x       x
7     x       x       12:40       x       x       x
8     x       x       1:05        x       x       x
9     x       x       1:05        x       x       x
10    x       x       1:05        x       x       x

例如,

我想捕获A-F列,1-3行作为一个Range,运行我的宏,然后...

我想捕获A-F列,4-7行作为另一个Range,运行我的宏,然后......

我想捕获A-F列,第8-10行作为另一个Range,运行我的宏等等......直到没有更多范围可以捕获。

如您所见,这种情况下的行按时间戳区分。

我只是花了几天时间来掌握VBA,我对于什么做了基本的不确定性,而不是从我发现的其他例子中将这一部分拼凑起来的经验。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

最简单的方法可能是:

  1. 将数据复制到数组
  2. 检查数组以查找连续范围(循环此数组比循环单元格快得多)
  3. 使用已识别的范围调用您的宏

  4. Option Explicit
    
    Sub Demo()
        Dim v As Variant
        Dim i As Long, j As Long
        Dim sh As Worksheet
    
        Set sh = ActiveSheet
        v = sh.[A1].CurrentRegion ' Assumes data range starts at cell A1
        ' Alternative method to get data block starting at A3
        ' Extend to a specified column number (NumberOfColumnsYouWant)
        ' Assumes all rows in your data block in columns A have data
        v = sh.Range([A3], [A3].End(xlDown)).Resize(, NumberOfColumnsYouWant)
    
    
        i = 1
        j = 1
        Do While i <= UBound(v, 1)
            Do While j < UBound(v, 1)
                If v(i, 3) = v(j + 1, 3) Then
                    j = j + 1
                Else
                    Exit Do
                End If
            Loop
            YourMacro Range(sh.Cells(i, 1), sh.Cells(j, UBound(v, 2)))
            i = j + 1
            j = i
        Loop
     End Sub
    
     Sub YourMacro(rng As Range)
         MsgBox rng.Address
     End Sub