【问题标题】:Select range using specific criteria within a contiguous column of data使用连续数据列中的特定条件选择范围
【发布时间】:2012-01-08 00:19:07
【问题描述】:

我想让 VBA 选择一个范围,从 excel 中的连续数据集中覆盖恒定数量的列但不同数量的行,仅捕获包含匹配时间戳的行(在这种特定情况下,虽然能够匹配显然,任何标准都更具动态性)。我想将此范围提供给我拥有的另一个宏。在我的宏在捕获的范围上运行其进程后,我希望它使用下一个捕获的范围再次循环整个过程。

      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 行捕获为一个范围,运行我的宏,然后...

我想将 A-F 列、第 4-7 行捕获为另一个范围,运行我的宏,然后...

我想将 A-F 列、第 8-10 行捕获为另一个范围,运行我的宏等...直到在此范围之下没有更多范围可捕获。

如您所见,本例中的行通过时间戳来区分。

我只有几天时间才能掌握 VBA,我对什么是做什么有一个基本的了解,只是没有从我发现的其他示例中拼凑出这一点的经验。

感谢您的帮助。

【问题讨论】:

    标签: vba loops excel


    【解决方案1】:

    可能最简单的方法是:

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

    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
    

    【讨论】:

    • 这是伟大的克里斯,谢谢。只是看着这个帮助我学习。它需要一些调整才能完美地满足我的需求。在我的工作表中,我的数据从“A3”开始。另外,有没有办法指定距离它捕获的“A”最远的列?原因是我的数据是一个集合块,它永远不会偏离。不过这很聪明,再次感谢。
    • @Toby 点击答案旁边的复选标记链接,如果它适合您,请接受 Chris 的答案。
    • @Toby,我已经用另一种获取数据块的方法更新了我的答案。请注意,sh.[A3].CurrentRegion 无论如何都应该满足您的需求
    • @Abbas 谢谢,如果它确实完成了我需要它做的事情,我会的。目前它选择的列比需要的多得多。这很重要,因为我稍后调用的宏会复制选定的数据并将其粘贴到其他地方。数据的绝对范围至关重要。
    • @Toby 新信息 - 在感兴趣的范围旁边存在更多数据:在这种情况下,替代方法将起作用 v = sh.Range([A3], [A3].End(xlDown)).Resize(, 6) 甚至 v = sh[A3].CurrentRegion.Resize(, 6)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多