Vba pour Excel macro de tri des lignes

Fermé
rouzb Messages postés 4 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 19 décembre 2008 - 19 déc. 2008 à 12:41
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 9 janv. 2009 à 13:49
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

6 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 déc. 2008 à 12:52
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
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
21 déc. 2008 à 13:13
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
22 déc. 2008 à 07:28
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
9 janv. 2009 à 13:49
0