IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri par ordre croissant dans variable tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Tri par ordre croissant dans variable tableau
    Bonjour,

    j'aimerais savoir s'il est possible de trier par ordre croissant les données contenues dans une variable dynamique?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim MaVariableDyn(5) As Integer
    Dim i As Integer
     
    MaVariableDyn(1)=7
    MaVariableDyn(2)=12
    MaVariableDyn(3)=2
    etc...
     
    Trier MaVaraibleDyn...
    Merci de votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonjour
    cet exemple vous montre comment trié un tableau à une dimension avec une fonction personnalisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    Dim MaVariableDyn(6) As Integer
    Dim i As Integer
    MaVariableDyn(1) = 170
    MaVariableDyn(2) = 120
    MaVariableDyn(3) = 26
    MaVariableDyn(4) = 10
    MaVariableDyn(5) = 3
    MaVariableDyn(6) = 1
    Range("A1").Resize(UBound(MaVariableDyn) + 1, 1).Value = Application.Transpose(tabTrie(MaVariableDyn))
    End Sub
    fonction à mettre dans un module stadard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function tabTrie(maVart)
         Dim Debut As Integer, Fin As Integer
          Dim i As Integer, j As Integer
           Dim temp
             Debut = LBound(maVart)
              Fin = UBound(maVart)
               For i = Debut To Fin - 1
                   For j = i To Fin
                     If maVart(i) > maVart(j) Then
                  temp = maVart(j)
               maVart(j) = maVart(i)
             maVart(i) = temp
           End If
         Next j
       Next i
     tabTrie = maVart
    End Function
    Bonne journée.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup,
    Pouvez vous me traduire cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Resize(UBound(MaVariableDyn) + 1, 1).Value = Application.Transpose(tabTrie(MaVariableDyn))
    .resize?
    Transpose?

    Merci !

  4. #4
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bonjour,

    En faite mes données à trier sont de type Variant, par exemple :

    Etc... Comment les triers?

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par l'aide en ligne
    Resize, propriété
    Cette propriété redimensionne la plage spécifiée. Cette propriété renvoie un objet Range qui représente la plage redimensionnée
    J'ai juste fait F1

    Pour le pb de tri, de données Alphanumérique, c'est comme pour les numériques 55 passe avant 6 tout court... Donc, faut formater, au moins jusqu'à la version 2003.
    Le mieux est d'ajouter des espaces avant les nombres et de les retirer après le tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub test()
    'on colle des données pour faire un test
    Dim tablo As Variant, Plage As Range, cel As Range
        tablo = Array("142c", "130h", "25d", "12e", "3d", "1b", "1a", "3b", "6g", "110c")
        Range("A1:A10") = Application.Transpose(tablo)
     
    'La macro :    
        'On travaille sur la plage de données
        'Plage qui se trouvent donc dans la colonne A pour ce test
        Set Plage = Worksheets("feuil1").UsedRange
        'on ajoute quatre espaces à gauche avant de 
        'formater le mot à 4 caractères (voir remarque)
        For Each cel In Plage
            cel = Right("    " & cel, 4)
        Next
        'on tri
        Columns("A:A").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
        'on supprime les espaces
        Columns("A:A").Replace What:=" ", Replacement:="", LookAt:=xlPart
    End Sub
    Juste pour le principe
    Remarque : Pourquoi 4 espaces ? Parce que le plus grand mot du tableau possède 4 caractères. Si le plus grand mot avait 10 caractères, on mettrait 10 espaces à gauche avant de formater à 10 avec Right.
    Bonne soirée

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Rebonjour Ousk,

    Regarde ce que fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     toto = "123A"
     toto = Format(toto, String(10, "@"))
     MsgBox ">>" & toto & "<<"
    A tout hasard ...

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Mais une question : Tu crois que c'est plus simple ?
    C'est surtout plus orthodoxe (tout à la même longueur de caractères et donc pas d'aléas indésirables possibles)

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup,

    Mais ont est obligés de placer les données sur la feuille???

    Mon objectif ce n'est pas de placer mes valeur dans le tableau...

    Mais si vous me dites qu'on à pas le choix...

    Je viens de faire un test et hélàs ce n'est pas exactement ce que j'aurais voulu...

    Mais peut être encore une fois que ce n'est pas réalisable...

    En faite, le tri ne respecte pas l'ordre de grandeur des chiffres...

    Si j'ai :

    "100A, 125Y, 11m, 34, 12"

    Le tri serait :

    "11m, 12, 34, 100A, 125"...

    En faite sa serait un genre de tri qui prendrait en compte de façon prioritaire, les chiffres... Puis les lettre.

    Merci de votre aide.

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Alors trie sur les valeurs ...

    La fonction Val(45abcd) ne te retourne que la valeur 45, par exemple (quelles que soient les lettres qui suivent).
    Te reste plus qu'a faire ton tri sur cette base (par comparaison des Val(....), c'est tout !

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    En effet pas pour faire ce type de "double tri"
    Par contre, la solution que je proposais hier (formatage de tout à la même longueur par ajout d'espaces) marche alors bien

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Tiens, je croyais que c'était mon idée
    Fais gaffe, alzheimer est désormais not' copain
    Non, ousk, non ...
    Tu ajoutais 4 espaces devant à tout, ce qui ne confère pas la même longueur finale à tout ! (entre, par exemple, 23A et 123B ==>> après rajout de 4 espaces aux 2, ils auront pour longueur respective 7 et 8, alors qu'en formatant sur 10 par ce que j'ai exposé, ils auront tous deux une longueur de 10, le 1er avec 7 espaces devant et le second avec 6 espaces devant (ce qui, comme je te l'ai dit plus haut, te met à l'abri de tout aléa indésirable).
    Il est clair que ce formatage doit précéder le tri, si l'on ne veut pas, dans le tri, comparer des carottes et des navets.

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Ouais...
    Ce double tri à la fois sur les nombres et les lettres, si l'on y tient, est plus embêtaznt que l'on ne le pense d'emblée...

    Voilà ma solution ucfoutienne :

    On fait là un petit test en constituant un tableau de test et on se sert (juste pour voir le résultat) d'une listbox (bien évidemment là uniquement pour constater de viisu)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub CommandButton2_Click()
      Dim toto(5) As String, couic As String, i As Integer, j As Integer, titi As String, tata As String
     
      ' on se constitue un tableau d'essai, pour y travailler (il n'est pas trié)
      toto(0) = "170A"
      toto(1) = "28"
      toto(2) = "261CX"
      toto(3) = "261CW"
      toto(4) = "3BBB"
      toto(5) = "1"
     
      ' on met toto à la sauce uctoutfoutu
      For i = 0 To UBound(toto)
        titi = CStr(Val(toto(i)))
        tata = Mid(toto(i), Len(titi) + 1)
        toto(i) = Format(titi, String(8, "@")) & Format(tata, String(8, "%"))
      Next
     
      For i = 0 To UBound(toto) - 1
        For j = i To UBound(toto)
           If toto(i) > toto(j) Then
             couic = toto(j)
             toto(j) = toto(i)
             toto(i) = couic
          End If
        Next j
      Next i
     ' et on fait maintenant le ménage
     For i = 0 To UBound(toto)
       toto(i) = Trim(toto(i))
     Next
     
      ' et là : ce n'est que pour que tu puisses voir que toto a bien été trié comme recherché
      For i = 0 To UBound(toto)
        ListBox1.AddItem Trim(toto(i))
      Next
    End Sub
    Qu'est le format avec % (le 2ème des deux, pas le 1er) ? Ah Ah !!!

    EDIT :
    J'espère que vous avez compris que ce second format n'était qu'une boutade ...
    Il ne sert bien évidemment à rien puisqu'il ne transforme rien ....

    Voilà, tout simplement (on ne garde que le 1er format)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto(i) = Format(titi, String(8, "@")) & tata
    Allez... plaisanterie terminée. On m'attend ...

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Hello UC, tu n'as pas comme une impression de "déjà vu ? (Debug.print pour tester à la place de ta liste mis à part)
    Moi, vois-tu, j'aime bien le confort visuel et l'offre aux autres.

    Et j'oubliais un point : Quid si uniquement lettres ? ===>> facile à modifier....
    Mais quid si l'on considère, en plus, que les lettres (contrairement à la règle établie) sont plus petites que les chiffres ? ==>> A voir ...

    EDIT :
    tu devrais essayer ta méthode avec ce tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo = Array("142c", "130h", "142a", "12e", "3", "1b", "1a", "3b", "6g", "110c")
    La mienne ne se trompe pas ...


  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Autant pour moi, je suis tout confus et, toute honte bue, je supprime mes interventions pour laisser ta réponse.
    Il serait peut-être bien de la placer dans Contribuez, je n'ai jamais vu de solution sur un tri alphanumérique.

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Mais non, Ousk..
    Ne supprime rien car la démarche de ta pensée était intéressante et peut donner des idées...
    Tu sais quelle erreur tu as commise ?
    En me relisant attentivement (pas mon code, mais ce que j'ai dit plus haut à propos de légumes à comparer) , tu devrais la trouver...
    Quant à mettre cela dans les contributions... ? Qui aurait un jour réellement et valablement un tel besoin ? Lorsque l'on en arrive là, cela dénote en général une réflexion fort incomplète avant de "structurer" son appli. ===>> alors non...(pas de contribution pour "rattraper" les inconvénients d'une usine à gaz, car ce serait encourager aux usines de l'espèce...).
    Nous sous sommes un peu divertis, toi et moi, et c'est là l'essentiel.
    Ta pensée, une autre fois, était intéressante, Ousk (crois-moi).

    EDIT :
    Les voilà, les fameux légumes :

    Il est clair que ce formatage doit précéder le tri, si l'on ne veut pas, dans le tri, comparer des carottes et des navets.

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu sais quelle erreur tu as commise ?
    évidemment, sauf que, un tri alpha excusif fonctionnant sans pb, je n'imaginais pas que ce fut une erreur
    Pense à mettre ça dans contribuez
    Bonne soirée

Discussions similaires

  1. Tri par ordre croissant dans des TextBox
    Par neoph dans le forum VB.NET
    Réponses: 6
    Dernier message: 01/12/2012, 18h31
  2. Tri par ordre croissant dans une listview
    Par megamario dans le forum VB.NET
    Réponses: 26
    Dernier message: 09/07/2010, 10h01
  3. Insertion dans un fichier trié par ordre croissant
    Par darkterreur dans le forum Langage
    Réponses: 14
    Dernier message: 20/09/2009, 19h39
  4. Tri par ordre croissant
    Par KinF dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/12/2008, 20h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo