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. 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
    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. 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. 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
            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