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 , j'avais un peu mis de côté ne comprenant pas très bien ton code, en exécutant pas à pas je pense avoir compris. Bien pratique le Delete Shift:=xlUp ;)

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

Rechercher des sujets similaires à "difference array tableau vba"