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 :eek:

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 :rolleyes:

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 Explicit, instruction
Voir aussi Exemple Particularités

Instruction utilisée au niveau module pour imposer la déclaration explicite de toutes les variables de ce module.

Syntaxe

Option Explicit

Remarques

Si elle est utilisée, l'instruction Option Explicit doit apparaître dans un module avant toute procédure.

Si l'instruction Option Explicit apparaît dans un module, vous devez déclarer explicitement toutes les variables à l'aide des instructions Dim, Private, Public, ReDim ou Static. Si vous tentez d'utiliser un nom de variable non déclarée, une erreur se produit à la compilation.

Si vous n'utilisez pas l'instruction Option Explicit, toutes les variables non déclarées sont de type Variant à moins qu'un type par défaut soit précisé à un autre endroit à l'aide d'une instruction Deftype.

Note Utilisez l'instruction Option Explicit pour éviter toute faute de frappe lors de la saisie du nom d'une variable existante ou pour écarter tout risque de confusion dans un code où la portée de la variable n'apparaît pas clairement.
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 :
Option Compare, instruction
Voir aussi Exemple Particularités

Instruction utilisée au niveau module pour déclarer la méthode de comparaison par défaut qu'il convient d'utiliser lors de la comparaison de chaînes.

Syntaxe

Option Compare {Binary | Text | Database}

Remarques

Si elle est utilisée, l'instruction Option Compare doit apparaître dans un module avant toute procédure.

L'instruction Option Compare définit la méthode de comparaison de chaînes (Binary, Text ou Database) pour un module. Si le module ne contient pas d'instruction Option Compare, la méthode de comparaison de texte par défaut est Binary.

L'instruction Option Compare Binary fournit des comparaisons de chaînes basées sur un ordre de tri dérivé de la représentation binaire interne des caractères. Dans Microsoft Windows, l'ordre de tri est déterminé par la page de code. L'exemple suivant décrit un ordre de tri binaire typique :

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

L'instruction Option Compare Text fournit des comparaisons de chaînes basées sur un ordre de tri qui ne distingue pas les majuscules des minuscules et qui est déterminé par les paramètres régionaux de votre système. Si les caractères ci-dessus sont triés à l'aide de l'instruction Option Compare Text, l'ordre de tri de texte suivant est utilisé :

(A=a) < ( À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)

L'instruction Option Compare Database ne peut être utilisée que dans Microsoft Access. Elle fournit des comparaisons de chaînes basées sur l'ordre de tri déterminé par l'identificateur de paramètres régionaux de la base de données dans laquelle la comparaison de chaînes est effectuée.

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:

Note Utilisez l'instruction Option Explicit pour éviter toute faute de frappe lors de la saisie du nom d'une variable existante ou pour écarter tout risque de confusion dans un code où la portée de la variable n'apparaît pas clairement.



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

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,

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+

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

Réponses
12
Affichages
217