Vba pour Excel macro de tri des lignes

rouzb Messages postés 4 Statut Membre -  
lermite222 Messages postés 9042 Statut Contributeur -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. rouzb
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. rouzb
     
    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