是否可以使用符合特定条件的行号填充数组而不进行循环?

The*_*man 11 arrays excel vba excel-vba

我想在VBA中填充一个数组,其中只有符合特定条件的行数.我想尽可能快的方法(例如,类似的东西RowArray = index(valRange=valMatch).row)

下面是(慢)范围循环的代码.

Current Code

Sub get_row_numbers()

Dim RowArray() As Long
Dim valRange As Range
Dim valMatch As String

Set valRange = ActiveSheet.Range("A1:A11")
valMatch = "aa"
ReDim RowArray(WorksheetFunction.CountIf(valRange, valMatch) - 1)

For Each c In valRange
    If c.Value = valMatch Then RowArray(x) = c.Row: x = x + 1
Next c    
End Sub
Run Code Online (Sandbox Code Playgroud)

bre*_*tdj 11

仍然是Chris的高效变体阵列时间的2-3倍,但该技术功能强大,并且超出了这个问题的应用

需要注意的一点是,Application.Transpose仅限于65536个单元格,因此需要将更长的范围"分块"成碎片.

Sub GetEm()
Dim x
x = Filter(Application.Transpose(Application.Evaluate("=IF(A1:A50000=""aa"",ROW(A1:a50000),""x"")")), "x", False)
End Sub
Run Code Online (Sandbox Code Playgroud)

  • +1干得好,这是我能看到的最佳解决方案. (3认同)
  • 我非常喜欢你的答案并从中学到了很多东西.您可以通过执行以下操作来更快地实现此方法:x = Filter(ActiveSheet.Evaluate("= TRANSPOSE(IF(A1:A50000 =""aa"",ROW(A1:a50000),""x" "))"),"x",False)`我知道Charles Williams在这个帖子上很活跃,但他提到使用Worksheet.Evaluate可以比[this post.]中的Application.Evaluate更快(http:// fastexcel. wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast/) (3认同)
  • + 1我必须同意@Reafidy :) (2认同)

chr*_*sen 8

首先将范围复制到变量数组,然后遍历数组

Arr = rngval
For I = 1 to ubound(arr)
    If arr(I,1) = valMatch Then RowArray(x) = I: x = x + 1
Next
Run Code Online (Sandbox Code Playgroud)

  • +1好的.@The_Barman:我能想到的最快的方法是使用Autofilter过滤你的范围,然后将它们复制到一个数组(然后使用Chris显示的方法) (2认同)