Trier suivant un caractère
Bonjour à toutes et tous,
J'ai récupéré ce bout de code sur internet qui permet de trier des données d'après un caractère.
Mon souci, c'est que les éléments contenant ce caractère sont placés à la fin. Ce que je souhaiterais, c'est qu'ils soient placés au début.
Merci d'avance
Sub TrierSiContientCaractere()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim j As Long
Dim temp As String
Dim charToFind As String
' Définir la feuille de calcul et le caractère à rechercher
Set ws = ThisWorkbook.Sheets("Feuil1")
charToFind = "A" ' Remplacez "A" par le caractère que vous recherchez
' Trouver la dernière ligne utilisée dans la colonne A
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Boucle pour trier les cellules contenant le caractère
For i = 1 To lastRow - 1
For j = i + 1 To lastRow
If InStr(1, ws.Cells(i, 1).Value, charToFind) > 0 And InStr(1, ws.Cells(j, 1).Value, charToFind) = 0 Then
' Échanger les valeurs des cellules
temp = ws.Cells(i, 1).Value
ws.Cells(i, 1).Value = ws.Cells(j, 1).Value
ws.Cells(j, 1).Value = temp
End If
Next j
Next i
End SubBonjour,
Un fichier joint sans données confidentielles, avec le résultat attendu serait souhaitable.
Cdlt
Re, je vous fait ça
Re,
Le fichier est joint :
Dans le premier tableau -> les données telles qu'elles arrivent.
Dans les second tableau -> Ce que je souhaite.
l'ordre de tries :
1. les éléments possédant le caractère "|" doivent être tout en haut.
2. tous les éléments sont regroupés par leur matière (colonne J & U)
3. Au sein des mêmes matières, les éléments sont classés suivant leur dénomination
Voilà, Merci d'avance
Pour trier avec les "|" en première ligne, on peut créer une formule qui permettra de monter ces cellules en haut de la feuille, exemple en colonne K:
=NBCAR(A1)-NBCAR(SUBSTITUE(A1;"|";""))puis appliquer le tri avec comme premier critère cette colonne, c'est pour le tri des autres que je n'ai pas bien compris,
Voici ce que j'ai fait, mais le résultat des matières ne correspond pas à votre 2ème tableau,
Re,
En me creusant les méninges, j'ai fini par réussir. Ci-joint le code qui permet de trier la liste suivant les critères mentionnés précédemment.
Sub Tri()
Worksheets("export").Activate
If Cells(1, Cells(1, Columns.Count).End(xlToLeft).Column - 7) = vbNullString Then ColBloc1 = Cells(1, Cells(1, Columns.Count).End(xlToLeft).Column - 7).Column - 1
ColBloc2 = ActiveSheet.UsedRange.Columns.Count
NbLigBloc1 = Cells(1, ColBloc1 + 1).End(xlDown).Row - 1
NbLigBloc2 = Cells(Rows.Count, "A").End(xlUp).Row
'ColBloc1 = nombre de colonne utilisées pour les caissons
'ColBloc2 = nombre de colonne utilisées pour les pièces
'NbLigBloc1 = nombre de ligne utilisées pour les caissons
'NbLigBloc2 = nombre de ligne utilisiés pour les pièces
For i = 1 To NbLigBloc1
Matière = Cells(i, "J")
For j = i To NbLigBloc1
Matière2 = Cells(j, "J")
If j > i + 1 And Matière = Matière2 Then
Rows(j & ":" & j).Select
Selection.Cut
Rows(i + 1 & ":" & i + 1).Select
Selection.Insert Shift:=xlDown
End If
Next j
Next i
'----------Tri des caissons
For i = NbLigBloc1 + 1 To NbLigBloc2
Matière = Cells(i, "J")
For j = i To NbLigBloc2
Matière2 = Cells(j, "J")
If j > i + 1 And Matière = Matière2 Then
Rows(j & ":" & j).Select
Selection.Cut
Rows(i + 1 & ":" & i + 1).Select
Selection.Insert Shift:=xlDown
End If
Next j
Next i
'----------Tri des matières pièces
For i = NbLigBloc1 + 1 To NbLigBloc2
Dénomination = Cells(i, "A")
Matière = Cells(i, "J")
For j = i To NbLigBloc2
Dénomination2 = Cells(j, "A")
Matière2 = Cells(j, "J")
If j > i + 1 And Dénomination = Dénomination2 And Matière = Matière2 Then
Rows(j & ":" & j).Select
Selection.Cut
Rows(i + 1 & ":" & i + 1).Select
Selection.Insert Shift:=xlDown
End If
Next j
Next i
'----------Tri des dénominations pièces
End Sub