Trier Listbox dans listbox par combobox

Bernard91

XLDnaute Junior
Bonjour à toutes et à tous,

Je suppose que ma question a sa réponse déjà sur le forum, mais le problème est que je n'arrive pas à la trouver.
J'ai une listbox avec 10 colonnes et j'aimerais, grâce à une combobox, trier cette listbox, je ne veux pas réutiliser la feuille de calcul.
Je suppose qu'il y du Redim dans l'air mais j'ai du mal.
Merci de votre aide.
 

PMO2

XLDnaute Accro
Re : Trier Listbox dans listbox par combobox

Bonjour,

Une piste avec les codes suivants

1) créez un UserForm (UserForm1)
2) insérez-y une ListBox (ListBox1)
3) copiez les codes suivants dans la fenêtre de code du UserForm
Code:
Dim Titres() As Single

Private Sub UserForm_Initialize()
Dim S As Worksheet
Dim R As Range
Dim var
Dim i&
Dim A$
Dim nbCol&
Dim Largeur!
Set S = Sheets(FEUILLE_DONNEES)
Set R = S.[a1].CurrentRegion
var = R
nbCol& = R.Columns.Count
ReDim Titres(1 To nbCol&)
For i& = 1 To nbCol&
  Titres(i&) = R.Columns(i&).Width
  Largeur! = Largeur! + Titres(i&)
  A$ = A$ & Titres(i&) & ";"
Next i&
With ListBox1
  .ColumnCount = nbCol&
  .List = var
  .ColumnWidths = Mid(A$, 1, Len(A$) - 1)
  .Left = 5
  .Top = 5
  .Width = Largeur! + .Left
  .Height = 500
  DoEvents
  Me.Width = Largeur! + (3 * .Left)
  Me.Height = .Height + (4 * .Top)
  Me.Caption = "Pour trier, cliquez droit sur un titre de colonne tout en maintenant Majuscule"
End With
End Sub

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim i&
Dim Largeur!
Dim S As Worksheet
Dim R As Range
Dim var
If Button = 2 And Shift = 1 And Y < 8 Then
  On Error GoTo Erreur
  For i& = 1 To UBound(Titres)
    Largeur! = Largeur! + Titres(i&)
    If X < Largeur! Then
      With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
      End With
      Sheets(FEUILLE_DONNEES).Copy before:=Sheets(1)
      Set S = Sheets(1)
      Set R = S.[a1].CurrentRegion
      R.Sort key1:=R.Cells(1, i&), order1:=xlAscending, Header:=xlYes
      var = R
      ListBox1.List = var
      S.Delete
      Set S = Nothing
      Exit For
    End If
  Next i&
End If
Erreur:
If Not S Is Nothing Then S.Delete
With Application
  .ScreenUpdating = True
  .DisplayAlerts = True
End With
End Sub

4) copier le code suivant dans un module standard (adaptez éventuellement la constante cernée par des ###)
Code:
'### Adapter la constante avec le nom de la feuille source des données ###
Public Const FEUILLE_DONNEES As String = "data"
'#########################################################################

Sub Launch()
UserForm1.Show (vbModeless)
End Sub

5) dans Excel, créez une feuille "data" et, à partir de A1, renseignez-la avec des données sur plusieurs lignes et sur 10 colonnes (par exemple)

FONCTIONNEMENT
Lancez la macro "Launch" et un UserForm apparaît contenant les données de la feuille "data".
Si, sur un titre de colonne de la ListBox vous faites un clic droit tout en MAINTENANT la touche majuscule, le contenu de la ListBox
sera trié de manière ascendante en fonction de la colonne choisie.

Pour faciliter toute la démarche, téléchargez l'exemple en pièce jointe.

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Réponses
25
Affichages
825
Réponses
9
Affichages
717