Accéder au contenu principal

Trier une ListBox Access

Lorsqu'on a une ListBox dont la SourceType est une ValueList, comment la trier ?
Réponse ci-dessous, avec possibilité de trier sur n'importe quelle colonne, en mode numérique ou alpha.
Sub SortListBox(ByRef lstBox As ListBox, iCol As Integer, Optional isNum As Boolean = False)

'sorts the value list of a listbox on any column
'numerical col. can be sorted numerically or alpha
'sorting algorithm is probably not the most efficient
'Copyleft: Patrick Honorez - www.idevlop.com
Dim vaItems As Variant, cols As Integer
Dim i As Long, j As Long, k As Integer
Dim vTemp As String, IsSwapped As Boolean
Dim isSmaller As Boolean
On Error GoTo 0
'Put the items in a variant array
vaItems = Split(lstBox.RowSource, ";")
cols = lstBox.ColumnCount
Do
IsSwapped = False
For i = 0 To lstBox.ListCount - 2
j = i + 1
If isNum Then
isSmaller = Val(vaItems(i * cols + iCol - 1)) > _
Val(vaItems(j * cols + iCol - 1))
Else
isSmaller = vaItems(i * cols + iCol - 1) > _
vaItems(j * cols + iCol - 1)
End If
If isSmaller Then
For k = 0 To cols - 1
'swap row i and row j
IsSwapped = True
vTemp = vaItems(i * cols + k)
vaItems(i * cols + k) = (vaItems(j * cols + k))
vaItems(j * cols + k) = vTemp
Next k
End If
Next i
Loop While IsSwapped
'Add the sorted array back to the listbox
lstBox.RowSource = Join(vaItems, ";")
Me.Repaint
End Sub

Commentaires

Posts les plus consultés de ce blog

ROW_NUMBER OVER PARTITION en Access

Ceux qui ont l'habitude de travailler avec une "grosse" base données comme SQL Server / Oracle / PostGreSQL, sont parfois frustrés face à certaines lacunes du SQL d'Access.   Prenons par exemple: ROW_NUMBER() OVER PARTITION, dont l'absence rend certaines requêtes très compliquées.   J'ai donc écrit une petite fonction VBA qui peut être appelée depuis un query Access et qui simulera assez bien ce ROW_NUMBER() OVER PARTITION.   Notez que ceci ne fonctionnera pas correctement dans une vue ou un formulaire interactif. Par contre comme source d'un rapport ou d'un export Excel, c'est impeccable.   En pratique il est préférable d'initialiser la fonction avec une chaîne de caractères "improbable" avant de lancer le rapport, comme indiqué dans le code.

Calculate MAX of a list in VBA

Strangely such a function is not available in VBA. Here is one that works with any number of strings or numbers. Function Largest(ParamArray a() As Variant) As Variant 'returns the largest element of list 'List is supposed to be consistent: all nummbers, dates, strings. 'Nulls are allowed, but not in first position. Eventually provide a first low dummy value 'e.g:   largest(2,6,-9,7,3)         -> 7 '       largest("d", "z", "c", "x") -> "z" 'by Patrick Honorez --- www.idevlop.com     Dim result As Variant     Dim i As Integer          result = a(LBound(a))          For i = LBound(a) + 1 To UBound(a)         If result < Nz(a(i), result) Then             result = a(i)         End If     Next i     Largest = result End Function