Créer un plan - excel vba

Résolu
gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024 - 5 sept. 2024 à 23:32
yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 - 6 sept. 2024 à 10:15

Bonjour,

J'ai un fichier Excel avec plus de 60000 lignes représentant des nomenclatures d'ensembles. Dans ce fichier, j'ai mis dans la première colonne les niveaux de nomenclature.

Je souhaite grouper les lignes en créant un plan. Comme en exemple sur le fichier joint dans l'onglet "avec plan". Avec 60000 lignes, ça va être fastidieux de le faire manuellement. Donc je souhaiterai le faire avec une macro.

Mais je bloque. J'ai essayé de faire des boucles en testant la valeur de la cellule dans la colonne "Niveau", mais je me perds dans les boucles et le passage d'une ligne à l'autre.

Enfin bref, est-ce que quelqu'un aurait une idée svp ?

Merci d'avoir lu ma question :)

(Je suis en Excel 2016)

A voir également:

2 réponses

yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 1 533
Modifié le 6 sept. 2024 à 09:12

bonjour, suggestion:

Option Explicit

Sub plan()
Dim fl As Worksheet, niveau As Integer, premcel As Range, cel   As Range
Debug.Print Now()
Set fl = Sheets("sans plan")
For niveau = 1 To 4
    Set cel = fl.[a2]
    Do While cel <> ""
        If cel > niveau Then
            Set premcel = cel
            Do
                Set cel = cel.Offset(1)
            Loop Until cel <= niveau Or cel = ""
            Debug.Print niveau, premcel.Row, cel.Row - 1
            Range(premcel, cel.Offset(-1)).Rows.Group
        Else
            Set cel = cel.Offset(1)
        End If
    Loop
Next niveau
End Sub
1
yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 1 533
6 sept. 2024 à 09:31

La différence principale par rapport à ton code, c'est l'utilisation de boucles do au lieu de boucles for.

Je travaille avec des cellules plutôt qu'avec des numéros de lignes, mais c'est un détail, je le fais par facilité.

0
gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024 2
6 sept. 2024 à 09:57

Merci beaucoup !! :)

ça fonctionne nickel.

Il faut vraiment que je regarde la fonction Do While...Loop, car je ne la connais pas trop et donc je n'y pense pas du tout.

J'ai juste une petite question ; Pourquoi vous mettez Debug.print ? ça sert à quoi exactement ?

En tout cas, merci.

Bonne journée

0
yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 1 533 > gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024
6 sept. 2024 à 10:15

le debug.print affiche de l'information dans la fénêtre d'exécution (ctl-G dans l'éditeur de code).  cela permet de comprendre ce que fait le code.

0
gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024 2
5 sept. 2024 à 23:33

Ci-dessous le lien de mon fichier 

https://www.cjoint.com/c/NIfvFdnLE3F

0
yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 1 533
6 sept. 2024 à 08:00

Je ne vois pas dans ce fichier le code que tu as essayé.

Tu peux t'aider de l'enregistreur de macros pour comprendre comment automatiser la création de plans.

0
gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024 2 > yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024
6 sept. 2024 à 08:27

Bonjour,

Je n'ai pas mis le code, car j'ai bloqué dessus.

J'ai fait l'enregistreur pour voir le code pour grouper, mais c'est tout le passage de test que je n'arrive pas à faire.

Ci-dessous mon essai de début de code : (les dernières lignes sont en commentaires, elles proviennent d'un enregistrement que j'ai fait sur un autre fichier, pour voir le code pour grouper)

Sub Plan()
'
' Plan Macro
'

'
    Range(A2).Select
    Selection.End(xlDown).Select
    ActiveCell.Select
    derlignetotal = ActiveCell.Row
    
    Range(A2).Select
    premlignetotal = ActiveCell.Row
    
    For i = premlignetotal To derlignetotal
    
    premligne = premlignetotal
    pligne = 0
    
    For j = premligne To derlignetotal
    If Range("A" & j).Value < 4 Then
    Range("A" & j + 1).Select
    ElseIf Range("A" & j).Value = 4 And pligne = 0 Then
    pligne = j
    Range("A" & j + 1).Select
    ElseIf Range("A" & j).Value = 4 And pligne > 0 Then
    Range("A" & j + 1).Select
    Else: Rows("premligne:j").Select
    Selection.Rows.Group
    End If
    j = j + 1
    Next
    
'    Rows("17:21").Select
'    Selection.Rows.Group
'    Rows("23:23").Select
'    Rows("23:62").Select
'    Selection.Rows.Group
'    Rows("16:16").Select
'    Rows("16:149").Select
'    Selection.Rows.Group
End Sub

J'ai voulu faire une première boucle pour balayer tout le fichier, car je pensais faire ensuite d'autres boucles pour les niveaux 1, 2, 3 et 4. Mais déjà dans la boucle pour le niveau 4, je m'y perds pour savoir comment passer à la ligne suivante et ensuite sélectionner toutes les lignes que je veux grouper.

Je ne sais pas si je sui très claire dans mes explications. Désolée.

0
yg_be Messages postés 23177 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 septembre 2024 1 533 > gbdos Messages postés 65 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 6 septembre 2024
6 sept. 2024 à 09:24

Tout est très clair, pas de souci.

En fait, les boucles for ne conviennent pas du tout pour ce genre de balayage.  Dès que tu as commencé avec une boucle for, tu étais sur une fausse piste.

0