Regroupement de lignes en fonction d'une arborescence

Bonjour à tous,

Un peu novice en VBA je n'ai malheureusement pas réussi à faire ce que je voulais sur mon fichier excel.

Après plusieurs cherches sur différents forums je me permets de soumettre mon problème ici en espérant y trouver une réponse ou une aide

Je cherche une Marco permettant de faire la chose la chose suivante.

J'extrait dans un fichier excel l'arborescence d'un répertoire et je souhaiterais regrouper les lignes par niveau de manière automatique.

Je m'explique le fichier excel présente des niveaux d'arborescence comme ci dessous :

________Niveau 1 | Niveau 2 | Niveau 3 etc..

Ligne1 | xx

Ligne2 | __________xx

Ligne3 |___________xx

Ligne4 |____________________ xx

Ligne5 | xx

etc

Je souhaiterais pouvoir regrouper la ligne 1 à un premier niveau, puis les lignes 2 et 3 à un deuxième niveau, puis la ligne 4 à un troisième niveau, puis la ligne 5 au premier niveau etc...

Pour que ce soit plus explicite j'ai mis un fichier en pièce jointe avec deux onglets.

Un onglet qui représente mon arborescence et un autre onglet avec le résultat que je souhaiterai visualiser.

Je vous remercie par avance pour votre aide

Excellente journée à vous à très vite je l'espère

Cordialement Paolo

Bonjour,

Sub plan()

For niv = 6 To 1 Step -1
    flag = False
    For ligne = 2 To 23
        If Range("G" & ligne) = niv And flag = False Then
            flag = True
            debut = ligne
        End If
        If Range("G" & ligne) < niv And flag = True Then
            flag = False
            Rows(debut & ":" & ligne - 1).Rows.Group
        End If
    Next
Next

End Sub

Bonjour c'est top! la macro fonctionne parfaitement !

Je n'avais pas pensé à rajouter une colonne avec une numérotation pour simplifier le travail !

Bien vu

Je vais essayer d'étendre ta macro à un fichier plus complexe et à automatiser le tout pour l'appliquer à tout type d'arbo et non un modèle particulier comme je l'ai proposé en pièce jointe

Saurais-tu me dire comment tu peux transcrire ta formule dans la colonne G en vba

=SIERREUR(EQUIV("*";A2:F2;0);0)

Sachant qu'au lieu de "F" il faudrait mettre l'équivalant de la dernière colonne non vide de la feuille excel

Encore un grand merci pour ton aide !!

Je n'avais pas pensé à rajouter une colonne avec une numérotation pour simplifier le travail !

Saurais-tu me dire comment tu peux transcrire ta formule dans la colonne G en vba

=SIERREUR(EQUIV("*";A2:F2;0);0)
En fait, je pensais même qu'il faudrait la supprimer.

Je vais regarder...

Sub plan()

For niv = 6 To 1 Step -1
    flag = False
    For ligne = 2 To 23
        xx = 0
        For colonne = 1 To 6
            If Cells(ligne, colonne) <> "" Then xx = colonne
        Next
        If xx = niv And flag = False Then
            flag = True
            debut = ligne
        End If
        If xx < niv And flag = True Then
            flag = False
            Rows(debut & ":" & ligne - 1).Rows.Group
        End If
    Next
Next

End Sub

Attention, j'ai remarqué qu'il faut que la dernière ligne soit de niveau 1

ou bien dans la macro on va jusqu'à la ligne finale +1 (avec comme conséquence un niveau de plus)

Il faudrait voir comment résoudre ce point.

Bonjour Steelson ,

Encore merci pour ton retour.

Je vais étudier ta deuxième proposition en milieu d'après midi et revenir vers toi

A-ton la possibilité avec une ligne de code vba de supprimer uniquement le dernier niveau de regroupement si l'on va jusqu'à la ligne finale +1 ?

Merci par avance

La fonction :

Range("A1:F23").Rows.Ungroup

semble faire l'affaire

je vais donc essayer de remettre ça au propre en généralisant à une arbo plus complexe

Je te ferais un retour en fin d'après midi

Encore un grand Merci à toi !!

La fonction :

Range("A1:F23").Rows.Ungroup

semble faire l'affaire

belle astuce en effet !

Bonjour

Au final jai le code suivant qui marche plutôt bien pour essayer de généraliser

Sub Plan()

'Dercol_num = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
Dercol_num = Worksheets("Arbo").UsedRange.Columns.Count
Dercol_let = Split(Columns(Dercol_num).Address(ColumnAbsolute:=False), ":")(1)
Ligne_Max = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Ligne_Max_Plus_Un = Ligne_Max + 1

For niv = Dercol_num To 1 Step -1
    flag = False
    For ligne = 2 To Ligne_Max_Plus_Un
        xx = 0
        For colonne = 1 To Dercol_num
            If Cells(ligne, colonne) <> "" Then xx = colonne
        Next
        If xx = niv And flag = False Then
            flag = True
            debut = ligne
        End If
        If xx < niv And flag = True Then
            flag = False
            Rows(debut & ":" & ligne - 1).Rows.Group
        End If
    Next
Next

Range("A1:" & Dercol_let & Ligne_Max).Rows.Ungroup

End Sub

En revanche ça ne marche pas au dessus de 7 nivaux est-ce normal? (voir fichier en pièce jointe avec 8 niveaux)

30arbo-v3.xlsm (15.26 Ko)

En Remarque il est préférable d'utiliser la formule suivante :

Dercol_num = Worksheets("Feuil1").UsedRange.Columns.Count

si la première ligne n'est pas renseigné avec les niveaux

En revanche ça ne marche pas au dessus de 7 nivaux est-ce normal? (voir fichier en pièce jointe avec 8 niveaux)

Excel n'admet pas plus de 8 niveaux.

En Remarque il est préférable d'utiliser la formule suivante :

Dercol_num = Worksheets("Feuil1").UsedRange.Columns.Count

si la première ligne n'est pas renseigné avec les niveaux

tout a fait ! j'vais été au plus vite en me focalisant sur le logigramme.

Top encore merci beaucoup pour tes retours Steelson!!!

C'est vraiment super gentil à toi 🙏😇💪

Rechercher des sujets similaires à "regroupement lignes fonction arborescence"