Tenho uma tabela chamada "Rastreador de vendas". Fiz um filtro automático e obtive meus resultados. Agora, quero transferir os campos visíveis para minha matriz chamada soArray. Na primeira vez que passo pelas células, funciona bem e coloco os 4 campos de que preciso na matriz. No entanto, após a primeira vez, recebo um "Erro de tempo de execução '9': Subscrito fora do intervalo". O que estou fazendo errado? Qualquer ajuda ou incentivo seria apreciado. Obrigado. Abaixo está meu código.
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
palavra-chave, poderá redimensionar apenas olast array dimension
.Documentação da Microsoft:
For Each rCell In rngVisible
é equivalenteFor Each rCell In rngVisible.Cells
e não extrai dados como você esperava.Além disso, uma tabela filtrada (
ListObject
) frequentemente consiste em intervalos não contíguos. Para lidar com isso corretamente, o script requerFor Each
loops aninhados.Se os critérios de filtragem em seu script forem tão simples quanto mostrado, uma abordagem alternativa poderia ser carregar a tabela em uma matriz e aplicar a lógica de filtragem usando VBA.
Uma alternativa para
ReDim
instruções repetidas é pré-alocar espaço de array suficiente para evitar redimensionamentos frequentes.