Recherche dans liste externe

erics83

XLDnaute Impliqué
Bonjour,

Je cherche à faire un Userform qui recherche des noms dans un classeur fermé, la recherche se faisant en tapant les premières lettres du nom.

J'ai essayé le code conseillé par Jacques Boisgontier (qui donne un lien vers ce site et dont les tutos sont super !), c'est le code
Code:
Dim Liste
Private Sub UserForm_Initialize()
  'Microsoft ActiveX DataObject doit être coché
  ' Champ nommé BD
  Set cnn = New ADODB.Connection
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
     ThisWorkbook.Path & "\" & "BDPROD.xls"
  Set rs = cnn.Execute("SELECT libellé FROM BD")
  Me.ListBox1.List = Application.Transpose(rs.GetRows)
  Liste = Me.ListBox1.List
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
End Sub

Private Sub TextBox1_Change()
  Me.ListBox1.Clear
  For Each c In Liste
    If UCase(c) Like UCase(Me.TextBox1) & "*" Then Me.ListBox1.AddItem c
  Next c
End Sub

Private Sub TextBox2_Change()
   Me.ListBox1.Clear
   For Each c In Liste
      If UCase(c) Like "*" & UCase(Me.TextBox2) & "*" Then Me.ListBox1.AddItem c
   Next c
End Sub

Private Sub ListBox1_Click()
   ActiveCell = Me.ListBox1
   Unload Me
End Sub
mais je n'arrive pas à le faire fonctionner, il bloque au niveau de
Code:
 Me.ListBox1.List = Application.Transpose(rs.GetRows)
et je ne comprends pas pourquoi....je suis sous excel 2003...

En vous remerciant pour votre aide,
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Recherche dans liste externe

Bonsoir,

Voir PJ

Ces fichiers doivent être dans le même répertoire.

JB
 

Pièces jointes

  • BDPROD.xls
    31.5 KB · Affichages: 74
  • BDPROD.xls
    31.5 KB · Affichages: 65
  • LISTEDEROUL.xls
    82 KB · Affichages: 59
  • LISTEDEROUL.xls
    82 KB · Affichages: 55

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

Super Merci BOISGONTIER,

Effectivement le code a évolué....:)

J'ai essayé de mettre la colonne D du BDPROD, mais cela ne fonctionne pas....
Code:
Dim Liste()
Private Sub UserForm_Initialize()
  'Microsoft ActiveX DataObject doit être coché
  ' Champ nommé BD
  Set cnn = New ADODB.Connection
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
      ThisWorkbook.Path & "\" & "BDPROD.xls"
  Set rs = cnn.Execute("SELECT libellé,Codification,Prix,Unité FROM BD where libellé<>''")
  Me.ListBox1.Clear
  i = 0
  Do While Not rs.EOF
    ListBox1.AddItem rs("libellé")
    ListBox1.List(i, 1) = rs("codification")
    ListBox1.List(i, 2) = rs("Prix")
     ListBox1.List(i, 3) = rs("Unité")
    i = i + 1
    rs.MoveNext
  Loop
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
  Liste = Me.ListBox1.List
End Sub
Private Sub TextBox1_Change()
   Me.ListBox1.Clear
   j = 0
   For i = LBound(Liste) To UBound(Liste)
     If UCase(Liste(i, 0)) Like UCase(Me.TextBox1) & "*" Then
        Me.ListBox1.AddItem Liste(i, 0)
        Me.ListBox1.List(j, 1) = Liste(i, 1)
        Me.ListBox1.List(j, 2) = Liste(i, 2)
        Me.ListBox1.List(j, 3) = Liste(i, 3)
        j = j + 1
     End If
   Next i
End Sub
Private Sub TextBox2_Change()
   Me.ListBox1.Clear
   j = 0
   For i = LBound(Liste) To UBound(Liste)
     If UCase(Liste(i, 0)) Like "*" & UCase(Me.TextBox2) & "*" Then
        Me.ListBox1.AddItem Liste(i, 0)
        Me.ListBox1.List(j, 1) = Liste(i, 1)
        Me.ListBox1.List(j, 2) = Liste(i, 2)
        Me.ListBox1.List(j, 3) = Liste(i, 3)
        j = j + 1
     End If


Mon but ultime serait de mettre 1 seul textbox : mon collègue entre dans la textbox soit les premières lettres, soit "contient", soit la codification, soit l'unité, etc.... bref, une entrée de la "BD" et le code "donnerait" les possibilités possibles ?

Pensez vous que cela soit envisageable ? cela éviterait les 2 TextBox, voire 3-4 suivant le nombre de colonne de BDPROD...

En vous remerciant pour votre aide,
erics83
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Recherche dans liste externe

-La colonne D pose pb à cause des cellules vides
-Pour avoir un seul TextBox et frapper le code ou le libellé (prem lettres ou lettres contenues)

Code:
Private Sub TextBox1_Change()
   Me.ListBox1.Clear
   j = 0
   For i = LBound(Liste) To UBound(Liste)
     If UCase(Liste(i, 0)) Like "*" & UCase(Me.TextBox1) & "*" _
        Or "*" & UCase(Liste(i, 1)) Like "*" & UCase(Me.TextBox1) & "*" Then
        Me.ListBox1.AddItem Liste(i, 0)
        Me.ListBox1.List(j, 1) = Liste(i, 1)
        Me.ListBox1.List(j, 2) = Liste(i, 2)
        Me.ListBox1.List(j, 3) = Liste(i, 3)
        j = j + 1
     End If
   Next i
End Sub

JB
 

Pièces jointes

  • BDPROD.xls
    31 KB · Affichages: 59
  • BDPROD.xls
    31 KB · Affichages: 56
  • LISTEDEROUL.xls
    73.5 KB · Affichages: 56
  • LISTEDEROUL.xls
    73.5 KB · Affichages: 55
Dernière édition:

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

OK, merci BOISGONTIER,

j'ai compris la logique. Donc j'en déduit que pour projet de A à D, cela ne risque pas d'être possible....car j'ai des vides (dans mon fichier final)

Sauf si on limite à la colonne A et B : BD prendrait la juste la colonne A et B, mais est-il envisageable d'avoir une seule textbox ou Listbox qui ferait une recherche soit par libellé soit par codification ? dans mon fichier source, la colonne A représente un N° de commande, la colonne B, le nom....donc je cherche à savoir si :
Mon Userform s'ouvre, avec 1 textbox, je tape un numéro de commande ou un nom, que les différentes lignes présentes dans BDPROD s'affichent...suivant la valeur entrée dans le textbox...

Possible or Not ? je n'arrête pas de faire des essais, mais je n'arrive pas...et pourtant on recherche dans la BD, donc logiquement on devrait pouvoir récupérer les valeurs et les mettre dans Liste ....:confused:

merci pour votre aide,
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Recherche dans liste externe

-Pour gérer les cellules vides

Code:
Private Sub UserForm_Initialize()
  'Microsoft ActiveX DataObject doit être coché
  ' Champ nommé BD
  Set cnn = New ADODB.Connection
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
      ThisWorkbook.Path & "\" & "BDPROD.xls"
  Set rs = cnn.Execute("SELECT libellé,Codification,Prix,Unité FROM BD where libellé<>''")
  Me.ListBox1.Clear
  i = 0
  Do While Not rs.EOF
    On Error Resume Next
    ListBox1.AddItem rs("libellé")
    ListBox1.List(i, 1) = rs("codification")
    ListBox1.List(i, 2) = rs("Prix")
    ListBox1.List(i, 3) = rs("Unité")
    On Error GoTo 0
    i = i + 1
    rs.MoveNext
  Loop
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
  Liste = Me.ListBox1.List
End Sub

Private Sub TextBox1_Change()
   Me.ListBox1.Clear
   j = 0
   For i = LBound(Liste) To UBound(Liste)
     If UCase(Liste(i, 0)) Like "*" & UCase(Me.TextBox1) & "*" _
        Or "*" & UCase(Liste(i, 1)) Like "*" & UCase(Me.TextBox1) & "*" Then
        On Error Resume Next
        Me.ListBox1.AddItem Liste(i, 0)
        Me.ListBox1.List(j, 1) = Liste(i, 1)
        Me.ListBox1.List(j, 2) = Liste(i, 2)
        Me.ListBox1.List(j, 3) = Liste(i, 3)
        On Error GoTo 0
        j = j + 1
     End If
   Next i
End Sub

>Possible or Not ?

Voir version post #4


JB
 
Dernière édition:

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

Excellent !!!!! Merci BOISGONTIER,

Nos messages se sont croisés....je n'avais pas pensé au "OR"....c'est tellement simple...du moins pour vous....:) mais j'ai compris la logique, merci, c'est super, cela fonctionne parfaitement !

La dernière question qui serait le top du top :

Admettons que j'ai la BDPROD contenant les codifications (=votre exemple), mais admettons que j'ai une BDPRODbase contenant tous les libellés, mais sans référence d'article + 1 colonne E où j'aurai les références des fournisseurs: prenons COLTACK :

En BDPRO il prend la référence article 77024, mais admettons que dans ma BDPRObase, j'ai :
A2 : COLTACK sans référence d'article, mais à un prix de 4 euros, colonne E : fournisseur = Toto
A3 : COLTACK sans référence d'article, mais à un prix de 5 euros , colonne E, fournisseur = Kiki (c'est pour l'exemple...)

Serait-il possible de "fusionner" BDPRO et BDPRObase afin que lorsque je cherche "COLTACK" dans le Textbox, s'affiche :
COLTACK (espace) 77024 (espace) 3,35
COLTACK (espace)(espace) 4 (espace) Toto
COLTACK (espace)(espace) 5 (espace) Kiki

donc une fusion BDPRO et BDPRObase des libellés en récupérant les codifications ou prix/fournisseurs s'il y en a ?

(j'ai mis (espace) car lorsqu'on écrit le message, il ne prend pas les espaces....comme pour faire un tableau...)

En vous remerciant pour votre aide,
 
Dernière édition:

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

Bonjour,

Apparemment la compil des 2 bases n'est pas possible.....

Par contre, j'ai un petit soucis :

La BDPROD est un fichier qui est mis à jour chaque semaine : j'extrais des données d'un serveur, et j'écrase BDPROD avec les nouvelles données.

Le problème donc que le nom de la plage "BD" est écrasé...puisque ma nouvelle BDPROD écrase l'ancienne BDPROD (=fichier enregistré sous...)

il faudrait que je puisse chercher les données d'une manière différente...style
FROM Feuil1 A2 : D5000 where libellé<>''")
, mais je n'y arrive pas....

Une petite aide ?

En vous remerciant,
 

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

Juste une dernière petite question : en admettant que je ne cherche pas dans le classeur fermé : je rapatrie l'ensemble du classeur (car j’ai vu que c'était un peu long....donc, je me dis qu’en rapatriant l'ensemble de la feuille, via ADO, ce sera peut être plus rapide...), comment faire pour avoir le même résultat... (=recherche sur libellé et nom).
J’ai pris l’exemple de BOISGONTIER et le classeur "FORMINTUITIF2COLONNES" : que je puisse taper "civray" et que j’ai la ligne "alicoop civray " qui s'affiche. ..

En vous remerciant,
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Recherche dans liste externe

Cette version devrait être + rapide

Code:
Private Sub UserForm_Initialize()
  'Microsoft ActiveX DataObject doit être coché
  ' Champ nommé BD
  Set cnn = New ADODB.Connection
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
      ThisWorkbook.Path & "\" & "BDPROD.xls"
  Set rs = cnn.Execute("SELECT count(*) as nb FROM [TABLE$A1:D1000] where libellé<>''")
  ReDim Liste(0 To rs("nb"), 1 To 4)
  'Set rs = cnn.Execute("SELECT libellé,Codification,Prix,Unité FROM BD where libellé<>''")
  Set rs = cnn.Execute("SELECT libellé,Codification,Prix,Unité FROM [TABLE$A1:D1000] where libellé<>''")
  Me.ListBox1.Clear
  i = 0
  Do While Not rs.EOF
    On Error Resume Next   ' cellules vides
    Liste(i, 1) = rs("libellé")
    Liste(i, 2) = rs("codification")
    Liste(i, 3) = rs("Prix")
    Liste(i, 4) = rs("Unité")
    On Error GoTo 0
    i = i + 1
    rs.MoveNext
  Loop
  Me.ListBox1.List = Liste
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
  Liste = Me.ListBox1.List
End Sub

JB
 

Pièces jointes

  • LISTEDEROULzz.xls
    87 KB · Affichages: 56
  • FormIntuitif2colonnesBis.xls
    143 KB · Affichages: 48
Dernière édition:

erics83

XLDnaute Impliqué
Re : Recherche dans liste externe

Juste pour mon information personnelle (car j'aime bien comprendre, pour essayer de nouvelles choses), à quoi correspond l'instruction if VAL (Application.Version)>10 then SendKeys "(F4)" dans le classeur FormIntuitif2colonnesBis ?



Dans le FormIntuitif2colonnesBis serait il possible de rajouter dans la combobox, juste en consultation, pas en recherche : dans mon cas, en A, j’ai une référence, En B, le nom, en C le prénom, je souhaite faire une recherche par la référence ou le nom, (encore merci pour votre aide), mais parfois, j’ai plusieurs noms qui s'affichent (Martin ou Dupont. .) et donc s'il y avait le prénom juste en affichage cela permettrait de ne pas se tromper...

J’ai essayé plusieurs choses : rajouter un choix1 (i,3) par exemple, mais cela n’a pas marché. ...


En vous remerciant,
 

Discussions similaires

Statistiques des forums

Discussions
312 300
Messages
2 087 008
Membres
103 429
dernier inscrit
PhilippeH