Estou tentando fazer uma matriz que armazena todos os valores na coluna A da "Pasta de trabalho B" para que eu possa fazer referência e ver se o valor de uma célula está nessa matriz na coluna A da "Pasta de trabalho A".
Isto é o que eu tenho até agora para essa matriz:
Dim StrArray() As String
Dim TotalRows As Long
Dim X As Long
Workbooks.Open Filename:="filepath", ReadOnly:=True
With Workbooks("file").Worksheets("sheet")
TotalRows = Rows(Rows.Count).End(xlUp).Row
ReDim StrArray(1 To TotalRows)
For X = 2 To TotalRows
StrArray(X) = Cells(X, 1).Value
Next X
End With
Esta parte da matriz funciona bem, confirmei que está funcionando corretamente exibindo todos os valores da matriz em um MsgBox. O problema surge quando tento referenciar essa matriz na "Pasta de trabalho A" para verificar se o valor de uma célula está nessa matriz.
Isto é o que eu tenho para esse código:
For RowCounter = LastRow To 1 Step -1
If IsInArray(Range("B" & RowCounter).Value, StrArray) Then
Range("K" & RowCounter).Value = "MATCH"
End If
Next RowCounter
Workbooks("file").Close SaveChanges:=False
Aqui está a função que estou usando:
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Dim i
For i = LBound(arr) To UBound(arr)
If arr(i) = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next i
IsInArray = False
End Function
Ele não coloca o valor "MATCH" na coluna K. Eu tentei solucionar problemas colocando um MsgBox na instrução If para ver se ele está correspondendo ao valor da matriz, e isso me deu um loop sem fim do MsgBox. Se for importante, atualmente existe texto na coluna K sobre o qual este código está escrevendo.
Se eu estivesse resolvendo esse problema, eu me recusaria a usar um array em favor do método MATCH embutido :
Obviamente, o código real deve ser mais longo - por exemplo, você precisa verificar se a pasta de trabalho "filepath" existe e está aberta, se há uma planilha chamada "sheet", se há dados lá e mais
Este código resolve o problema, mas não responde sua pergunta sobre o uso de um array para essa finalidade.
O código do array será um pouco mais longo porque precisamos de um procedimento auxiliar para preenchê-lo e de uma função para pesquisá-lo.
O truque do código auxiliar é usar uma busca binária , que é muito mais rápida do que a busca linear que você usa ao passar por um array não classificado elemento por elemento.
Para implementar esse truque sem código auxiliar, você pode usar um objeto Dictionary - já está tudo lá e você não precisa se preocupar com sua própria implementação dos algoritmos clássicos.
No entanto, teste ambos os procedimentos em conjuntos de dados suficientemente grandes e veja como o algoritmo de matriz supera o método MATCH integrado.
O código do JohnSUN funciona bem, mas também descobri como fazer o caminho do array funcionar.
O problema era quando "MATCH" estava sendo aplicado, ele estava colocando no arquivo errado. Então eu tive que reativar o arquivo que eu queria antes que o código fosse executado.