如何将过滤范围复制到数组中?(Excel VBA)

pha*_*han 3 arrays excel vba

我使用这个公式将唯一记录从A列复制到B列.

Range("A1", Range("A100").End(xlUp)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
Run Code Online (Sandbox Code Playgroud)

如何将过滤后的结果放入Excel VBA中的数组中,而不是将其复制到B列中?

Joh*_*ied 7

自问这个问题已经过去了一年,但我今天遇到了同样的问题,这是我的解决方案:

Function copyFilteredData() As Variant
    Dim selectedData() As Variant
    Dim aCnt As Long
    Dim rCnt As Long

    Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
    On Error GoTo MakeArray:
    For aCnt = 1 To Selection.Areas.Count
        For rCnt = 1 To Selection.Areas(aCnt).Rows.Count
            ReDim Preserve SelectedData(UBound(selectedData) + 1)
            selectedData(UBound(selectedData)) = Selection.Areas(aCnt).Rows(rCnt)
        Next
    Next

    copyFilteredData = selectedData
    Exit Function

MakeArray:
    ReDim selectedData(1)
    Resume Next

End Function 
Run Code Online (Sandbox Code Playgroud)

这将使数组的元素0为空,但UBound(SelectedData)返回选择中的行数

  • Redim 是一项非常昂贵的操作。我不会在这样的循环中使用它,除非预期的迭代次数非常少。 (2认同)
  • 您还应该[避免使用 select](/sf/ask/749997601/) 并声明一些范围来代替 `选择`. 除此之外,很好的方法论 (2认同)

Sor*_*eri 1

您将需要阅读本文,它将为您指明正确的方向

它说:

  1. 使用 AdvancedFilter 方法在工作表的某些未使用区域中创建筛选范围
  2. 将该范围的 Value 属性分配给 Variant 以创建二维数组
  3. 使用该范围的 ClearContents 方法将其删除