Recherche trop lent sur USF

maval

XLDnaute Barbatruc
Bonjour

Voila j'ai un USF avec nom ville, CP et département et la recherche et trés lente. il y a 38950 lignes qui correspond a toute les communes de france.
Code:
Dim x As Long, i As Long, j As Long, k As Long

Private Sub CommandButton4_Click()
Unload Me: [a1].Select
End Sub

Private Sub CommandButton5_Click()
t = Range("a2:h" & Range("a65536").End(xlUp).Row)
ListBox1.List = t
End Sub

Private Sub reset_Click()
Unload Me: UserForm2.Show
End Sub

Private Sub Textbox1_Change()
 On Error Resume Next
 Application.ScreenUpdating = False
 t = Range("a2:c" & Range("a65536").End(xlUp).Row)
  ListBox1.Clear
x = 1
For i = 1 To UBound(t)
For j = 1 To 3
If Left(t(i, j), Len(TextBox1)) = Left(TextBox1, Len(TextBox1)) Then
  ReDim Preserve ta(1 To 3, 1 To x)
  For k = 1 To 3
  ta(k, x) = t(i, k)
  Next k: x = x + 1: End If: Next j: Next i
     ListBox1.List = Application.Transpose(ta)
      Erase t, ta
 If TextBox1 = "" Then ListBox1.Clear
Beep
   End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub


' Recherche par la listboxt
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     Dim ListIndex As Integer
     For ListIndex = 0 To (ListBox1.ListCount - 1)
        If ListBox1.Selected(ListIndex) = True Then
       
       
                 Me.TextBox2 = Me.ListBox1.List(ListIndex, 0) ' Ref
                 Me.TextBox3 = Me.ListBox1.List(ListIndex, 1) ' Date
                 Me.TextBox4 = Me.ListBox1.List(ListIndex, 2) ' N° Facture
               
            Exit Sub
        End If

Next

End Sub

Je vous remercie de votre aide

Cordialement

Maval
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonsoir,

Je viens de constater que cela était un beau travail est que je vais certainement l'employer a plusieurs reprise.
Seul petit problème malgré que je pense que cela doit être pas trés problématique. lorsque je complète la liste soit 38950 lignes représentant les ville de France sa beug au niveau des communes, je m'explique si je rentre le N° 10000 soit Troyes dans Aube j'ai toute la liste des villes au complet ?

J'ai essayé de vous envoyer la liste des ville mais trop lourd !

@+
 

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Je ne vois pas pour l'instant ce qui peut poser problème. Par contre j'ai oublié de vous recommander de mettre le format Texte partout: Il y a apparemment quelque part une certaine ville de Faux qui s'était retrouvée valeur logique !
Et est-ce que votre 10000 (code postal je suppose) n'a pas été entré dans une cellule qui ne portait plus le format Texte à partir de cette ligne ? Vous pouvez aussi tenter de dérouler pas à pas et d'analyser par des espions les contenus des dictionnaires. S'il y a toutes les villes c'est que le code postal n'est pas reconnu comme élément de la liste des codes postaux.
À +
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Re,

Je viens de m'apercevoir que lorsque je tape le 11000 dans la combobox code postal j'ai toute les ville dans la deuxième combobox, mais si je recherche dans la combobox code postal 11000 j'ai pas de problème je trouve bien Carcassonne ?
Après dans la combobox code postal quand je déroule j'ai 10000 en premier jusqu'à 20000 et après 01000 ainsi de suite...

@+
 

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Ça confirme mon soupçon: si les codes postaux ne sont pas dans l'ordre dans la liste du CbxCodPost c'est que certains sont numériques et d'autres textes. Les numériques viennent avant les textes (ordre de classement déterminé par Property Let TypeEtVal du module MDictionnarbo). Il m'avait déjà semblé remarquer que si du numérique est entré dans la List d'un ComboBox elle ne peut être reconnue tapée dans sa zone texte, mais seulement sélectionnée dans la liste.
À +
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonjour.
Si mon diagnostique est juste, oui, il suffit de convertir les mauvais codes postaux numériques en textes.
Soit par vba dans une petite procédure temporaire qui les explore pour bien voir lesquels c'est au passage avec TypeName,
soit par une formule dans une autre colonne qui y concatène &"" puis copie, collage spécial par valeur vers la colonne d'origine.
Ou une autre manœuvre de conversion de données
À +
 

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Ah non, je n'ai pas besoin d'aide, moi.
Pour ne pas avoir à rechercher ultérieurement si le problème devait se représenter, copie peut être cette procédure dans un module puis exécute la déjà pour cette fois :
VB:
Sub ConvertirEnTexte()
Dim Plage As Range, PlgTrv As Range, C As Long
Set Plage = Feuil2.Range("2:" & Feuil2.Cells(Rows.Count, "B").End(xlUp).Row)
Set PlgTrv = Plage.Columns(Feuil2.UsedRange.Columns.Count + 1)
For C = 1 To 3
   Plage.Columns(C).NumberFormat = "@"
   PlgTrv.FormulaR1C1 = "=TRIM(RC" & C & "&"""")"
   Plage.Columns(C).Value = PlgTrv.Value
   Next C
PlgTrv.EntireColumn.Delete
End Sub
Ça en profite pour transformer aussi FAUX en "FAUX" (à toi de retaper cette ville "Faux") et pour supprimer d'éventuels blancs en trop.

Par contre j'ai vu autre chose qui me parait gênant: lorsqu'on veut taper directement le nom de la commune on est constamment dérangé quand il reconnait un début autre que ce qu'on voulais taper parce qu'il met tout de suite son code postal et que la ville qu'on voulait taper n'y figure plus. Une solution serait de faire l'opération à l'Exit de CbxCommune plutôt qu'au Change. Mais ça implique de le quitter pour que ça se fasse. Par un bouton pris par défaut, c'est à dire activé aussi en faisant Entrée ? Tout dépend de ce qu'on veut faire du choix ensuite.
À +
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Re,

Beaucoup mieux d'abord la combobox reconnait tous les code postal et lie du plus petit aux plus grand et on retrouve les villes correspondante au code postal .
Après je ne sais pourquoi lorsque l'on appel USF il est très long a venir aussi il y a 38950 lignes ?

@+
 

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

On a peut être été trop ambitieux en calculant 3 dictionnaires arborescents.
Voir s'il y a moyen de n'en calculer qu'un seul au moment où il le faut.
D'ailleurs il y a quelque chose que je ne comprends pas très bien depuis le début.
Il semblerait qu'au départ on connaisse le nom de la commune qu'on cherche à taper même si on ne se souvient plus très bien de l'orthographe. Alors pourquoi affiner d'abord la recherche par code postal ? Il suffirait de commencer à la taper, puis quand on ne sait plus, chercher dans la liste complète aux alentours de ce qu'on a tapé, tout de même classé par ordre alpha grâce à un seul dictionnaire ? (voir aucun en classant une bonne fois pour toutes la liste par noms de communes)

Ou si on a toujours besoin de saisir des séries de villes d'une même région, on pourrait faire beaucoup plus simple en affectant tout bonnement toute la liste à un seul ComboBox à 3 colonnes dont la TextColumn serait la 2ième.

Tout le problème c'est que je ne vois pas bien à quoi ça sert tout ça, alors je ne vous conseille pas forcément bien…

À +
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

D'accord. Je pense que c'est clair.
Donc tu connais toujours soit la ville soit le code postal.
Il y aurait avantage (pour les orthographes qui n'arrivent pas à rentrer) à ce que la liste soit classée par ordre des noms de communes, mais ce n'est pas obligatoire.
Je pense qu'il ne faut pas autre chose qu'un ComboBox à 2 ou 3 colonnes alimenté par la liste, et un Label qui renvoie l'autre information que celle tapée, enfin un autre Label pour la région, par sécurité.
Il faut juste perfectionner le dispo au Change pour qu'il adopte automatiquement la bonne TextColumn selon que sa propriété Text tapée commence ou non par un chiffre. Sa propriété ListIndex conduira directement à la réponse (attention toutefois: elle commence à 0 pour le 1er élément).
Si tu peux donner à la liste un nom de plage statique qui la couvrira exactement, tu peut même préciser ce nom dans la propriété RowSource dans la fenêtre de propriété et ne plus t'occuper du chargement de la liste.
À +
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonsoir Dranreb

Comme je n'est plus de nouvelles et que je t'ai proposé si je mon aide alors que tu ma répondu ceci
Ah non, je n'ai pas besoin d'aide, moi.

Donc je te joint se que un petit exemple de se que je rechercher.

Je te remercie et te souhaite une bonne soirée

Maval
 

Pièces jointes

  • Recherche ville et cp_.zip
    292.9 KB · Affichages: 19

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonsoir
As tu un quelconque problème pour mettre en application la solution hyper simple que je t'ai dit ?
P.S Remarque, j'ai réfléchi, il vaut mieux ne pas classer la liste par nom de communes parce qu'il peut y en avoir plusieurs qui ont le même. Mais il y a peut être encore plus simple que ce que j'avaid proposé: 2 ComboBox: un pour le code postal, l'autre pour la commune. Mais chaque fois qu'un des deux change, affecter le même ListIndex à l'autre. Vas y, fais le.
Cordialement
À +
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
418

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette