我有一个名为“销售跟踪器”的表格,我进行了自动过滤并获得了结果。现在我想将可见字段转移到我的数组 soArray 中,第一次浏览单元格时,它工作正常,我将需要的 4 个字段放入数组中,但是,第一次出现“运行时错误'9':下标超出范围”后,我做错了什么?任何帮助或推动都将不胜感激,谢谢以下是我的代码
Sub getAllSO()
Dim wkb As Workbook
Dim wks As Worksheet
Set wkb = Workbooks("ScrubCentral.xlsm")
Set wks = wkb.Sheets("Sales Tracker")
Dim tbl As ListObject
Set tbl = wks.ListObjects("SalesTracker")
tbl.AutoFilter.ShowAllData
tbl.Range.AutoFilter field:=4, Criteria1:=">0"
Dim soArray() As Variant
Dim rngVisible As Range
Dim i As Long
Dim rCell As Range
With wks
With .AutoFilter.Range
Set rngVisible = .Offset(1, 0).Resize(.Rows.Count - 1, 1) _
.SpecialCells(xlCellTypeVisible)
End With
For Each rCell In rngVisible
i = i + 1
ReDim Preserve soArray(1 To i, 1 To 4)
soArray(i, 1) = rCell(i, 2)
soArray(i, 2) = rCell(i, 3)
soArray(i, 3) = rCell(i, 4)
soArray(i, 4) = rCell(i, 13)
Debug.Print soArray(i, 1), soArray(i, 2), soArray(i, 3), soArray(i, 4)
Next rCell
End With
End Sub
Preserve
关键字,则只能调整 的大小last array dimension
。Microsoft 文档:
For Each rCell In rngVisible
相当于For Each rCell In rngVisible.Cells
并且不会按您预期提取数据。此外,过滤表 (
ListObject
) 通常由不连续的范围组成。为了正确处理这种情况,脚本需要嵌套For Each
循环。如果脚本中的过滤条件如上所述简单明了,则另一种方法可能是将表加载到数组中并使用 VBA 应用过滤逻辑。
重复语句的替代方法
ReDim
是预先分配足够的数组空间,以避免频繁调整大小。