2017-09-26 4 views
0

Pourquoi est-ce:Comment remplir un tableau 2D dynamique?

Dim Arr As Variant 
p = 1 
For i = 1 To LRow 
If Sheets("Data").Range("U" & 4 + i).Value > 0 Then 
    ReDim Preserve Arr(1 To p, 1 To 2) 
    Arr(p, 1) = Sheets("Data").Range("U" & 4 + i).Value 
    Arr(p, 2) = Sheets("Data").Range("N" & 4 + i).Value 
    p = p + 1 
End If 
Next 

résultats dans "erreur de temps d'exécution 9 - Subscript hors de portée" à la ligne ReDim? Je ne connais pas le nombre de lignes de tableau avant d'entrer dans la boucle for. Le numéro de colonne doit toujours être 2. Faire la même chose, mais avec un 1D Array fonctionne, cependant! Toute aide?

+1

Si vous connaissez la taille finale du tableau avant que la boucle ('1 Pour LRow'), redimensionnez le tableau une fois et profitez d'un formidable coup de fouet, en évitant un redimensionnement à chaque itération. –

Répondre

2

Comme indiqué, vous ne pouvez conserver redim la dernière dimension.

Mais vous pouvez également utiliser d'autres méthodes pour trouver le nombre de « lignes » nécessaires et définir cette avant rediming le tableau:

Dim Arr As Variant 
p = 1 
dim rws as long 
rws = Application.WorkSheetFunction.CountIf(Sheets("Data").Range("U5:U" & Lrow+4),">0") 
Redim Arr(1 to rws,1 to 2) 
For i = 1 To LRow 
If Sheets("Data").Range("U" & 4 + i).Value > 0 Then 

    Arr(p, 1) = Sheets("Data").Range("U" & 4 + i).Value 
    Arr(p, 2) = Sheets("Data").Range("N" & 4 + i).Value 
    p = p + 1 
End If 
Next