Tri dans tableau mémoire VBA

Bonsoir,

Je rencontre un problème de trier dans une variable tableau à deux dimensions : Range("A1:B4"). Voici la situation de départ :

A B

4 f

2 r

1 f

3 d

Voici le résultat vsouhaité :

A B

1 f

2 r

3 d

4 f

Lorsque j'ai déclaré et trié le tableau avec une seule dimension (Colonne A) tout va bien quand je lance la vérif , le trie se fait :

Sub Tri_Tableau_crois()
    Dim Valeur As Integer
    Dim i As Integer
    Dim Cible As Variant
    Dim tableau() As Single

    'Remplissage tableau avec la plage de cellules A1:A4
    ReDim tableau(0 To 3)
    For i = 0 To UBound(tableau())
        tableau(i) = Cells(i + 1, 1)
    Next i

    Do     'tri croissant
        Valeur = 1

        For i = 0 To UBound(tableau) - 1
            If tableau(i + 1) < tableau(i) Then
                Cible = tableau(i + 1)
                tableau(i + 1) = tableau(i)
                tableau(i) = Cible
                Valeur = 0
            End If
        Next i
    Loop While Valeur = 0

    'vérification du tri croissant
    Range("C1") = tableau(2)
End Sub

Mais je n'arrive pas à trier l'ensemble du tableau avec les deux dimensions (A et B) sur la base de la Colonne A (Comme expliqué ci-haut dans résultat souhaité) !

Merci de m'aider :)

Bonjour cameleon1881

Concernant les tableaux et les tris, tu pourras trouver ton bonheur sur le site de notre regretté BOISGONTIER
http://boisgontierj.free.fr/

Voici un exemple de code

Option Compare Text
Sub TriTableau2D()
  Dim a()
  a = [A2:B6].Value  ' Tableau 2D
  Tri a(), 1, LBound(a, 1), UBound(a, 1)
  [D2].Resize(UBound(a, 1), UBound(a, 2)).Value2 = a
End Sub

Sub Tri(a(), ColTri, gauc, droi) ' Quick sort
  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 k = LBound(a, 2) To UBound(a, 2)
         temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
       Next k
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, ColTri, g, droi)
  If gauc < d Then Call Tri(a, ColTri, gauc, d)
End Sub

A+

bonjour,

Est-ce que vous avez excel 2021-365 ? Alors, trier avec un clé est possible.

Sub trier()
     a = Application.Sort(Range("A1:B4").Value, 1)
     Range("D1").Resize(UBound(a), UBound(a, 2)).Value = a
End Sub

Bonjour,

simple et efficace, mais cela ne prend que l'ordre croissant ? Je comprend que le "1" correspond à la première colonne de la plage est ce bien cela

@ bientôt

LouReeD

Bonjour BsAlv, merci pour votre réponse :)

Non j'ai Office 2016 en fait

Bonjour LouReeD, Merci pour votre réponse :)

Non ça fonctionne aussi pour un tri décroisssant :

 Do 'tri décroissant
        Valeur = 0

        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
    Loop While Valeur = 1

Mon problème c'est comment inclure la deuxième colonne dans le tri. Si j'ai :

A ---------------- B

7 -----------------b

2 -----------------a

ça devient :

A ----------------B

2 ----------------a

7 ----------------b

En bref le tri a fonctionné avec une seule dimension mais pas avec deux dimension ...

Bonjour

Et ma réponse est zappée 🤔😕

Bonjour Bruno,

Non pas du tout je suis en train d'essayer de la comprendre ... je trouve celle que j'ai commencé à utiliser est plus facile ... le problème c'est que dans un tri décroissant ça fonctionne pour les deux colonnes :

Do 'tri décroissant
        Valeur = 0

        For i = 0 To UBound(tableau) - 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
                Cible2 = tableau(i, 1)
                tableau(i, 1) = tableau(i + 1, 1)
                tableau(i + 1, 1) = Cible2
                Valeur = 1
            End If
        Next i
    Loop While Valeur = 1

Mais dans le tri croissant non ! :

Do 'tri croissant
        Valeur = 1

        For i = 0 To UBound(tableau) - 1
            If tableau(i + 1, 0) < tableau(i, 0) Then
                Cible = tableau(i + 1, 0)
                tableau(i + 1, 0) = tableau(i, 0)
                tableau(i, 0) = Cible
                Cible2 = tableau(i + 1, 1)
                tableau(i + 1, 1) = tableau(i, 1)
                tableau(i, 1) = Cible2
                Valeur = 0
            End If
        Next i
    Loop While Valeur = 0

pourtant pour ce dernier code j'ai fait la même chose que pour le premier : j'ai rajouté Cible2 et c'est tout ... le tri est fait mais la ligne ciblée n'est pas la même ... je ne sais pas si j'ai été clair ?

Bah voilà, pour le tri croissant et en remplaçant :

For i = 0 To UBound(tableau) - 1

par

For i = 0 To UBound(tableau) - 2

ça a fonctionné pour les deux dimensions. J'ai la lettre voulue devant le chiffre comme dans le tableau de départ.

mais je ne sais pas pourquoi j'ai bricolé et c'est tout !

@LouReed

le 2ième parametre est, vous avez raison, la colonne.

le 3ième parametre de "application.sort" est optional, standard =1 (ordre croissant) ou autrement -1 (ordre descendant)

a = Application.Sort(Range("A1:B4").Value, 1,-1)

Ceci fonctionne pour excel 2021-365, (peut-être 2019 ???)

re,

un tri avec x (indéfini) colonnes, individuellement xlascending ou xldescending, avec au maximum 9.999 valeurs unique par colonne.

Sub trier()
     Dim a, SCA
     Set SCA = CreateObject("system.collections.arraylist")

     a = Range("A1").ListObject.DataBodyRange.Value     'lire dans une matrice
     ReDim Preserve a(1 To UBound(a), 1 To 3)     'ajouter une colonne auxiliaire

     For i = 1 To UBound(a)     'boucle
          If Not SCA.contains(a(i, 1)) Then SCA.Add a(i, 1)     'ajouter les valeurs unique au SCA
     Next
     SCA.Sort     'trier le SCA
     t = SCA.toarray     'lire SCA vers une matrice
     For i = 1 To UBound(a)     'boucle cette matrice
          a(i, 3) = Format(Application.Match(a(i, 1), t, 0), "0000|")     '3ieme colonne, créer un cle pour trier
     Next

     SCA.Clear     'vider le sCA
     For i = 1 To UBound(a)     'boucle cette matrice
          If Not SCA.contains(a(i, 2)) Then SCA.Add a(i, 2)     'ajouter les valeurs unique au SCA
     Next
     SCA.Sort     'trier
     SCA.Reverse     'inverser le trie = XLDESCENDING !!!!!
     t = SCA.toarray     'lire sca vers matrice
     For i = 1 To UBound(a)     'oucle cette matrice
          a(i, 3) = a(i, 3) & Format(Application.Match(a(i, 2), t, 0), "0000|")     'ajouter 2ième clé à la 3ieme colonne
     Next

     a1 = Application.Sort(a, 3, -1)     'nouvelle matrice = matrice original, trié sur la 3ième colonne XLDESCENDING
     Range("D2").Resize(UBound(a1), UBound(a1, 2)).Value = a1     'coller le resultat

End Sub
15trier-sca.xlsb (24.93 Ko)

Bonjour à tous,

Voici une autre fonction pour un tableau à 2 dimensions proche de celle que vous utilisiez :

Function SortArray(ByVal t, Optional SortField As Byte = 1)
For i = LBound(t) To UBound(t) - 1
    If CStr(t(i, SortField)) > CStr(t(i + 1, SortField)) Then
        For k = LBound(t, 2) To UBound(t, 2)
            temp = t(i + 1, k)
            t(i + 1, k) = t(i, k)
            t(i, k) = temp
        Next k
        i = Application.Max(LBound(t) - 1, i - 2)
    End If
Next i
SortArray = t
End Function

A utiliser ainsi dans votre cas pour trier sur la 3è colonne :

TabTrié = SortArray(TabBrut, 3)

C'est un tri ascendant par défaut mais il est possible de paramétrer l'ordre de tri.

Cdlt,

re,

triage combiné, 2 clés, 1ière colonne xlascending, 2ième colonne xldescending pour version excel <2021-365

26trier-sca.xlsb (26.65 Ko)

BsAlv : une référence à mettre en place ?

@ bientôt

LouReeD

@LouReeD

BsAlv : une référence à mettre en place ?

je ne comprends pas la question, vous demandez de l'explication supplémentaire ? (sorry, en anglais)

https://exceljet.net/excel-functions/excel-sort-function

@LouReed : La référence à ajouter est indiquée sur ce lien : https://www.automateexcel.com/fr/vba/objet-arraylist/ mais n'est pas obligatoire si l'on choisit la liaison tardive comme l'a fait BsAlv.

Cdlt,

oh it's raining solutions !!!

merci à vous je marque résolu le sujet :)

Rechercher des sujets similaires à "tri tableau memoire vba"