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 :

VBA Tri Tableau 2 dimensions - variant et classement valeurs numériques [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juin 2023
    Messages : 5
    Par défaut VBA Tri Tableau 2 dimensions - variant et classement valeurs numériques
    Bonjour à toutes et à tous,
    Je suis autodidacte en VBA et je souhaiterais avoir une réponse sur le tri d'un tableau à deux dimensions comportant 4 lignes et trois colonnes. Je n'ai pas trouvé malgré mes recherches, mais peut-être que je ne sais pas où bien chercher.
    Tout d'abord, rendons à César ce qui est à César : je me suis inspiré très fortement d'un code donné par M. Boisgontier et j'ai utilisé le "QuickSort", et j'ai aussi parcouru ce site.
    Voici mon tableau initial :

    toto 50 Z
    nono 30 C
    dada 10 M
    titi 4 F

    lorsque je tri sur la seconde colonne, j'obtiens :

    dada 10 M
    nono 30 C
    titi 4 F
    toto 50 Z

    Je ne comprends plus... Le tri sur les autres colonnes donne le résultat escompté mais pas sur la seconde, et je sèche : c'est comme si excel ne prenait que le premier chiffre en compte.
    A quoi est-ce dû ? Comment obtenir un tri qui donnerait le résultat suivant :

    titi 4 F
    dada 10 M
    nono 30 C
    toto 50 Z

    Petite précision : le tableau va alimenter une listbox.

    Merci par avance pour vos réponses et contributions.


    Je mets le code :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    ' TRI D'UN ARRAY 2D via la colonne N°colTri
    ' a() = le tableau à trier
    ' gauc = indice bas du tableau
    ' droi = indice haut du tableau
    ' colTri = la colonne sur laquelle on effectue le tri
    ' http://boisgontierjacques.free.fr/
     
    Sub tri(a(), gauc, droi, NbCol, colTri)        ' Quick sort (Jacques Boisgontier)
        ref = a((gauc + droi) \ 2, colTri)
        g = gauc: D = droi
            Do
                Do While a(g, colTri) < ref: g = g + 1: Loop
                Do While ref < a(D, colTri): D = D - 1: Loop
                If g <= D Then
                    For C = 0 To NbCol - 1
                        temp = a(g, C): a(g, C) = a(D, C): a(D, C) = temp
                    Next
     
                    g = g + 1: D = D - 1
                End If
            Loop While g <= D
     
            If g < droi Then Call tri(a, g, droi, NbCol, colTri)
            If gauc < D Then Call tri(a, gauc, D, NbCol, colTri)
    End Sub
     
    Private Sub UserForm_Initialize()
     
        Dim tableau(4, 3) As Variant  'tableau(x,y) à deux dimensions, x lignes et y colonnes
        Dim i As Integer
     
        tableau(0, 1) = "toto"
        tableau(1, 1) = "nono"
        tableau(2, 1) = "dada"
        tableau(3, 1) = "titi"
        tableau(0, 2) = 50
        tableau(1, 2) = 30
        tableau(2, 2) = 10
        tableau(3, 2) = 4
        tableau(0, 3) = "Z"
        tableau(1, 3) = "C"
        tableau(2, 3) = "M"
        tableau(3, 3) = "F"
     
        For i = 0 To 3
            Me.ListBox1.ColumnCount = 3
            Me.ListBox1.ColumnWidths = "30;30;30"
            Me.ListBox1.AddItem
            Me.ListBox1.Column(0, i) = tableau(i, 1)
            Me.ListBox1.Column(1, i) = tableau(i, 2)
            Me.ListBox1.Column(2, i) = tableau(i, 3)
        Next
     
    End Sub
     
    Private Sub btntri_Click()
        Dim a()
        With Me
            a = .ListBox1.List
            NbCol = .ListBox1.ColumnCount
            Call tri(a(), LBound(a), UBound(a), NbCol, 1)
            .ListBox1.List = a
        End With
    End Sub
    Et je joins un petit fichier en plus :
    test.xlsm

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 009
    Par défaut
    Bonjour,
    D'après ce que j'ai compris du code, vous alimentez les données numériques dans un "Listbox" qui les transforme automatiquement en texte, puisque par définition c'est une liste de caractères, donc lors de votre tri avec QS les données entrées sont des chaînes de caractères et pas des nombres donc QS traite 4 > 10 puisque 4 est supérieur à 1 dans du texte.
    Il faudrait faire une conversion de vos textes en numériques avant de lancer QS.
    Cordialement

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    975
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 975
    Par défaut
    Bonjour, Laurent t'a mis sur la bonne piste, j'ai modifié ta macro en conséquence et elle fonctionne mais je ne vais pas te la donner tout de suite et te laisser un peu chercher par toi-même.
    Si tu ne t'en sors vraiment pas, dis-le et je te la donnerai volontiers.

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juin 2023
    Messages : 5
    Par défaut
    Merci à vous deux pour les pistes !!
    J'essaye et si je ne trouve pas j'appelle à l'aide.

    Bonne journée

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juin 2023
    Messages : 5
    Par défaut
    Merci à Laurent_ott et à Franc,
    j'ai eu réponse à ma question et résolu mon problème.
    Je reviendrai sans doute bientôt pour d'autres questions.

    voici la soluce (modifications à faire uniquement dans la sub btntri_Click()):

    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
     
    Private Sub btntri_Click()
        Dim a()
        Dim myValeur As Integer
     
        With UserForm1
            a = .ListBox1.List
            NbCol = .ListBox1.ColumnCount
     
            'Conversion des données texte en integer (2de colonne)
            For i = 0 To 3
                myValeur = CInt(a(i, 1))
                a(i, 1) = myValeur
            Next
     
            Call tri(a(), LBound(a), UBound(a), NbCol, 1)
            .ListBox1.List = a
        End With
    End Sub
    Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri tableau deux dimensions
    Par charliemtx dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/07/2013, 16h17
  2. [PHP 5.1] tri tableau plusieurs dimensions
    Par viny dans le forum Langage
    Réponses: 2
    Dernier message: 02/07/2013, 18h55
  3. tri tableau à 2 dimensions
    Par pfovez dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 22/12/2008, 14h51
  4. Tri tableau 2 dimensions
    Par mmb04 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/11/2007, 09h39
  5. [langage] [debutant] tri tableau deux dimensions
    Par labbyjoel dans le forum Langage
    Réponses: 4
    Dernier message: 07/11/2006, 18h38

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