Tri numérique par ordre croissant à l'intérieur d'une cellule

Résolu/Fermé
Utilisateurmacroexcel Messages postés 3 Date d'inscription vendredi 6 mai 2016 Statut Membre Dernière intervention 6 mai 2016 - 6 mai 2016 à 10:57
Utilisateurmacroexcel Messages postés 3 Date d'inscription vendredi 6 mai 2016 Statut Membre Dernière intervention 6 mai 2016 - 6 mai 2016 à 15:30
Bonjour, voici mon problème pour lequel j'ai besoin de votre aide. Il me manque un bout de macro VBA. Voici ce que je veux faire:
Dans une colonne j'ai environ 1000 lignes avec une série de chiffres allant de 1 à 7 dans chaque cellule. Ces listes numériques ont été obtenues par concaténation et ne sont pas forcément dan l'ordre dans chaque cellule indépendamment. Exemple:
532
1653
7162435 etc....
Savez-vous comment trier chaque cellule indépendamment par macro ?
L'objectif dans l'exemple plus haut est d'obtenir:
235
1356
1234567 à l'intérieur de chacune des cellules.
J'espère être suffisamment clair.
Merci d'avance pour vos lumières !!!
A voir également:

4 réponses

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
Modifié par Frenchie83 le 6/05/2016 à 14:42
Bonjour
Essayez ceci, les valeurs sont dans la colonne A à partir de la ligne 1
Sub TriCellules()
    Application.ScreenUpdating = False
    On Error Resume Next
    DerLig = [A100000].End(xlUp).Row
    For i = 1 To DerLig
        Mot = Cells(i, 1)
        NbrCar = Len(Mot)
        For K = 1 To NbrCar
            A = 1
            B = 2
            For j = 1 To NbrCar
                Deb = Left(Mot, A - 1)
                Fin = Right(Mot, NbrCar - B)
                ValA = Mid(Mot, A, 1)
                ValB = Mid(Mot, B, 1)
                If ValB < ValA Then
                    Temp = ValA
                    ValA = ValB
                    Mot = Deb & ValA & Temp & Fin
                End If
                A = B
                B = B + 1
                If B > NbrCar Then GoTo Suivant1
            Next j
Suivant1:
        Next K
Suivant:
        Cells(i, 1) = Mot
    Next i
End Sub

Cdlt
0
Utilisateurmacroexcel Messages postés 3 Date d'inscription vendredi 6 mai 2016 Statut Membre Dernière intervention 6 mai 2016
6 mai 2016 à 15:28
Bonjour Frenchie,

C'est exactement ce qu'il me fallait, cela correspond totalement à mon besoin et ça fonctionne !

Merci beaucoup.

Cordialement.
0
Utilisateur anonyme
6 mai 2016 à 14:34
Bonjour,

Comme tu ne l'as pas indiqué, je fais cette supposition :
ta première chaîne numérique est en B2.

Le code VBA ci-dessous fait ce que tu demandes pour
ces 2 autres suppositions :

1) Un chiffre n'apparaît qu'une seule fois dans une série
(donc PAS de répétition du même chiffre).

2) La longueur de la série est de 7 chiffres maximum
(quand chacun des chiffres y est présent).

============================================

ATTENTION

Si ces 2 suppositions ne sont pas correctes,
alors le code VBA n'est PAS VALABLE !

-------------------------------------------------------------------------------

Dans ce cas, tu dois répondre à ceci :

a) Est-ce que la longueur d'une série peut dépasser 7 caractères ?
Note que dans ce cas, un même chiffre est forcément répété.

b) Est-ce qu'un même chiffre peut être répété, avec en même temps
une longueur de série maximum de 7 caractères ?

============================================

Voici le code VBA pour les suppositions 1) et 2) :


Option Explicit

Sub TriChaînes()
  Dim chn1 As String, chn2 As String, dv As Long, i As Byte
  Application.ScreenUpdating = False: ActiveSheet.Unprotect
  With [B2]
    Do While Not IsEmpty(.Offset(dv))
      chn1 = .Offset(dv): chn2 = ""
      For i = 49 To 55
        If InStr(chn1, Chr$(i)) > 0 Then chn2 = chn2 & i - 48
      Next i
      .Offset(dv, 1) = chn2: dv = dv + 1
    Loop
  End With
  ActiveSheet.Protect
End Sub



Cordialement.  😊
 
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
6 mai 2016 à 14:50
Bonjour,

Essaie le code ci-dessous (la plage PL est à adapter à ton cas) fait de deux procédures :

Sub Macro1()
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim L As Byte 'déclare la variable L (Longueur)
Dim TC() As Variant 'déclare la variable TC (Tableau des Chiffres)
Dim I As Byte 'déclare la variable I (Incrément)
Dim V As String 'déclare la variable V (Valeur)

Set PL = Range("A1:A" & Range("A" & Application.Rows.Count).End(xlUp).Row) 'définit la plage PL (à adapter à ton cas)
For Each CEL In PL 'boucle 1 : sur toutes les cellules CEL de la plage PL
    L = Len(CEL.Value) 'definit la longueur L
    ReDim Preserve TC(1 To L) 'redimensionne le tableau des chiffres TC
    For I = 1 To L 'boucle 2 : sur tous les chiffres de la cellue CEL
        TC(I) = Mid(CEL.Value, I, 1) 'récupère dans le tableau TC le chiffre de la boucle
    Next I 'prochain chiffre de la boucle (le nombre est maintenant stocké dans un tableau de L chiffres)
    Call tri(TC, LBound(TC), UBound(TC)) 'lance la procédure de tri du tableau TC
    For I = 1 To L 'boucle 3 : sur tous les chiffres du tableau TC
        V = IIf(V = "", TC(I), V & TC(I)) 'revoie les chiffres triés dans la valeur V les uns après les autres
    Next I 'prochain chiffre de la boucle 3
    CEL.Value = CLng(V) 'renvoie dans la cellue CEL la valeur V convertie en données de type Long
    V = "" 'vide V
    Erase TC 'vide le tableau des chiffres TC
Next CEL 'prochaine cellule de la boucle
End Sub

Sub tri(a, gauc, droi) ' Quick sort tiré du site de Jacques BOISGONTIER : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

0
Utilisateurmacroexcel Messages postés 3 Date d'inscription vendredi 6 mai 2016 Statut Membre Dernière intervention 6 mai 2016
6 mai 2016 à 15:30
Bonjour à tous,

Merci pour votre rapidité et votre efficacité. J'ai pu adapter vos macros à mon fichier. Cela fonctionne parfaitement.

Merci encore, ce problème est résolu pour moi.

Cordialement.
0