Triage Croissant sur array 2d

taratata

XLDnaute Junior
bonjour à tous,

J'ai créer un tableau 2D --> a_DIY_Liquide
VB:
Option Base 1
' Déclare Tableau 2D (Ligne,Colonne)
Public a_DIY_Liquide(1000, 100) As Variant

pour enregistrer les lignes d'un tableau structuré du nom [Tab_Liquide]

1029128


je rempli le ComboBox

Code:
' Enregistrement dans ComboBox - Nom Eliquide
    Me.CB_Liste_EL.Clear

        For x = 1 To Last_Ligne_EL - 1
            If a_DIY_Liquide(1, x) <> "" Then
                Me.CB_Liste_EL.AddItem a_DIY_Liquide(1, x)
                'MsgBox "Tableau 2D a_DIY_Liquide(1, x) Valeur   --->    " & a_DIY_Liquide(1, x)
                Me.CB_Liste_EL.ListIndex = 0        ' Affiche 1er élément
                s = s + 1
            End If
        Next x

1029130


Jusque là, tous va bien.

Ce que je souhaite, avant de remplir le ComboBox, c'est d'effectuer un classement de nom par ordre ascendant du contenu du array a_DIY_Liquide
J'ai testé divers codes et celui ci ne tiens pas compte de la dernière ligne

Code:
' Applique Tri Croissant
    For I = 1 To UBound(a_DIY_Liquide)
        x = I
    
        For k = x + 1 To UBound(a_DIY_Liquide)
            If a_DIY_Liquide(k, 1) <= a_DIY_Liquide(x, 1) Then x = k
        Next k
    
        If I <> x Then
            ValTemp = a_DIY_Liquide(x, 1): a_DIY_Liquide(x, 1) = a_DIY_Liquide(I, 1): a_DIY_Liquide(I, 1) = ValTemp
        End If
    Next I

j'obtiens bien le classement sauf pour la dernière ligne!

1029129



ou dois-je apporter une correction au code de classement?
merci
 

taratata

XLDnaute Junior
je n'obtient rien

Code:
Call Tri(a_DIY_Liquide(), 1, LBound(a_DIY_Liquide, 1), UBound(a_DIY_Liquide, 1))

VB:
Sub Tri(a_DIY_Liquide(), ColTri, gauc, droi) ' Quick sort
'MsgBox "gauc " & gauc
'MsgBox "droi " & droi
'MsgBox "colTri " & ColTri

  ref = a_DIY_Liquide((gauc + droi) \ 2, ColTri)
  MsgBox "ref   " & a_DIY_Liquide((gauc + droi) \ 2, ColTri)
  g = gauc: d = droi
  Do
    Do While a_DIY_Liquide(g, ColTri) < ref: g = g + 1: Loop
    Do While ref < a_DIY_Liquide(d, ColTri): d = d - 1: Loop
    If g <= d Then
       For k = LBound(a_DIY_Liquide, 2) To UBound(a_DIY_Liquide, 2)
         temp = a_DIY_Liquide(g, k): a_DIY_Liquide(g, k) = a_DIY_Liquide(d, k): a_DIY_Liquide(d, k) = temp
         Debug.Print temp
       Next k
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a_DIY_Liquide, ColTri, g, droi)
  If gauc < d Then Call Tri(a_DIY_Liquide, ColTri, gauc, d)

End Sub
 

job75

XLDnaute Barbatruc
Bonsoir taratata, salut JB,

Je ne comprends pas du tout votre manière de programmer, voyez plutôt ce code, très classique :
VB:
Sub Remplir_ComboBox()
Dim tablo, i&, x$, a$(), n&
tablo = [Tab_Liquide].Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = tablo(i, 2) 'nom
    If x <> "" Then
        ReDim Preserve a(n) 'base 0
        a(n) = x
        n = n + 1
    End If
Next
If n Then tri a, 0, UBound(a): CB_Liste_EL.List = a Else CB_Liste_EL.Clear
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
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
En effet d'après ce que je vois les noms sont en 2ème colonne du tableau.

A+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Exemple avec tableau dynamique.


VB:
Option Compare Text
Private Sub UserForm_Initialize()
  Me.enreg = [client].Rows.Count + 1
  Me.Id = Application.Max([client[id]]) + 1
  Tbl = [client].Value
  Tri Tbl, LBound(Tbl), UBound(Tbl), 2
  Me.Recherche.List = Tbl
End Sub

Sub Tri(a, gauc, droi, colTri) ' 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 c = LBound(a, 2) To UBound(a, 2)
          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, colTri)
   If gauc < d Then Call Tri(a, gauc, d, colTri)
End Sub


Boisgontier
 
Dernière édition:

Discussions similaires

Réponses
17
Affichages
760

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof