XL 2016 Alimenter listbox avec une énorme liste

KTM

XLDnaute Impliqué
Bonjour Chers tous
j'ai une plage de 8000 lignes et 13 colonnes que je voudrais afficher dans mon listbox .
J'ai utilisé la méthode Rowsource puis la méthode List mais mon userform charge lentement au lancement.
Je voudrais savoir s'il existe une autre méthode pour charger rapidement mon listbox.
Merci!!!
 

GALOUGALOU

XLDnaute Accro
bonjour le forum, bonjour staple1600, job75, chti160
re ktm

un jour de pluie et je tombe sur ce fil. le sujet m'intéresse donc je le parcours.
j'adhère sans réserves aux remarques de job75. d'autant plus que pour ce qui me concerne j'ai utilisé une listbox avec 39000 items, (codes postaux pour métropole et Dom-Tom).
La solution de job (corrigez-moi si je me trompe) permets de mettre en évidence des occurrences exactes et pour des correspondances partielles il faut utiliser le signe *. La casse est importante, il faut respecter majuscule, minuscule.

Je vous propose d'évaluer la solution jointe, que j'avais développé à partir de code récupéré sur le site de M Boisgontier et qui fonctionne parfaitement avec un résultat inférieur à une seconde.
Il n'y a pas besoin de correspondance exacte, il n'y a pas de différence sur la casse, la recherche peut être faite sur le milieu de l'occurrence. Le nombre de lignes n'est pas figé, il est dimensionné aux valeurs de la feuille
VB:
Private Sub UserForm_Initialize()
   Set f = Sheets("Feuil1")  'saisie de la feuille de recherche des données
   Set Rng = f.Range("A1:M" & f.[A65000].End(xlUp).Row) ' attention au minimum autant de textbox que de colonne
   Ncol = Rng.Columns.Count
  
  '-- entêtes TextBox
  For i = 1 To Ncol
    Set Lab = Me.Controls.Add("Forms.Label.1")
    Lab.Caption = f.Cells(1, i) 'le 1 1er ligne, le i numéro de colonne
    ' positionnement decalage vers le haut
    Lab.Top = Me("textbox" & i + 1).Top - 19
    Lab.Left = Me("textbox" & i + 1).Left
    x = x + f.Columns(i).Width * 0.5
  Next
 
                                '--SUITE PROCEDURE

  TblTmp = Rng.Value
   For i = LBound(TblTmp) To UBound(TblTmp)
     ReDim Preserve Choix(1 To i)
     For k = LBound(TblTmp) To UBound(TblTmp, 2)
       Choix(i) = Choix(i) & TblTmp(i, k) & " * "
     Next k
  

   Next i
  
   Me.ListBox1.List = Rng.Value

End Sub

Private Sub TextBox1_Change()
   If Me.TextBox1 <> "" Then
       mots = Split(Trim(Me.TextBox1), " ")
       Tbl = Choix
       For i = LBound(mots) To UBound(mots)
          Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
       Next i
       If UBound(Tbl) > -1 Then
          Dim b(): ReDim b(1 To UBound(Tbl) + 1, 1 To Ncol)
          For i = LBound(Tbl) To UBound(Tbl)
            a = Split(Tbl(i), "*")
            For k = 1 To Ncol: b(i + 1, k) = a(k - 1): Next k
          Next i
          Me.ListBox1.List = b
          Me.TextBox_items = UBound(Tbl) + 1
        End If
   Else
     UserForm_Initialize
  End If
 
    For k = 0 To Ncol - 1 'vider textbox si modification listbox
      Me("TextBox" & k + 2) = ""
    Next k

End Sub
Dans le classeur, faites un essai avec les deux solutions, avec le mot "maison".
Vous avez maintenant deux solutions qui correspondent à votre demande. La solution que je vous propose n'est pas meilleure que celle de job75, elle est différente, à vous de voir ce qui vous convient. C'est votre projet.

re job75, le classeur joint est votre classeur d'origine. Il comporte des données confidentielles, (nom, prénom) je l'ai purgé avec l'inspecteur de documents, il est présentement vide d'informations confidentielles.

cdt
galougalou
 

Pièces jointes

  • ListBox deux solutions.xlsm
    692.2 KB · Affichages: 16

Discussions similaires

Statistiques des forums

Discussions
312 069
Messages
2 085 042
Membres
102 765
dernier inscrit
richdi