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
 

laetitia90

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

bonjour maval , l'ami pierrejean :):)bisous

sans fichier pas simple.... autrement on peut déja simplifier le "tablo" plus rapide??

Code:
Dim t(), t1(), x As Long, i As Long, y As Long
Private Sub Textbox1_Change()
  t = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row)
  ListBox1.Clear
  x = 0
  ReDim t1(1 To UBound(t), 1 To 3)
  For i = 1 To UBound(t)
  If Left(t(i, 1), Len(TextBox1)) = Left(TextBox1, Len(TextBox1)) Then
  x = x + 1
  For y = 1 To 3: t1(x, y) = t(i, y): Next y
  End If
  Next i
  ListBox1.List = t1
  If TextBox1 = "" Then ListBox1.Clear
  Erase t, t1
  End Sub
 

laetitia90

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

re,:):)

une autre code je pense plus rapide?? autrement t'interesser de l'exemple de Dranreb pas trop eu le temps d'etudier!!

Code:
Dim t(), t1(), x As Long, i As Long, y As Long, z As Byte
Private Sub Textbox1_Change()
  ListBox1.Clear
  If IsNumeric(Left(TextBox1, 1)) Then z = 1 Else z = 2
  t = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row)
  x = 0
  ReDim t1(1 To UBound(t), 1 To 3)
  For i = 1 To UBound(t)
  If Left(t(i, z), Len(TextBox1)) = Left(TextBox1, Len(TextBox1)) Then
  x = x + 1
  For y = 1 To 3: t1(x, y) = t(i, y): Next y
  End If
  Next i
  ListBox1.List = t1
  If TextBox1 = "" Then ListBox1.Clear
  Erase t, t1
End Sub
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Re Laetitia,

Sa marche Nickel sauf que lorsque je double click dans la listbox pour afficher dans lex tetbox message d'erreur "Dépassement de capacité"

Aurais tu la solution?

Merci d'avance
 

laetitia90

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

re, essai comme cela... la variable z déja déclare

Code:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
For z = 2 To 4: Controls("TextBox" & z) = ListBox1.List(ListBox1.ListIndex, z - 2): Next z
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Pour information:
Un ComboBox, c'est l'objet qui est implanté dans un userform quand on choisi "Zone de liste modifiable" dans la boîte à outils contrôles, ça possède une propriété List à laquelle il suffit d'affecter une table de valeurs telles que celles d'une plage,
et une propriété ListIndex qui renvoie le numéro à partir de 0 de l'entrée dans cette liste de la valeur tapée ou choisie par l'opérateur.
Il suffit d'y ajouter 1 pour avoir le numéro de ligne dans la plage.
Comme ça, a pu d'recherche du tout !
À +
 
Dernière édition:

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonjour Dranreb,

Puis-je quand même savoir pourquoi vous ne manifestez pas le moindre intérêt pour ma proposition ?

S'aurai était avec plaisir mais je ne comprend pas comment je pourrais faire avec une combobox, mais je suis prêt a accepter toute proposition et même l'adapter ci-dessous mon code du départ:

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

Dans l'attente de vous lire

Cordialement

Maval
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonjour
Re-joignez votre fichier en .xls, la conversion effectuée chez moi le laisse inexploitable.
L'idée est simple: supprimez la ListBox, Mettez à la place de la TextBox de saisie un ComboBox avec 3 colonnes et affectez à sa propriété List le tableau. Vous pouvez modifier la propriéte TextColumn lorsque le ComboBox Change, selon que sa propriété Text commence par un chiffre de code postal ou une lettre de nom de ville.
Si les villes devaient apparaître en ordre alpha dans la liste du combo pour une recherche plus facile, passez par des dictionnaires arborescents (de OutIdx). Ils vous dispenseraient aussi de recherches puisque il contiennent les numéros de lignes.
À +
 

maval

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Bonjour,

Suite a votre demande et trés heureux que vous ayez accepté je vous joint mon fichier en Xls reduit pour faute de poids car a l'origine il y a 38950 lignes correspondant a toute les villes de france.

Bonne journée

Maval
 

Pièces jointes

  • Classeur1.zip
    133.3 KB · Affichages: 42
  • Classeur1.zip
    133.3 KB · Affichages: 43
  • Classeur1.zip
    133.3 KB · Affichages: 47

Dranreb

XLDnaute Barbatruc
Re : Recherche trop lent sur USF

Un premier jet.
Ne sachant pas trop ce que vous vouliez faire du choix, je sélectionne la ligne de la ville choisie.
On peut taper directement la commune (ou la choisir), ou restreindre d'abord le choix à un code postal,
après avoir éventuellement restreints ceux ci à un département.
J'espère que le calcul des dictionnaires ne sera pas trop long compte tenu de votre nombre de communes.
À +
 

Pièces jointes

  • DicArbVilles.xls
    574 KB · Affichages: 63

Discussions similaires

Réponses
4
Affichages
205
Réponses
17
Affichages
819

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16