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.

19geolocs.xlsx (176.30 Ko)

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

Rechercher des sujets similaires à "tri autofiltre"