Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

menu deroulant avec saisie semi-automatique par mot clé

ziz59

XLDnaute Nouveau
Bonjour,

Je m'adresse à tous les expert(e)s d'excel, je sais qu'il existe plusieurs sujet pour çà, mais ma problématique est différente, voila j'expose mon soucis :

J'ai un classeur avec 2 feuilles, l'une Recherche, l'autre Liste

1/ dans la feuille Liste => j'ai une colonne avec ma liste des rues trié par ordre croissant.
2/ j'ai creer un nom "Liste" avec la référence Ligne!$A2$A100
3/ dans la feuille Recherche => j'ai créer une liste déroulante avec la formule
=DECALER(Liste;EQUIV("*"&A1&"*";Liste;0)-1;;NB.SI(Liste;"*"&A1&"*"))

En fait la problématique c'est que dans mon exemple j'ai 2 rues contenant "Ronarc'h", seul la première occurrence apparait avec la ligne suivante ou précédente , je sais plus.

Donc la fonction NB.SI fait bien son boulo, car compte 2 lignes. par contre je ne comprends pas pour EQUIV, qui lui trouve que la première lignes.

Donc au final, si je me suis bien fait comprendre, j'aimerais votre aide pour que quand je tape une partie d'un mot compris dans cette liste, seul les lignes contenant ce mot ou partie de mot apparaisse dans cette liste.

Merci d'avance à vous

Le but ensuite c'est par la suite avec la Fonction RECHERCHEV(), de faire apparaitre les lignes des autres colonnes, mais çà c'est bon, pas de soucis.
 

Pièces jointes

  • liste_rues.xlsx
    8.9 KB · Affichages: 93
  • liste_rues.xlsx
    8.9 KB · Affichages: 105
  • liste_rues.xlsx
    8.9 KB · Affichages: 103

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé

re,

bein en faite ce que je veux dire c'est que la fonction dans liste réduite, reconnaisse la liste qui est sélectionné, soit par num de la ligne ou index

du genre si je sélectionne la liste en A1, que la fonction reconnaisse que c'est A1, ou ligne 1
 

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé

ok merci, CISCO, sinon je vais me pencher sur ta première version avec un maccro qui me copie cellule RECHERHEV() et insert une nouvelle ligne avec les éléments copié, si tu connais des experts en macro ?

J'ai trouvé çà, me reste plus qu'a comprendre l'insertion de lignes:

Private Sub ToggleButton1_Click()
Range("A1, B1").Copy Destination:=Sheets("feuil2").Range("A3")
End Sub
 

david84

XLDnaute Barbatruc
Re : menu deroulant avec saisie semi-automatique par mot clé

Bonjour, salut Cisco,

sur plus de 3000 lignes avec des formules matricielles, cela n'avance pas.
Autant tout traiter par macro.

Le problème est que si tu pars de zéro il va falloir t'y mettre pour gérer l'évolution de ton application car sinon tu vas passer ton temps à demander de l'aide sans rien comprendre aux solutions que le forum pourrait t'apporter.
Je me risque donc à te proposer une solution macro en comptant sur ton investissement pour essayer de comprendre sous peine que je me décourage rapidement.

Comme je n'ai pas le temps de tout relire, je reprends du début avec dans le fichier joint 1 formulaire comportant :
- une zone de texte permettant de noter le critère de filtre à appliquer
- une liste déroulante contenant les adresses de la colonne 1 de ton tableau répondant au critère noté dans la zone de texte.
J'ai supprimé la dernière colonne de ton tableau qui comportait les formules (plus besoin, enfin si j'ai bien compris).

A toi de voir si la liste correspond à ton attente.
Regarde bien le code et pose des questions sur ce que tu ne comprends pas, le but étant que tu puisses le gérer par la suite.
Si cette 1ère étape est ok, expose concrètement la suite de ta demande, sinon dis ce qui ne va pas.
A+
 

Pièces jointes

  • VOIE_NEW (1).xls
    488 KB · Affichages: 159
Dernière édition:

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé

Bonjour David, merci pour ton aide.

Alors je viens de regarder ton code, je n'y connais pas grand chose en VBA, mais pour créer un UserForm, bouton etc.. çà va, comme par exemple créer une liste modifiable et lui donné comme source une référence à une cellule ou colonne.

Alors concernant ton code :

Option Explicit
Option Compare Text
Ce sont des Fonction ou Variable d'environement ?

"Dim" je sais que c'est pour définir une variable

CreateObject("scripting.dictionary")
Je connais pas du tout.

Ensuite après avoir définis ta variable Dico, tu fais une boucle For des données de la cellule TextBox1 dans le Userform, c'est bien celà ?

Et tu compare les données du tableau de la boucle avec un If,Else.

Je dis çà de ce que je peux comprendre, le codé comme tu l'as fait méthodiquement j'en suis incapable ...

Ensuite au niveau de la déclaration "Private Sub UserForm_Initialize()" c'est là que je comprends pas tout, si tu peux détailler, cette fonction se fait au lancement du Form ? avant toutes chose ?
 

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé

j'ai commenté ton code, tu verras il y a des chose ou je demande des détails, tu verras aussi que j'ai ajouté un bouton valider avec copie/colle de la liste.

Je te joint le fichier, tu me dis si c'est correct, ou si on peu optimiser.

Par contre j'ai du enregistrer le fichier dans un classeur "xlsm" car en xls mon code reste mais pas la modification du userForm.
 

Pièces jointes

  • liste_Rue_Macro.xlsm
    171.1 KB · Affichages: 43
  • liste_Rue_Macro.xlsm
    171.1 KB · Affichages: 53
  • liste_Rue_Macro.xlsm
    171.1 KB · Affichages: 57

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé

re david,

Bon je commence tout doucement a comprendre, en parcourant ici et là des site ou forum d'aide Excel.

J'ai donc créer un bouton valider avec le code Vba pour chercher la correspondance des autres colonnes, et les copier/coller, j'ai aussi creer une condition de test .

je te mets en copie, tu me dis si c'est correct, à mon avis on peux surement optimiser, mais je suis un newbie

Ah oui, je suis obliger d’enregistrer le fichier en "xlsm", il y a pas un moyen d’exécuter du VBA ou macro dans un classeur simple ? car toi ton fichier était en "xls".

En tout cas merci pour ton aide ...
 

Pièces jointes

  • liste_Rue_Macro.xlsm
    170.2 KB · Affichages: 69
  • liste_Rue_Macro.xlsm
    170.2 KB · Affichages: 60
  • liste_Rue_Macro.xlsm
    170.2 KB · Affichages: 82
Dernière édition:

david84

XLDnaute Barbatruc
Re : menu deroulant avec saisie semi-automatique par mot clé

Bonjour,

Option Explicit oblige l'auteur du code à déclarer et spécifier les différentes variables.

Voilà ce que tu peux trouver dans l'aide d'Excel (touche F1) :
Option Compare Text permet de spécifier la méthode de comparaison des chaînes de caractères. Dans Excel, tu peux choisir entre un mode de comparaison binaire ou textuel. Dans le cas présent cela te permet par exemple de ne pas être obligé de taper dans la zone de texte les lettres en respectant la casse.

Ce que dit l'aide d'Excel :

Concernant Dictionary, c'est une classe qui fait partie de la bibliothèque Scripting.
Cet objet te permet de stocker des paires clé/élément de données. Dans le cas présent, cet objet est utilisé pour éliminer les doublons car ta liste en comprends quelques uns. En effet l'une des caractéristiques de cet objet est qu'il ne peut contenir que des clés uniques.

Si tu veux l'étudier plus avant, dans la barre d'outil de l'éditeur VBA : Outil=>Références=>cocher MicrosoftScriptingRuntime.
Tu as ainsi accès aux propriétés et méthodes de cette classe.
Ensuite dans le code tu remplaces
Code:
Dim Dico As Object
par
Code:
Dim Dico As Dictionary
et
Code:
Set Dico = CreateObject("scripting.dictionary")
par
Code:
Set Dico = New Dictionary

Une fois ces modifications effectuées tu peux profiter de l'autocomplétion : lorsque tu tapes Dico. (n'oublie pas le point) tu as à ta disposition les différentes propriétés et méthodes de cette classe.

Tu peux aussi utiliser la touche F2 du clavier pour accéder à l'explorateur d'objet, sélectionner Scripting dans le menu déroulant=>Rechercher=>sélectionner Dictionary dans la liste de gauche afin d'avoir accès aux membres de cet objet.

Regarde dans l'aide d'Excel ce qui est dit sur l'objet Dictionary et pose des questions sur ce que tu ne comprends pas.

Code:
Private Sub UserForm_Initialize
: différents événements sont rattachés à l'UserForm. Cela permet donc de déclencher une action donnée (sous forme de code) lors d'un événement donné.
Tu trouveras la liste des événements rattachés à l'objet UserForm en sélectionnant UserForm dans la liste déroulante de gauche de l'éditeur VBA puis en ouvrant la liste déroulante de droite.

Dans le cas présent je choisis dans l'événement Initialize :
- d'intancier la plage correspondant à ton tableau
Code:
Set Plage = Worksheets("Liste").Range("A1").CurrentRegion
- d'instancier la colonne A comportant les rues+communes en la redimensionnant afin de ne pas prendre en compte l'entête de colonne
Code:
Set ColAdresse = Plage.Columns(1).Offset(1).Resize(Plage.Rows.Count - 1)
- de charger les données de cette colonne dans un Array (tableau VBA)
Code:
Tablo = ColAdresse

Ensuite dans l'événement DropButtonClick du ComboBox1 j'instancie l'objet dictionnaire grace au mot clé Set
Code:
Set Dico = New Dictionary
J'utilise une boucle afin de comparer tous les éléments de l'array à la valeur de ma zone de texte : si l'élément correspond je l'enregistre dans le dictionnaire
Code:
For i = LBound(Tablo) To UBound(Tablo) 
  If Tablo(i, 1) Like "*" & Me.TextBox1.Text & "*" Then
    Dico(Tablo(i, 1)) = Dico(Tablo(i, 1))
  End If
Next i
NB : à la place de
Code:
Dico(Tablo(i, 1)) = Dico(Tablo(i, 1))
j'aurai pu utiliser la méthode Add pour charger ces paires mais il faut alors tester si la clé existe déjà en utilisant la méthode Exists sinon cela plante :
Code:
    If Not Dico.Exists(Tablo(i, 1)) Then
      Dico.Add Tablo(i, 1), Tablo(i, 1)
    End If
Je charge les clés du dictionnaire dans mon combobox
Code:
Me.ComboBox1.List = Dico.keys
(tu peux enlever Transpose ce n'est pas utile).

Je regarderai ton code quand j'aurai un peu de temps.
A+
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : menu deroulant avec saisie semi-automatique par mot clé

Bonjour à tous


Merci David , je ne me rappelais pas de ce texte issu de l'aide:




Ah, je comprend, pourquoi, je n'utilise pas Option Explicit, c'est parce que je ne fais pas de fautes de frappes (pas tapé ).
 

david84

XLDnaute Barbatruc
Re : menu deroulant avec saisie semi-automatique par mot clé

Bonjour,

je viens de regarder rapidement ton code.

Une remarque :
Code:
Rue = Application.VLookup(ValCombo, Range("Liste!A1:C7000"), 2, False)
Commune = Application.VLookup(ValCombo, Range("Liste!A1:C7000"), 3, False)
Le problème est que si ton tableau s'agrandit il te faudra actualiser Range("Liste!A1:C7000").
Tu devrais plutôt instancier ton tableau
Code:
Dim Plage As Range
Set Plage = Worksheets("Liste").Range("A1").CurrentRegion
Ensuite tu peux remplacer Range("Liste!A1:C7000") par Plage :
Code:
Rue = Application.VLookup(ValCombo, Plage, 2, False)
Commune = Application.VLookup(ValCombo, Plage, 3, False)

Comme cela lorsque ton tableau évolue tu n'as pas besoin de retoucher ton code.

A+
 

ziz59

XLDnaute Nouveau
Re : menu deroulant avec saisie semi-automatique par mot clé


Bonjour David,

Merci pour toutes les explication détaillées du code et des classes/variables/fonctions, je comprends mieux maintenant.

Concernant l'optimisation du code, je te remercie aussi, effectivement c'est plus judicieux d'instancier, car le tableau évoluera.

Tu m'as été d'une grande aide, et un super prof, je t'en remercie grandement, je remercie aussi CISCO, qui m'as beaucoup aidé...

Merci à vous 2 .
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…