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 :

Trier une variable tableau à 2 dimensions en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 863
    Points : 583
    Points
    583
    Par défaut Trier une variable tableau à 2 dimensions en VBA
    Bonjour,

    Comment pourrais-je trier une variable tableau à 2 dimensions en VBA (tri sur une seule dimension)

    Remerciements

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 354
    Points
    34 354
    Par défaut
    Salut,
    En cherchant 5 secondes dans le menu recherche je trouve ceci :
    http://silkyroad.developpez.com/vba/tableaux/#LXIV-D

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 140
    Points : 9 975
    Points
    9 975
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    copié de l'un de mes projets

    tire de l'excellent site de J. BoisGontier : http://boisgontierjacques.free.fr/

    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
    ' 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 (JBGontier)
    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


    Et l'un des appels que j'effectue
    Le tableau à trier est ici la plage de données présentent dans un ListBox, via un Combobox qui permet de choisir la colonne à trier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ComboBox_TRI_Change()
    Dim a()
        With Me
            If .ComboBox_TRI.ListIndex = -1 Then Exit Sub
            a = .ListBox1.List
            NbCol = .ListBox1.ColumnCount
            Call tri(a(), LBound(a), UBound(a), NbCol, .ComboBox_TRI.ListIndex + 1)
            .ListBox1.List = a
        End With
    End Sub

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 863
    Points : 583
    Points
    583
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,
    En cherchant 5 secondes dans le menu recherche je trouve ceci :
    http://silkyroad.developpez.com/vba/tableaux/#LXIV-D
    J'avais cherché plus de 5 minutes et avais trouvé cet article mais c'est pour un tableau à une dimension.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 863
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 863
    Points : 583
    Points
    583
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    copié de l'un de mes projets

    tire de l'excellent site de J. BoisGontier : http://boisgontierjacques.free.fr/

    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
    ' 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 (JBGontier)
    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


    Et l'un des appels que j'effectue
    Le tableau à trier est ici la plage de données présentent dans un ListBox, via un Combobox qui permet de choisir la colonne à trier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ComboBox_TRI_Change()
    Dim a()
        With Me
            If .ComboBox_TRI.ListIndex = -1 Then Exit Sub
            a = .ListBox1.List
            NbCol = .ListBox1.ColumnCount
            Call tri(a(), LBound(a), UBound(a), NbCol, .ComboBox_TRI.ListIndex + 1)
            .ListBox1.List = a
        End With
    End Sub
    Merci mais n'est-ce pas pour un tableau dans une feuille Excel ?

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 140
    Points : 9 975
    Points
    9 975
    Billets dans le blog
    5
    Par défaut
    Vois-tu l'ombre d'une feuille, d'un range, d'un cells dans ces codes ?

    c'est uniquement un tableau VBA qui est utilisé ici

    1) création d'un tableau en puisant les données d'un listbox (le .List)
    2) envoi du tableau à la fonction de tri, en indiquant les paramètres souhaités
    3) la fonction trie le tableau et rend la main à la procédure appelante
    4) la procédure appelante injecte le tableau dans listbox, qui vient donc remplacer le précédent agencement des données

    et si on veut en fait réaliser ce travail sur une plage de données d'une feuille excel, il suffit de modifier l'étape 1 (on récolte une plage de données excel) et 4 (on restitue les éléments dans la feuille excel). Ce qui fait que toute la partie technique du tri n'est pas impactée.
    ==> mais trier une plage excel, autant utiliser les outils dédiés : voir l'aide VBA au sujet de "Sort"

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 354
    Points
    34 354
    Par défaut
    Citation Envoyé par Daejung Voir le message
    J'avais cherché plus de 5 minutes et avais trouvé cet article mais c'est pour un tableau à une dimension.
    Ne poussons pas Mémé dans les orties, tu nous indiques vouloir un tri sur une dimension

    Pour trier la seconde colonne, on fait un peu travailler son esprit logique, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 0 To UBound(Tableau) - 1
                If Tableau(i) < Tableau(i + 1) Then
                    Cible = Tableau(i)
                    Tableau(i) = Tableau(i + 1)
                    Tableau(i + 1) = Cible
                    Valeur = 1
                End If
            Next i
    se transformera en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For i = 0 To UBound(Tableau,0) - 1
                If Tableau(i,0) < Tableau(i + 1,0) Then
                    Cible = Tableau(i,0)
                    Tableau(i,0) = Tableau(i + 1,0)
                    Tableau(i + 1,0) = Cible
                    Cible = Tableau(i,1)
                    Tableau(i,1) = Tableau(i + 1,1)
                    Tableau(i + 1,1) = Cible
                    Valeur = 1
                End If
            Next i
    a adapter evidemment a ton cas de figure.

    Nous pouvons t'expliquer comment pecher, mais il n'est pas admis de demander a ce qu'on peche pour toi :-]

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Comparaison d'un tri multi-colonnes indexé et non indexé.

    Pour un Array 36.000 lignes et 10 colonnes, le temps d'un tri indexé est 3 fois inférieur à celui d'un tri non indexé (0,4 sec au lieu de 1,2 sec)

    PSans le fichier joint, il y a seulement 8.000 lignes.

    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
     
    Dim f, ListeVille()
    Private Sub UserForm_Initialize()
      '--villes +codes postaux
      ListeVille = Range("bdd").Value
      Me.ComboVille.List = ListeVille
      '-- inversion des colonnes 1,2 pour un tri par code postal
      b = Application.index([bdd], Evaluate("Row(1:" & [bdd].Rows.Count & ")"), Array(2, 1, 3, 4, 5, 6, 7, 8, 9, 10))
      TriTableauIndex b       ' + rapide
      Me.CodePostal.List = b
    End Sub
     
     
    Sub TriTableauIndex(b)
      Dim Tmp(): ReDim Tmp(LBound(b) To UBound(b), LBound(b, 2) To UBound(b, 2))
      Dim clé() As String: ReDim clé(LBound(b) To UBound(b))
      Dim index() As Long: ReDim index(LBound(b) To UBound(b, 1))
      For i = LBound(b) To UBound(b)
        clé(i) = b(i, 1): index(i) = i
      Next i
      TriIndex clé(), index(), LBound(b), UBound(clé)
      For lig = LBound(clé) To UBound(clé)
         For col = LBound(b, 2) To UBound(b, 2): Tmp(lig, col) = b(index(lig), col): Next col
      Next lig
      b = Tmp
    End Sub
     
    Sub TriIndex(clé() As String, index() As Long, gauc, droi) ' Quick sort
      ref = clé((gauc + droi) \ 2)
      g = gauc: d = droi
      Do
        Do While clé(g) < ref: g = g + 1: Loop
        Do While ref < clé(d): d = d - 1: Loop
        If g <= d Then
          temp = clé(g): clé(g) = clé(d): clé(d) = temp
          temp = index(g): index(g) = index(d): index(d) = temp
          g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then TriIndex clé, index, g, droi
      If gauc < d Then TriIndex clé, index, gauc, d
    End Sub
    Boisgontier


    PS: Eviter d'utiliser le tri bubble. Pour trier 36.000 items, il faudrait plusieurs heures.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. trier une variable de Type Array a deux dimension
    Par boboss123 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/03/2010, 18h12
  2. Trier tout un tableau à 2 dimensions en ne tenant compte les valeurs d'une colonne
    Par UrSuS AmErIcAnUs dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 17/03/2008, 16h20
  3. [VBA-E] Supprimer des lignes à partir d'une variable tableau
    Par humbp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/02/2008, 09h09
  4. [VBA-E] Comment accéder à une variable tableau située dans un autre module
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/02/2007, 14h15
  5. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 18h50

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