Vba pour Excel macro de tri des lignes

Bonjour,

J'ai crée une macro qui permet a partir d'une feuille utilisateur d'ajour des items. J'ai quatre types d'item :
- A
- B
- C
- D
L'item D une fois généré contient 2 sous item (que j'appellerai D1 et D2)

L'utilisateur ajoutera les items dans un ordre aléatoire. Exemple :

-C
- A
- D
. D1
. D2
- B
- B
-D
.D1
.D2
-A

Je veux donc créer une macro qui permette de trier les items une fois ajoutée dans ma feuille excel de cette facon
- A
- A
- B
- B
- C
- D
.D1
.D2
-D
.D1
.D2

Je ne peux pas utiliser le tri personnalisé d'Excel, car il me donne des résultats de type
-A
-A
-B
-B
-C
-D
-D
-D1
-D1
-D2
-D2

En gros, il ne comprend pas que D1 et D2 sont des "sous ensembles" de D. Quelqu'un a-t-i une idée de code en vba pour trier comme voulu??

Merci d'avance
Configuration: Windows XP
Firefox 3.0.5

6 réponses

  1. Contributeur
    Bonjour,
    Pourrais-tu mettre un classeur sur Cjoint.com avec une feuille qui montre comment les données sont entrées et une feuille avec les données tel que tu voudrais.
    A+
    0
    1. ok le voila: https://www.cjoint.com/?mvlNAwQZjc
      le mieux est que tu ajoutes toi même les items aléatoirements (4 onglets). Tu verras qu'en ajoutant un item de type "Installation Kit" (quatrieme onglet), 2 (ou 3 selon que ce soit In-Roof ou On-Roof) son générés. Je voudrais qu'a la fin (par exemle en cliquant sur le bouton Finish), tous les items en rapport avec le premier onglet (tank) soient classés en premier, puis tous ceux ac l'onglet 2 (panel), etc.. Quelque chose comme ca : https://www.cjoint.com/?mvlN2AugrW

      Merci d'avance
      0
      1. Contributeur
        Je n'ai pas encore toutes les données, si j'ai compris le début ? tu met tous les fichiers PackingChecklist sur une même feuille ? et ensuite tu trie ?
        Sur ton fichier Exemple met sur la feuille 2 un exemple de la liste (non triée) que tu récupère

        0
        1. Contributeur
          Je pense que c'est ça que tu veux...
          Private Sub cbGenerateDN_Click()
          Dim MaxLig As Long, Lig As Long, Col As Integer, IxLig As Integer
              Application.ScreenUpdating = False
              Worksheets("PackingList").Columns("A:b").Copy _
                  Destination:=Worksheets("Delivery Note").Columns("A:b")
              Worksheets("PackingList").Columns("d").Copy _
                  Destination:=Worksheets("Delivery Note").Columns("c")
          
          'Met les sous-item sur la même ligne
              With Sheets("Delivery Note")
                  .Select
                  For Lig = 2 To .Range("B65536").End(xlUp).Row
                      If .Cells(Lig, 2) = "" Then Exit For
                      If .Cells(Lig, 1) = "" Then
                          .Cells(Lig, 2).Copy .Cells(Lig - 1, Col)
                          .Cells(Lig, 3).Copy .Cells(Lig - 1, Col + 1)
                          .Rows(Lig).Delete
                          Col = Col + 2: Lig = Lig - 1
                      Else
                          Col = 4
                      End If
                  Next Lig
          'Trier la liste.
              .Range("B2").Select
              Selection.Sort Key1:=.Range("B2"), Order1:=xlAscending, Header:=xlYes, _
                  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
          'Renumérote les lignes.
              For Lig = 2 To .Range("B65536").End(xlUp).Row
                  .Cells(Lig, 1) = Lig - 1
              Next Lig
          'Remettre les sous-item.
                  Col = 4: MaxLig = .Range("D65536").End(xlUp).Row: IxLig = 1
                  For Lig = MaxLig To 2 Step -1
                      If .Cells(Lig, 4) <> "" Then
                          While Cells(Lig, Col) <> ""
                              .Rows(Lig + IxLig).Insert
                              Cells(Lig, Col).Copy .Cells(Lig + IxLig, 2)
                              Cells(Lig, Col + 1).Copy .Cells(Lig + IxLig, 3)
                              Col = Col + 2: IxLig = IxLig + 1
                          Wend
                          Col = 4: IxLig = 1
                      End If
                  Next Lig
                  MaxLig = .Range("D65536").End(xlUp).Row
                  .Range(Cells(1, 4), Cells(MaxLig, 8)).Clear
              End With
              Application.ScreenUpdating = True
          
          End Sub
          

          J'ai prévu 5 sous-item maximum, ça suffit ?
          Tu dit..
          A+
          0
          1. salut lermitte22; merci pour ta réponse j'ai essayé ton code mais ca ne marche pas. Voilà le résultat que ca donne :

            https://www.cjoint.com/?bjkbc6ATnR

            Dans la feuille Packing List, tu verras l'ordre dans lequel j'ai ajouté les items, dans la feuille Delivery Note ce que ca donne quand je trie avec ton code.

            Tu trouveras ici le résultat que je recherche :

            https://www.cjoint.com/?bjkdfPYPLp

            Merci d'avance
            0