Userform: Recherche plus rapide d'un Combobox

Aragon10

XLDnaute Occasionnel
Bonjour,

J'ai créé un combobox qui contient une liste des clients. Le problème se pose pendant ma recherche. par exemple dans le cas ou le client s'appelle " STE DE TRANSPORT ET DE SERVICE" et je veux rechercher cette relation parmi plusieurs. le combobox facilite notre recherche dans le cas ou je tape "STE" mais pas lorsque je tape "TRANSPORT" ou "SERVICE". y'a t-il un moyen qui facilite la recherche au sein du combobox (afficher le client en tapant n'importe quel mot qui le compose) ?

Merci pour votre réponse.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Userform: Recherche plus rapide d'un Combobox

Bonjour,

Scénario qui semble correspondre à la question initiale:

-On recherche les sociétés BERNARD de la BD
-En frappant BER, on obtient dans le ComboBox intuitif toutes les sociétés qui contiennent BER
-on choisit parmi les doublons dans le combobox.
-on affiche tous les champs de l'enreg choisi.

Société
STE BERNARD PARIS
STE DUPONT ZZZ
STE UNTEL XXX
STE UNTEL XXX
SOCIETE BERNARD NICE
STE UNTEL XXX
STE DUPONT YYYY
STE BERNARD ISSY
STE DUPONT KKKK
STE UNTEL XXX


filtre.gif

Code:
Dim f, ligneEnreg, choix1(), tblChoix1()
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  choix1 = Application.Transpose(f.Range("A2:A" & f.[a65000].End(xlUp).Row).Value)
  Me.ChoixNOM.List = choix1
  ligneEnreg = f.[a65000].End(xlUp).Row + 1
  Me.ChoixNOM.SetFocus
End Sub

Private Sub ChoixNom_Change()
 If Me.ChoixNOM.ListIndex = -1 And IsError(Application.Match(Me.ChoixNOM, choix1, 0)) Then
   ReDim tblChoix1(1 To UBound(choix1))
   tmp = "*" & UCase(Me.ChoixNOM) & "*"
   ligne = 0
   For Each c In choix1
     If UCase(c) Like tmp Then ligne = ligne + 1: tblChoix1(ligne) = c
   Next c
   If ligne > 0 Then
     ReDim Preserve tblChoix1(1 To ligne)
     Me.ChoixNOM.List = tblChoix1
     Me.ChoixNOM.DropDown
   End If
  Else
   choixNom_click
  End If
End Sub

Avec FILTER

Code:
Option Compare Text
Dim f, ligneEnreg, choix1()
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  choix1 = Application.Transpose(f.Range("A2:A" & f.[a65000].End(xlUp).Row).Value)
  Me.ChoixSociete.List = choix1
  Me.ChoixSociete.SetFocus
End Sub

Private Sub ChoixSociete_Change()
  If Me.ChoixSociete.ListIndex = -1 And IsError(Application.Match(Me.ChoixSociete, choix1, 0)) Then
   Me.ChoixSociete.List = Filter(choix1, Me.ChoixSociete.Text, True, vbTextCompare)
   Me.ChoixSociete.DropDown
  Else
    ChoixSociete_click
  End If
End Sub



JB
 

Pièces jointes

  • filtre.gif
    filtre.gif
    35.4 KB · Affichages: 198
  • filtre.gif
    filtre.gif
    35.4 KB · Affichages: 175
  • FormComboIntutifDoublons.xls
    78 KB · Affichages: 111
  • FormComboIntutifFilterDoublons.xls
    78.5 KB · Affichages: 127
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Userform: Recherche plus rapide d'un Combobox

Bonjour,

Version avec doublons gérants pour la même ville:
-On choisit la société dans un premier menu
-Puis on choisit le gérant dans un second menu

Filtre.gif

Code:
Option Compare Text
Dim f, ligneEnreg, choix1()
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  choix1 = Application.Transpose(f.Range("A2:A" & f.[a65000].End(xlUp).Row).Value)
  Me.ChoixSociete.List = SansDoublons(choix1)
  ligneEnreg = f.[a65000].End(xlUp).Row + 1
  Me.ChoixSociete.SetFocus
End Sub

Private Sub ChoixSociete_Change()
  If Me.ChoixSociete.ListIndex = -1 And IsError(Application.Match(Me.ChoixSociete, choix1, 0)) Then
   Me.ChoixSociete.List = Filter(SansDoublons(choix1), Me.ChoixSociete.Text, True, vbTextCompare)
   Me.ChoixSociete.DropDown
  Else
    choixSociete_click
  End If
End Sub

Private Sub choixSociete_click()
  a = f.Range("A2:B" & f.[B65000].End(xlUp).Row).Value
  Dim b(): ReDim b(1 To UBound(a))
  j = 0
  For i = 1 To UBound(a)
     If a(i, 1) = Me.ChoixSociete Then j = j + 1: b(j) = a(i, 2)
  Next i
  ReDim Preserve b(1 To j)
  Me.ChoixGerant.List = b
  Me.ChoixGerant.SetFocus
  If Val(Application.Version) > 10 Then SendKeys "{f4}"
End Sub

Pour le même scénario, avec un seul menu déroulant à 2 colonnes (Société + Gérant)

http://boisgontierjacques.free.fr/fichiers/Formulaire/FormComboIntutifFilterGerants2col.xls

En frappant BER, on obtient tous les sociétés BERNARD avec les noms des gérants.

Flitre.gif


JB
 

Pièces jointes

  • FormCascade2nivIntuitifFiltre.xls
    95 KB · Affichages: 171
  • Filtre.gif
    Filtre.gif
    12.1 KB · Affichages: 158
  • Filtre.gif
    Filtre.gif
    12.1 KB · Affichages: 156
Dernière édition:

Bolou

XLDnaute Nouveau
Re : Userform: Recherche plus rapide d'un Combobox

Bonjour Boisgontier et à vous tous

D'abord merci pour tout ton site qui m'aide bcp bien que un peu diffcile pour moi, je trouve qu'il y a bcp de choses "prêt à porter".

Revenons en aux faits!

Ci joint une appli VBA que je conçois pour mon travail quotidien. Tout marche bien, sauf pour la recherche rapide sur le combobox.
J'ai copier une partie de la première macro (sans rien y comprendre réellement) pour la combobox2 mais évidemment elle ne fonctionne pas.

Merci de votre contribution
 

Pièces jointes

  • SEARCH ITEM.xlsm
    65 KB · Affichages: 118
  • SEARCH ITEM.xlsm
    65 KB · Affichages: 104

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Userform: Recherche plus rapide d'un Combobox

Bonsoir,

cf PJ

Code:
Dim f, a()
Private Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Me.ComboBox1.List = Application.Transpose(f.[A1:b1].Value)
End Sub

Private Sub ComboBox1_change()
  col = Me.ComboBox1.ListIndex + 1
  derLig = [A65000].End(xlUp).Row
  a = Application.Transpose(f.Cells(2, col).Resize(derLig - 1, 1).Value)
  Me.Label2.Caption = Me.ComboBox1
  Me.ComboBox2.List = a
  Me.ComboBox2.SetFocus
  SendKeys "{F4}"
End Sub

Private Sub ComboBox2_Change()
 If Me.ComboBox2.ListIndex = -1 And IsError(Application.Match(Me.ComboBox2, a, 0)) Then
   Me.ComboBox2.List = Filter(a, Me.ComboBox2.Text, True, vbTextCompare)
   Me.ComboBox2.DropDown
 End If
End Sub

http://boisgontierjacques.free.fr/fichiers/Formulaire/FormIntuitifChoixColRecherche.xlsm

JB
 

Pièces jointes

  • SEARCH ITEM.xlsm
    101.7 KB · Affichages: 190
  • SEARCH ITEM.xlsm
    101.7 KB · Affichages: 138
Dernière édition:

Bolou

XLDnaute Nouveau
Re : Userform: Recherche plus rapide d'un Combobox

Bonjour Jacques,
Merci infiniment, c'est nickel!!! exactement ce que je cherchais!

Je voudrais avoir une methodologie avec VBA vue que je suis autodicdacte, quels conseils me donnerais tu?

merci
 

Brice G

XLDnaute Occasionnel
Bonjour, ce topic reprend exactement le problème que j'essaie de résoudre :
Bonjour,

J'ai créé un combobox qui contient une liste des clients. Le problème se pose pendant ma recherche. par exemple dans le cas ou le client s'appelle " STE DE TRANSPORT ET DE SERVICE" et je veux rechercher cette relation parmi plusieurs. le combobox facilite notre recherche dans le cas ou je tape "STE" mais pas lorsque je tape "TRANSPORT" ou "SERVICE". y'a t-il un moyen qui facilite la recherche au sein du combobox (afficher le client en tapant n'importe quel mot qui le compose) ?

Merci pour votre réponse.
Je suis exactement dans le même cas en ayant choisi pour la propiété "matchentry" de ma combobox : la matchentrycomplete1.

Tout d'abord, je précise que j'utilise la version 2016 d'Excel.;) Je vous décris le plus simplement possible mon fichier :
- j'ai créé une multitudes de menus déroulants (plus le temps passe, plus je me dis que ce n'était peut-être pas la bonne solution) permettant d'établir une liste de fournitures, chacun faisant appel à une base de données contenant 7.000 fournitures environ et qui se trouve sur un AUTRE fichier excel ;

- j'adapte le code de BoisGontier (que je remercie déjà beaucoup au passage) de la manière suivante :
les seuls changements sont en rouge.

Dim a()
Private Sub UserForm_Initialize()
a = Application.Transpose(["S:\SMI\Suivi_achats\[base_fournitures.xlsm]LISTE".Range("I6:I" & f.[I65000].End(xlUp).Row]) ==> j'ai placé le chemin du fichier ici, ma base de données se trouve dans la liste, à la colonne I (c'est un tableau, si ça peut aider...), à partir de la ligne 6.


Me.ComboBoxtest.List = a
End Sub

Private Sub ComboBoxtest_Change()
If Me.ComboBoxtest.ListIndex = -1 And IsError(Application.Match(Me.ComboBoxtest, a, 0)) Then
Me.ComboBoxtest.List = Filter(a, Me.ComboBoxtest.Text, True, vbTextCompare)
Me.ComboBoxtest.DropDown
Else
ActiveCell = Application.Proper(Me.ComboBoxtest)
Unload Me
End If
End Sub



Dès que je tape une lettre dans ma combobox, cela m'affiche le message suivant "erreur d'exécution 13 : incompatibilité de type". Je débute complètement en VBA mais après quelques efforts pense avoir compris le rôle de chaque ligne.
Merci d'avance, et beaucoup, pour toute aide, j'avoue avoir galérer pas mal sur ce fichier, pour lequel je découvre toujours de nouvelles choses à améliorer ou corriger.:eek::D
 

ChTi160

XLDnaute Barbatruc
Bonjour Brice G
Bonjour le fil,Le Forum
Dans ton chemin au fichier Source, comment est définie la Feuille source "f " :
["S:\SMI\Suivi_achats\[base_fournitures.xlsm]LISTE".Range("I6:I" & f.[I65000].End(xlUp).Row]
Ton fichier est fermé ?
si oui ,Pourquoi ne pas l'ouvrir est récupérer les données dans un tableau temporaire .
Bonne fin de journée
Amicalement
Jean marie
 

Brice G

XLDnaute Occasionnel
Bonsoir Chti et Nicole, et merci pour vos réponses.

Bonjour Brice G
Bonjour le fil,Le Forum
Dans ton chemin au fichier Source, comment est définie la Feuille source "f " :
C'est un oubli de ma part !:confused: Au départ, "f"décrivait le chemin au fichier source, je l'avais défini car dans un autre document de BOISGONTIER, j'avais trouvé cette façon de faire, j'aurais du régler ce problème ; j'essaierai demain. Merci !

Ton fichier est fermé ?
si oui ,Pourquoi ne pas l'ouvrir est récupérer les données dans un tableau temporaire .
Bonne fin de journée
Amicalement
Jean marie
Mon fichier source est ouvert, j'ai mis c chemin au fichier source pour être sûr ^^. Petit aparté, il est ouvert notamment car j'utilise (bbbeeaaaauuuccoouuupp) la fonction RECHERCHEV dans mon fichier principal ; et apparemment les données ne sont accessibles (notamment pour les menus déroulants), que lorsque ma base fournitures est ouverte, sinon le fameux #REF. C'est un problème que j'ai essayé de régler et auquel je m’attellerai plus tard.:rolleyes:

Je n'ai que entendu parler des tableaux temporaires, :oops:, mais ils présentent peut-être une solution à beaucoup de mes problèmes.:rolleyes:
 

Brice G

XLDnaute Occasionnel
Bonjour,

>Je suis exactement dans le même cas en ayant choisi pour la propiété "matchentry" de ma combobox : la matchentrycomplete1.

Il faut choisir MatchEntry: None

BISSON
Oui, j'ai bien lu sur les fichiers de BOISGONTIER la nécessité de mettre cette propriété sur 0, je ne comprends d'ailleurs pas bien pourquoi, pour laisser le soin au code vba de gérer la recherche tout seul sans venir le perturber avec une propriété prédéfinie ?

En tous les cas, je corrige mon code, applique cette propriété et vous tiens au courant demain.
Je verrai pour vous mettre une copie avec des valeurs bidons ici, c'est toujours très compliqué de comprendre de quoi on parle, quand en face de vous, celui qui vous explique est sur son fichier depuis des semaines.:confused::D:)
 

ChTi160

XLDnaute Barbatruc
Re
Un petit coucou au passage à Nicole ,dont j’apprécie les interventions.
Tu peux , si tu le veux mettre un fichier exemple enfin (2) , sans données confidentielles :
Et nous dire ce que tu veux en faire ,en Obtenir ,par l'exemple Lol
Merci par avance
Amicalement
Jean marie
 

Brice G

XLDnaute Occasionnel
Bonjour, après une pause sur ce projet, me revoici devant Excel, plus motivé que jamais.:)

Dans le code de boisgontier que m'a confié Nicole, je tombe toujours sur le même problème, à ce niveau du code selon le débogueur : "argument ou appel de procédure incorrect".
En bleu mes modifications par rapport au code de boisgontier initial (encore merci à lui et à vous:D), que j'ai vérifiées.

Dim a()
Private Sub UserForm_Initialize()
repertoire = ThisWorkbook.Path & "\"
classeur = "base_fournitures.xlsm"
i = 1
Do
temp = Application.ExecuteExcel4Macro("'" & repertoire & "[" & classeur & "]LISTE'!R" & i + 5 & "C9")
If temp <> 0 Then
ReDim Preserve a(1 To i)
a(i) = temp
i = i + 1
End If
Loop Until temp = 0
Me.ComboBox1.List = a
End Sub

Private Sub ComboBox1_Change()
If Me.ComboBox1.ListIndex = -1 And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
Me.ComboBox1.List = Filter(a, Me.ComboBox1.Text, True, vbTextCompare)
Me.ComboBox1.DropDown
Else
ActiveCell = Application.Proper(Me.ComboBox1)
Unload Me
End If
End Sub

Je commence à être en difficulté...
 

Discussions similaires

Statistiques des forums

Discussions
312 389
Messages
2 087 898
Membres
103 675
dernier inscrit
axona