menu deroulant avec saisie semi-automatique par mot clé

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.
 

Fichiers joints

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 ...
 

Fichiers joints

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


Haut Bas