Différence "Array" et "Tableau" VBA
Bonjour,
J'ai quelques questions car je me mélange les pinceaux entre les notions de "Array" et de "Tableau" dans VBA.
Dans un code, je souhaite supprimer les cellules vides de quatre colonnes, pour cela je boucle sur un ensemble de quatre nombres de lignes.
Voici un extrait de mon code :
Dim DerTheme(3) As Variant
Dim Theme, Liste As Variant
DerTheme(0) = Worksheets("Themes").Range("B" & Rows.Count).End(xlUp).Row
DerTheme(1) = Worksheets("Themes").Range("D" & Rows.Count).End(xlUp).Row
DerTheme(2) = Worksheets("Themes").Range("F" & Rows.Count).End(xlUp).Row
DerTheme(3) = Worksheets("Themes").Range("H" & Rows.Count).End(xlUp).Row
Liste = Array(DerTheme(0), DerTheme(1), DerTheme(2), DerTheme(3))
j = 2
For Each Theme In Liste
i = 2
For ln = 2 To Theme
If Cells(i, j).Value = "" Then
Cells(i, j).Delete xlUp
Else
i = i + 1
End If
Next
j = j + 2
Next
DerTheme(3) est bien un tableau (de variables indicées) ? Est-on obligé de passer par une fonction Array pour parcourir les Themes ?
Et comment faire pour boucler sur les variables DerTheme(i) dans ma liste ?
Merci par avance :)
Bonsoir,
de ce que je comprend je peux essayer de répondre à cette question : DerTheme(3) est bien un tableau (de variables indicées) ?
Ma réponse est : non.
DerTheme(3) correspond à la valeur de l'indice 3 du tableau DerTheme.
Cette valeur correspond au numéro de ligne de la dernière valeur de la colonne H de la feuille Theme.
Donc si la dernière valeur est en ligne 45, alors DerTheme(3) = 45
Le plus simple serait d'avoir un fichier puis de nous ré expliquer ce que doit faire le code : J'ai compris qu'il fallait supprimer des cellules vides, mais ceci doit se faire colonne après colonne, ou bien si dans une colonne on trouve une cellule vide alors les cellules sur la même ligne des autres colonnes sont effacées également ?
A savoir, lors de suppression de cellule ou ligne sous Excel il faut partir d'en bas cela évite des oublis...
@ bientôt
LouReeD
Bonjour,
pour compléter DerTheme() étant un tableau,Liste = Array(DerTheme(0), DerTheme(1), DerTheme(2), DerTheme(3))
est donc redondant et inutile puisque tu recrées un tableau identique.
Et pour boucler dessus :
For i = 0 To 3
MsgBox DerTheme(i)
Next i
eric
PS : j'ajoute qu'avec Dim DerTheme(3), LBound dépend de Option Base (0 ou 1)
Je préfère l'inscrire dans la déclaration : Dim DerTheme(0 to 3) As xxx
C'est clair pour tout le monde et ça ne dépend plus d'une inscription faite ailleurs
Bonsoir à tous,
un essai qui n'utilise pas de tableau:
Dim Col As Byte, Lig As Long, DerLig As Long, PremLig As Byte
With Worksheets("Themes")
For Col = 2 To 8 Step 2 ' Pour les colonnes 2 (B), 4 (D), 6 (F) et 8 (H)
PremLig = 2
DerLig = .Cells(Cells.Rows.Count, Col).End(xlUp).Row
For Lig = DerLig To PremLig Step -1 ' de la dernière ligne à la première
If .Cells(Lig, Col).Value = "" Then .Cells(Lig, Col).Delete Shift:=xlUp
Next
Next
End With
A+
Bonjour,
Tout d'abord merci pour vos réponses qui m'ont été fort utiles.
@ eriiic Bien intégré tes remarques dans mon code.
@ LouReeD Merci pour la précision, c'est bien DerTheme le tableau. Et c'est bien une suppression de cellules vides colonne par colonne que je cherche à faire par ma boucle.
En fait, je souhaite travailler sur une arborescence de dossier que j'ai importée par PowerQuery pour créer des tables de thèmes et de sous-thèmes d'ouvrages.
Pour être plus précis, chaque fichier a un chemin que j'ai scindé le dans PowerQuery, de chemin.1 à chemin.4 dans un onglet "Arbo" :
Dans ma table de requête que j'ai copiée dans Arbo :
- col B a pour entête chemin.1 , c'est le thème (ou "sous-thème ind 0")
- col C a pour entête chemin.2 , c'est le sous-thème ind 1
- col D a pour entête chemin.3 , c'est le sous-thème ind 2
- col E a pour entête chemin.4 , c'est le sous-thème ind 3
Je veux ensuite récupérer mes thème et sous-thème dans un onglet "Themes", pour cela je dois supprimer les doublons et les cellules vides. Voici les colonnes de destination dans l'onglet "Themes" :
- col B : sous-thème ind 0
- col D : sous-thème ind 1
- col F : sous-thème ind 2
- col G : sous-thème ind 3
Mon code est le suivant, chez moi ça marche mais on peut sans doute l'améliorer.
Sub ListeThemes()
Dim ln, col As Integer
Dim i, j As Integer
Dim DerIndex As Integer
Dim DerTheme(0 To 3) As Integer, k As Integer
'Recupere les theme et sous themes de Arbo et les colle sans doublon dans Themes
DerIndex = Worksheets("Arbo").Cells(Rows.Count, 1).End(xlUp).Row
For col = 2 To 5
With Worksheets("Arbo")
.Range(.Cells(2, col), .Cells(DerIndex, col)).Copy
With Worksheets("Themes")
.Cells(2, 2 * col - 2).PasteSpecial Paste:=xlPasteValues
.Range(.Cells(2, 2 * col - 2), .Cells(DerIndex, 2 * col - 2)).RemoveDuplicates Columns:=1
End With
End With
Next
'Supprime les cellules vides
j = 2
For k = 0 To 3
DerTheme(k) = Worksheets("Themes").Cells(Rows.Count, 2 * k + 2).End(xlUp).Row
i = 2
For ln = 2 To DerTheme(k)
If Cells(i, j).Value = "" Then
Cells(i, j).Delete xlUp
Else
i = i + 1
End If
Next
j = j + 2
Next
End Sub
Après, il faut que je m'occupe de l'indiçage dans les colonnes A, C, E, G de Themes pour que chaque fichier soit bien classé. Ex. 2.1.5.3. monfichier
Merci
Bonjour,
Et ce que fait le code d'AlgoPlus ?
@ bientôt
LouReeD
Et merci AlgoPlus
Voici mon nouveau code :
Sub ListeThemes()
Dim Col As Byte, Lig As Long, DerLig As Long, PremLig As Byte
Dim DerIndex As Integer
'Recupere les theme et sous themes de Arbo et les colle sans doublon dans Themes
With Worksheets("Arbo")
DerIndex = Worksheets("Arbo").Cells(Rows.Count, 1).End(xlUp).Row
For Col = 2 To 5
.Range(.Cells(2, Col), .Cells(DerIndex, Col)).Copy
With Worksheets("Themes")
.Cells(2, 2 * Col - 2).PasteSpecial Paste:=xlPasteValues
.Range(.Cells(2, 2 * Col - 2), .Cells(DerIndex, 2 * Col - 2)).RemoveDuplicates Columns:=1
End With
Next
End With
'Supprime les cellules vides
With Worksheets("Themes")
For Col = 2 To 8 Step 2
PremLig = 2
DerLig = .Cells(Cells.Rows.Count, Col).End(xlUp).Row
For Lig = DerLig To PremLig Step -1
If .Cells(Lig, Col).Value = "" Then .Cells(Lig, Col).Delete Shift:=xlUp
Next
Next
End With
End Sub
Merci