|
|
|
|
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
Bonjour,
|
Ok le voila: http://cjoint.com/?mvlNAwQZjc
|
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 ?
|
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+ L'expérience instruit plus sûrement que le conseil. (André Gide) Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius) |
Salut lermitte22; merci pour ta réponse j'ai essayé ton code mais ca ne marche pas. Voilà le résultat que ca donne :
|
Et comme ça ?
|