Recherche ListBox & Renvoi vers TextBox

Kim75

XLDnaute Occasionnel
Bonjour à tous,

Si quelqu’un pouvait m’aider avec ce classeur des communes, ce serait sympa
J’ai un tableau à 4 colonnes : Commune, Département, C.P. et une autre info
Il y a près de 38 948 lignes correspondant aux 38 948 communes existantes
Une ListBox affichant les communes de la colonne A (contenant des doublons)
Les TextBox affichant le Département, le C.P. et une info lors du click sur ListBox
Jusque là tout va bien, hormis la légère lenteur de la réaction de la ListBox
Mais quand j’ai ajouté un TextBox de recherche de communes, tout est parti en vrille

Le fichier étant un peu lourd, je le mets ici :

Cordialement, Kim.
 

pierrejean

XLDnaute Barbatruc
Re : Recherche ListBox & Renvoi vers TextBox

Bonjour Kim75

Pour accelerer la ListBox teste:

Code:
Private Sub ListBox1_Click()
Dim i As Long
    For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) = True Then
      Me.TextBox2.Value = ListBox1.List(i, 1)
      Me.TextBox3.Value = Format(ListBox1.List(i, 2), "00000")
      Me.TextBox4.Value = ListBox1.List(i, 3)
    End If
    Next
End Sub

En ce qui concerne la TextBox je cherche ...
 

pierrejean

XLDnaute Barbatruc
Re : Recherche ListBox & Renvoi vers TextBox

Re

Une version fonctionnelle mais trop lente a mon gout (je cherche encore)
Edit :
Arg: trop gros !!

La modif:
Code:
Private Sub TextBox1_Change()
Dim i As Long
  For i = ListBox1.ListCount - 1 To 0 Step -1
    If Left(ListBox1.List(i, 0), Len(TextBox1)) <> TextBox1.Value Then
      ListBox1.RemoveItem (i)
    End If
  Next
End Sub

NB: essaie de taper les 3 ou 4 lettres du debut
 
Dernière édition:

Kim75

XLDnaute Occasionnel
Re : Recherche ListBox & Renvoi vers TextBox

Merci beaucoup Pierre-Jean :)

Ca marche si j'entre lentement les lettres du mot, sinon ça beug
En fait, je suis souvent confronté à des adresses pas très bien lisibles
Si je distingue alors un mot de la ville ou une partie du code postal
Je peux alors chercher dans la ListBox la valeur qui se rapproche
Je me serais suffit de l’ascenseur s’il n’y avait pas autant d’items

Cordialement, Kim.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Recherche ListBox & Renvoi vers TextBox

Bonjour à tous,

Un autre essai pour la recherche qui accepte les caractères génériques:

paris -> exactement paris
*paris -> se termine par paris
paris* -> commence par paris
*paris* -> contient paris
*par?s* -> contient une séquence commençant par par, puis un caractère quelconque, puis un s

La recherche n'est déclenchée que lorsqu'on valide la TextBox1 par la touche entrée.

Le code:
VB:
Private Sub TextBox1_AfterUpdate()
Dim TabloSource, Entree, TabloLigne(), i&, j&, k&, Quoi$, i2&

For k = 2 To 4: Me.Controls("TextBox" & k) = "": Next k
UserForm1.ListBox1.Clear
TabloSource = Sheets("BD").Range("A1:D1000").CurrentRegion.Value
k = 0: Quoi = TextBox1: i2 = UBound(TabloSource)

For i = 2 To i2
    If TabloSource(i, 1) Like TextBox1 Then
      k = k + 1
      ReDim Preserve TabloLigne(1 To 4, 1 To k)
      For j = 1 To 4
        TabloLigne(j, k) = TabloSource(i, j)
      Next j
    End If
Next i

If k = 1 Then
  ListBox1.AddItem TabloLigne(1, 1)
  For i = 2 To 4
    ListBox1.List(0, i - 1) = TabloLigne(i, 1)
  Next i
ElseIf k > 1 Then
  ListBox1.List = Application.Transpose(TabloLigne)
End If

End Sub

Nota: la liste des communes est tronquée à 30 000 communes pour passer sur le site (cela prouve bien qu'on a beaucoup trop de communes :eek:)
 

Pièces jointes

  • Recherche-ListBox v1 (tronqué).zip
    897 KB · Affichages: 60
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : Recherche ListBox & Renvoi vers TextBox

Re

Salut ma pomme

Un poil meilleur:

Code:
Private Sub TextBox1_Change()
plage = Sheets("BD").Range("A2:D" & Sheets("BD").Range("A" & Rows.Count).End(xlUp).Row)
ListBox1.Clear
For n = LBound(plage, 1) To UBound(plage, 1)
  If TextBox1 = Left(plage(n, 1), Len(TextBox1)) Then
    ListBox1.AddItem plage(n, 1)
    ListBox1.List(ListBox1.ListCount - 1, 1) = plage(n, 2)
    ListBox1.List(ListBox1.ListCount - 1, 2) = plage(n, 3)
    ListBox1.List(ListBox1.ListCount - 1, 3) = plage(n, 4)
  End If
Next
End Sub

NB: encore un poil long sur les 2 1ers caracteres
 

Kim75

XLDnaute Occasionnel
Re : Recherche ListBox & Renvoi vers TextBox

Hello mapomme, pierrejean,

Merci à vous !

Pour le code de mapomme, il faut que j'entre le mot en entier (pas une partie du mot) et qu’il soit au début de la chaine, sinon ça ne remplit pas la ListBox. :)

Pour le code de Pierre-Jean, c'est mieux, ça prend la partie du mot, sauf que ça ne donne que les mots correspondants situés en début de chaine, je m'en contenterai. :)

Merci beaucoup !

Cordialement, Kim.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Recherche ListBox & Renvoi vers TextBox

re à tous et à pierrejean :)

(...) Pour le code de mapomme, il faut que j'entre le mot en entier (pas une partie du mot) et qu’il soit au début de la chaine, sinon ça ne remplit pas la ListBox.(...)

Si j'ai parlé des caractères génériques dans mon précédent message, ce n'est pas pour des prunes :p


(...) ça ne donne que les mots correspondants situés en début de chaine, je m'en contenterai. (...)

Ah que non! Un essai dans le fichier joint avec quatre boutons qui donnent la possibilité de choisir où chercher le mot (le mot exact, au début, n'importe où, à la fin)

nota: même avec cette version, les caractères génériques sont acceptés :rolleyes:. Essayez les quatre possibilités de recherche de la séquence par?s
 

Pièces jointes

  • Recherche-ListBox v2 (tronqué).zip
    897.3 KB · Affichages: 110
Dernière édition:

Kim75

XLDnaute Occasionnel
Re : Recherche ListBox & Renvoi vers TextBox

Salut mapomme,

Bravo, ça fonctionne très bien, on ne peut espérer mieux, merci à toi :)
Et même avec cette ligne de code qui m’a laissé penser qu’il ne marcherait que jusqu’à la 1000ème ligne :)
TabloSource = Sheets("BD").Range("A1: D1000").CurrentRegion.Value

Merci également à Pierre-Jean, et bon week end à tous !

Cordiales salutations, Kim.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Recherche ListBox & Renvoi vers TextBox

re,

(...) Et même avec cette ligne de code qui m’a laissé penser qu’il ne marcherait que jusqu’à la 1000ème ligne :)
TabloSource = Sheets("BD").Range("A1: D1000").CurrentRegion.Value (...)

En fait, avec un peu moins de paresse, j'aurais écrit:
Code:
TabloSource = Sheets("BD").Range("A1").CurrentRegion.Value
 

Statistiques des forums

Discussions
312 329
Messages
2 087 332
Membres
103 519
dernier inscrit
Thomas_grc11