Errore di pedice quando si tenta di rimuovere i valori vuoti da un array in VBA
Domanda
Sto cercando di eseguire una formula semplice per rimuovere le voci vuote da un array.L'array che sto usando è caricato da un campo in una tabella di dati che ho impostato in Excel chiamato Ty.Il nome di questo campo è TY [numero L3].Voglio tenere questa matrice dinamica, poiché potrebbe cambiare come aggiungere o eliminare le righe dalla tabella dei dati.I dati del test che sto usando hanno 218 righe, 210 dei quali hanno voci duplicate (che vorrei rimuovere in seguito) e 8 voci di "".
Quando si esegue la macro, ottengo un errore di run-time 9 "Indscript out of range" sulla prima riga della mia istruzione se.
Ho letteralmente trascorso ore a cercare di capire perché VBA mi sta dando questo errore.La mia comprensione è che ciò è dovuto a un array non correttamente dimensionato per gestire i dati passati ad esso.Ho usato la finestra di debug per verificare che entrambi gli array siano dimensionati correttamente.
Sono abbastanza nuovo da programmare e insegnare me stesso mentre vado, ma mi sto solo trovando la soluzione a questo da solo.
Sub BuildArray()
' Load array
Dim MyArr()
Dim J As Long
' Size array
MyArr() = Range("TY[L3 Number]")
ReDim NewArr(LBound(MyArr) To UBound(MyArr))
' For Loop to search for Blanks and remove from Array
' The Lbound and UBound parameters will be defined by the size of the TY[L3 Number] field in the TY Table
J = LBound(MyArr) - 1 ' Added this recently while testing the theory that J may start at the 2nd index in the loop, did not help
For i = LBound(MyArr) To UBound(MyArr)
If MyArr(i) <> "" Then ' This is where I error out
J = J + 1
NewArr(J) = MyArr(i)
End If
Next i
ReDim Preserve NewArr(LBound(MyArr) To J)
' Debug Window to show results of revised array.
Dim c As Long
For c = LBound(NewArr) To UBound(NewArr)
Debug.Print NewArr(c)
Next
Debug.Print "End of List"
End Sub
. Soluzione
Le gamme sono array multidimensionali .. (I.e. MyArray (#, #) dove il primo indice sarà la riga e la seconda la colonna.
Cambia
If MyArr(i) <> "" Then
.
a
If MyArr(i,1) <> "" Then
.
Se la tua gamma ha solo una colonna, il secondo indice sarà sempre 1