Tri après un Autofiltre
Bonsoir à tous.
Pourriez-vous m'éclairer à propos d'un tri que je ne parviens pas à réaliser ?
J'ai beau fouiner sur le net, je ne comprends pas ce qui ne va pas.
J'ai bien sûr utilisé l'enregistreur de macros, mais je ne parviens pas à isoler ce qui est du déchet de ce qui est utile.
Le but de ma macro est de faire un tri numérique sur une colonne comportant des valeurs composées d'un ou deux caractères alphas suivi(s) d'un, deux, trois ou quatre caractères numériques.
Exemple: C1 - R34 - D3 - C65 - IC345 - R76 - C876 - C1067 - C2 etc...
Le but est de trier toutes les valeurs par famille: tous les Cxxx ensemble, tous les Rxxx ensemble, tous les ICxxx ensemble etc...
Le problème des tris c'est que je me retrouve avec C1 puis C1067 puis C2 etc... au lieu de C1 C2 C1067 etc...
J'ai donc décidé de séparer la partie alpha de la partie numérique puis de filtrer par familles.
Ainsi j'applique mon autofiltre pour isoler la première "famille" (les Cxxx par exemple) puis je trie la partie numérique de ces Cxxx pour avoir, ce coup-ci, un vrai tri croissant.
Ensuite, je n'ai plus qu'à copier coller le résultat de ce tri dans une autre feuille et refaire la même manip pour chaque famille en changeant la valeur dans l'autofiltre.
Je ne parviens pas à faire ce maudit tri !
J'ai tenté un paquet d'essais et chaque fois j'ai une erreur 1004.
Je ne comprends pas ce qui ne va pas.
Voici le code (non finalisé):
Public Sub TriEDI()
' Macro qui permet de classer tous les EDI dans l'ordre alphanumérique
Dim i, j, k, iColonne, iLine, iLineEDI, iLineTri, iLineDoublons As Integer
Dim EDIFull, EDIAlpha, EDINum, ValFiltr As String
iColonne = Application.ActiveWorkbook.Worksheets("CSN-EDES").UsedRange.Columns.Count
iLine = Application.ActiveWorkbook.Worksheets("CSN-EDES").UsedRange.Rows.Count
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("G1").Value = "Code RDI"
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("H1").Value = "NumEDI"
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("I1").Value = "LOCATOR"
For i = 2 To iLine
EDIFull = Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("E" & i).Value
EDIAlpha = ""
For j = 1 To Len(EDIFull)
If IsNumeric(Mid(EDIFull, j, 1)) Then
EDIFull = Mid(EDIFull, j)
Exit For
Else: EDIAlpha = EDIAlpha & Mid(EDIFull, j, 1)
End If
Next
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("G" & i).Value = EDIAlpha
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("H" & i).Value = EDIFull
Next
Application.ActiveWorkbook.Worksheets("CSN-EDES").Rows(1).AutoFilter
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("A1:I1").AutoFilter
Application.ActiveWorkbook.Worksheets.Add.Name = "Doublons"
Application.ActiveWorkbook.Worksheets("CSN-EDES").Columns("G").Copy Destination:=Application.ActiveWorkbook.Worksheets("Doublons").Range("A1")
Application.ActiveWorkbook.Worksheets("Doublons").Range("A1").AutoFilter
Application.ActiveWorkbook.Worksheets("Doublons").UsedRange.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
iLineDoublons = Application.ActiveWorkbook.Worksheets("Doublons").UsedRange.Rows.Count
'Application.ActiveWorkbook.Worksheets("Doublons").UsedRange.Copy Destination:=Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("K1")
Application.ActiveWorkbook.Worksheets("Doublons").UsedRange.Copy Destination:=Application.ActiveWorkbook.Worksheets("Doublons").Range("A" & iLineDoublons + 1)
Application.ActiveWorkbook.Worksheets("Doublons").Rows("1:" & iLineDoublons).Delete
Application.ActiveWorkbook.Worksheets("Doublons").Rows(1).AutoFilter
Application.ActiveWorkbook.Worksheets("Doublons").Columns("A").Delete
iLineEDI = Application.ActiveWorkbook.Worksheets("Doublons").Range("A1").CurrentRegion.Rows.Count
For k = 2 To iLineEDI
ValFiltr = Application.ActiveWorkbook.Worksheets("Doublons").Range("A" & (iLineEDI - (iLineEDI - k))).Value
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("G2:G" & iLine).AutoFilter Field:=7, Criteria1:=ValFiltr
'iLineTri = Application.ActiveWorkbook.Worksheets("CSN-EDES").UsedRange.Rows.Count
Application.ActiveWorkbook.Worksheets("CSN-EDES").UsedRange.Select
'Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("A1:K749").Sort Key1:=Range("H1:H749"), Order1:=xlAscending, Header1:=xlYes
'Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("A2:K749").Sort Key1:=Range("H2"), Order1:=xlAscending, Header1:=xlYes
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("H2:H749").Sort Key1:=Range("H1"), Order1:=xlAscending, Header1:=xlYes
Next
Application.ActiveWorkbook.Worksheets("CSN-EDES").Range("G2:G" & iLine).RemoveDuplicates Columns:=Array(11), Header:=xlNo
'Application.ActiveWorkbook.Worksheets("CSN-EDES").UsedRange.Sort Key1:=Range("H2"), Order1:=xlAscending
End Sub
Je sais que "Application.ActiveWorkbook.Worksheets("CSN-EDES")" pourrait être remplacer par une constante réutilisable et je sais aussi que je suis assez débutant, donc puissiez-vous être indulgent sur ma façon d'écrire.
J'avoue aussi avoir utilisé l'enregistreur de macro pour la suppression des doublons car je n'ai pas réussi à trouver la bonne méthode.
Je crise de passer des heures pour un pauvre tri et je ne veux pas me résoudre à copier bêtement les lignes de l'enregistreur.
Si j'ai bien compris comment faire "un sort", on définit la range qui n'est ni plus ni moins que la sélection étendue et donc la usedrange de ma feuille (une fois l'autofilter appliqué) puis on écrit la méthode sort avec en key1 la range, la colonne que l'on veut trier ?
On ne peut pas remplacer ces range par des Columns ?
Merci d'avance pour vos remarques et conseils.
Cordialement.
Bonjour
A vérifier si j'ai compris quelque chose
Option Explicit
Public Sub TriEDI()
' Macro qui permet de classer tous les EDI dans l'ordre alphanumérique
Dim Ws As Worksheet, Nblg As Long, J As Long, I As Integer
Dim EDIFull As String, EDIAlpha As String
Application.ScreenUpdating = False
Set Ws = Sheets("CSN-EDES")
Nblg = Ws.Range("A" & Rows.Count).End(xlUp).Row
For J = 2 To Nblg
EDIFull = Ws.Range("E" & J).Value
EDIAlpha = ""
For I = 1 To Len(EDIFull)
If IsNumeric(Mid(EDIFull, I, 1)) Then
EDIFull = Mid(EDIFull, I)
Exit For
Else
EDIAlpha = EDIAlpha & Mid(EDIFull, I, 1)
End If
Next
Ws.Range("G" & J).Value = EDIAlpha
Ws.Range("H" & J).Value = EDIFull
Next J
Ws.Range("A2:H" & Nblg).Sort Key1:=Ws.Range("G2"), Order1:=xlAscending, dataoption1:=xlSortNormal, _
Key2:=Ws.Range("H2"), Order1:=xlAscending, dataoption1:=xlSortNormal, Header:=xlNo
Ws.Columns("G:H").ClearContents
End Sub
Bonjour Banzaï64.
Toujours à la rescousse et toujours aussi efficace.
Aussi incroyable que cela puisse paraître, je ne parvenais pas à faire ce tri.
Pour le coup, j'ai supprimé le tri de la colonne G2 puisque je filtre d'abord la colonne G pour n'avoir que les C ensuite seulement, je trie la colonne H.
Et je refais la même manip avec un filtrage pour tous les DS (par exemple) et j'effectue un tri sur la colonne H pour avoir tous mes DS1, DS2 DS16 dans l'ordre croissant.
Merci pour tout.
Bonne journée à Jurançon...