limiter la frappe clavier à une liste dans un combobox

atlas

XLDnaute Occasionnel
Bonjour à tous ...

En bref tout est dans le titre .
Comment limiter la frappe clavier à une liste (située dans un onglet excel) dans un combobox ?

Le but est d'empecher l'utilisateur de taper n'importe quoi dans le combobox , l'obliger à n'utiliser que la liste chargée par le combobox .Le tout en autorisant la saisie semie automatique qui fonctionne mais sans discrimination...(proprieté autowordselect)
 

Softmama

XLDnaute Accro
Re : limiter la frappe clavier à une liste dans un combobox

Bonjour,

Tu peux utiliser l'évènement Keypress de ton combobox :
En fonction de la touche appuyée, KeyAscii prend sa valeur Ascii :
48 à 57 pour les chiffres de 0 à 9
65 à 90 pour A à Z
97 à 122 pour a à z

Ainsi, l'exemple suivant empêche l'utilisateur de rentrer des chiffres :
VB:
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select case Keyascii
Case 48 to 57
    keyascii= 0 'annule la frappe
end Select
End Sub
 

atlas

XLDnaute Occasionnel
Re : limiter la frappe clavier à une liste dans un combobox

Ok mais insuffisant ...
Ex j'aie un combobox contenant une liste de nom de ville en majuscules

Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select case Keyascii

Case 48 to 57 'empeche les chiffres
keyascii= 0
end Select
Case 97 to 122 'empeche les minuscules
keyascii= 0
end Select
End Sub

L'utilisateur peut choisir de taper un nom de ville en majuscule qui n'existe pas en France ex: BXOURT
L'enregistrement dans ma BD sera effectué sur une ville fantôme .
 

Softmama

XLDnaute Accro
Re : limiter la frappe clavier à une liste dans un combobox

re,

ha ben, j'avais pas du tout compris ton pb... Tu as la propriété Matchrequired qu'il faut placer à True. Tu peux aussi placer la propriété MatchEntry à 0- fmMatchEntryFirstLetter pour limiter le risque d'erreur.
 

atlas

XLDnaute Occasionnel
Re : limiter la frappe clavier à une liste dans un combobox

Merci de m'avoir montrer la voie ...

Pour mes besoins j'aie garder Matchentry 1-fmmatchentrycomplete
et Matchrequired = true (qui empéche de saisir des noms en dehors de ma liste)
et ça roule !

C'est le mot match en anglais dont je ne comprend pas bien ce qu'il signifie en français ...
 

Mulder

XLDnaute Junior
Re : limiter la frappe clavier à une liste dans un combobox

Bonjour à tous,
Je me permets de remonter ce topic dans la mesure où il répond PRESQUE à ma question : ok, matchrequired permet de limiter la saisie, ce que je cherchais et que j'avais trouvé.
Mais peut-on changer le message d'erreur en anglais en cas de saisie "interdite" ?

D'avance merci !!!
 

Softmama

XLDnaute Accro
Re : limiter la frappe clavier à une liste dans un combobox

Bonjour Mulder,

à ce moment, remets la propriété MatchRequired à true et inspire-toi de ces 2 lignes de code :
VB:
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Liste = Array("A", "B", "C", "D", "E", "F", "G") 'Liste des valeurs autorisées
If IsError(Application.Match(ComboBox1, Liste, 0)) Then MsgBox ComboBox1 & " n'est pas une entrée autorisée!", , "message perso": Cancel = True
End Sub
à adapter à ton cas
 

Mulder

XLDnaute Junior
Re : limiter la frappe clavier à une liste dans un combobox

Bonjour Softmana et merci de m'aider,

Comment j'adapte sachant que la source de ma combobox c'est
ComboBox1.List = .Range("A2:A" & .Range("A65536").End(xlUp).Row).Value

...et que bien sûr, cette liste de valeurs se situe sur l'onglet "Settings"...

J'ai essayé comme ça :
Code:
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Sheets("Setttings")
A = .Range("A2:A" & .Range("A65536").End(xlUp).Row).Value
End With
Liste = Array("A") 'Liste des valeurs autorisées
If IsError(Application.Match(ComboBox1, Liste, 0)) Then MsgBox ComboBox1 & " n'est pas une entrée autorisée!", , "message perso": Cancel = True
End Sub

Mais ça marche pas...
 

Softmama

XLDnaute Accro
Re : limiter la frappe clavier à une liste dans un combobox

Bonjour,

tu peux adapter ainsi :
Nomme en dynamique une Zone nommée Liste (Insertion/Nom/définir) avec pour valeur :
Code:
=Décaler(Settings!A1;0;0;NBVAL(Settings!$A:$A)-1;1)

Définis ta combobox1 ainsi :
VB:
ComboBox1.List = Range("Liste").value
et la macro ainsi :
VB:
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsError(Application.Match(ComboBox1, Range("Liste"), 0)) Then MsgBox ComboBox1 & " n'est pas une entrée autorisée!", , "message perso": Cancel = True
End Sub

EDIT : Beaucoup plus plus mieux (plus simple, plus facile, plus aisé), la solution proposée par HAsCO ci après. :)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz