Validation d'un ComboBox

Résolu
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017 - 4 févr. 2016 à 12:32
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017 - 15 févr. 2016 à 10:04
Bonjour,
dans mon userform j'ai une liste déroulante, le problème que le combobox accepte autre donne non disponible dans la liste voici se que j'ai fais mais sa marche ps ;
le ComboBox1 = caisse

Private Sub caisse_Exit(ByVal Cancel As MSForms.ReturnBoolean)

valeur = "=VLookup(""" & caisse.Text & """, caisse, 2, False)"
If valeur = "#N/A" Then
MsgBox "client nexiste ps"
End If

Range("B1") = "=VLookup(""" & caisse.Text & """, caisse, 2, False)"
End Sub

8 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
4 févr. 2016 à 15:42
Bonjour,

valeur ne peut être égal à une formule comme on la retrouve dans une feuille.
Regarde plutôt du côté de Application.WorksheetFunction.VLookup

Une autre méthode serait d'utiliser Find. à voir dans ton aide (F1)

Maintenant, si la valeur est erronée, tu mets un message d'erreur mais le code continue et la formule va s'inscrire quand même... Ça prendrait un Else
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 févr. 2016 à 16:11
Bonjour,
comment veux-tu qu'on te réponde sur ces seules bases, sans savoir :
- où et comment a été définie la variable valeur
- ce qu'est le 2ème paramètre qu'utilise vlookup (en observant qu'il a de surcroît le même nom que celui donné à la combobox
- quels sont les tenants et aboutissants exacts (exprime-les en langage naturel) de ce que tu parais vouloir écrire
A ce stade et de manière générale : quelques observations :
1) on définit toujours la propriété utilisée d'un objet. Même une cellule en est un.
a) - si valeur est une cellule nommée :
-----elle a des propriétés. Ouvre ton aide VBA sur la propriété Formula (Rubrique Range.Formula, propriété)
----- seule une cellule peut afficher "#NA". Et la présence de l'erreur #NA se vérifie par ce que te montre la rubrique WorksheetFunction.IsNA, méthode de ton aide VBA
- si valeur est un string, elle ne saurait avoir la valeur "#NA"
b) il est très maladroit d'utiliser la propriété .text d'une combobox. Elle change en effet dès que l'on modifie sa zone d'édition, qu'un article soit ou non sélectionné. L'article sélectionné d'une combobox toto est toto.list(toto.listindex)
c) ton 2ème paramètre (caisse) est également maladroit. Il devrait être une plage de cellules (apparemment d'au moins deux colonnes, puisque tu y recherches dans la seconde). Si tu as nommé ainsi (caisse) une plage de cellules, tu risques un conflit avec la propriété text (par défaut) de la combobox du même nom !

Et si tu nous disais plutôt par quoi et comment est remplie ta combobox et le but que tu cherches à atteindre (avec précision) ?
Car je suis à peu près certain que tu t'égares-là quelque peu.
0
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017
7 févr. 2016 à 13:39
Bonjour ,
voici comment j'ai rempli ma combobox

Dim i As Integer
i = 2
Nature donne
Do While Worksheets("donne").Cells(i, 4) <> ""
caisse.AddItem Worksheets("donne").Cells(i, 4)
i = i + 1
Loop


le problème qui se pose si on écrie une autre valeur qui n'est pas dans le combobox elle est accepte ,

pour le non caisse qui est répété deux fois , le premier et le non de la combobox et le deuxième c'est le nom d'une plage de cellule , je croye que sa pose pas problème mais comme vous le dite je vais le changer .
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 4/02/2016 à 18:55
Enfin quoi, ami aminesc, tu veux bien que l'on réfléchisse ensemble, hors même informatique ?
Allons-y : refuser un choix qui ne fait pas partie d'une liste acceptable revient à ne proposer que ce qui est acceptable, non ?
Cela ne te parait-il pas évident ?

Ou alors, on en revient à la blague de Minnie qui proposait à son mari de choisir la confiture qu'il voulait pour sa tartine, alors qu'elle ne pouvait lui offrir que de la confiture d'oranges ou de cerises (elle n'en avait pas d'autres ...) et donc refusait tous ses autres choix ...
Il a fallu un certain temps à son mari pour finalement en arriver à l'un des deux seuls choix possibles ....
Elle aurait gagné beaucoup de temps à lui demander s'il préférait de la confiture de cerises ou de la confiture d'orange !
Commence par cette démarche de pensée ... tu vas voir la suite lorsque tu l'auras acceptée...

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
4 févr. 2016 à 21:50
Bonsoir ucfoutu
J'adore cette blague mon cher !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
Modifié par pijaku le 5/02/2016 à 12:54
Bonjour tout le monde,
Bonjour Jacques,
==> La pêche est bonne?

Si c'est pour empêcher la saisie d'autres valeurs que celles contenues dans la ComboBox, tu peux également utiliser la propriété Style des ComboBox. Cette dernière, réglée sur fmStyleDropDownList rend la saisie de nouveaux items impossible.

Voici un exemple :
Private Sub UserForm_Initialize()
Dim List_Donnees(), i As Integer

   'remplissage de la variable tableau des valeurs à ajouter à la combobox
   List_Donnees = Sheets("Feuil1").Range("A1:A25").Value
   With ComboBox1
      'permet la saisie "informatisée" des valeurs dans la ComboBox
      .Style = fmStyleDropDownCombo
      For i = LBound(List_Donnees) To UBound(List_Donnees)
         'ajout dans la combobox sans doublons
         .Value = List_Donnees(i, 1)
         If .ListIndex = -1 Then .AddItem List_Donnees(i, 1)
      Next
      'empêche la saisie d'autres valeurs que celles présentes dans la ComboBox
      .Style = fmStyleDropDownList
      .ListIndex = -1
   End With
End Sub

Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
0
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017
7 févr. 2016 à 13:45
bonjour pijaku,
oui sa marche merci beaucoup ; mais comme je suis nouveau dans VBA j'ai pas vraiment compris comment sa marche , je vous serai reconnaissant pour plus d'explication .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 7/02/2016 à 23:16
Bonjour,
Se servir plus simplement de la propriété RowSource d'une combobox.
ComboBox1.RowSource = "Feuil1!A1:D4"

lie indéfectiblement les items de la combo à la plage A1:D4 de la feuille Feuil1

A partir de là : on agit directement (ajout) sur la feuille des données (sera répercuté sur la combo). Les doublons seront évités par un simple worksheetfunction.countif (on n'ajoute que si retourne 0).
L'intérêt est au moins double :
1) les données rajoutées restent (à la sauvegarde du classeur), sans nécessité de les rajouter à la feuille depuis la combo
2) le tri des données est facilité (tri de la plage, automatiquement répercuté sur la combo) alors que la combobox n'offre pas nativement elle-même cette possibilité

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 8/02/2016 à 00:47
Pour bien comprendre ce dont je parle :
Un petit exemple bâclé :
- Un classeur nouveau
- Une feuille nommée "DONNEES", dont nous allons nous servir de la colonne A. Cette feuille peut être vide au départ (peu importe; j'ai traité l'erreur si vide)
- un userform avec :
--- une textbox textbox1
--- une combobox combobox1
--- un bouton de commande commandbutton1
- ce code :
Private Sub CommandButton1_Click()
With Worksheets("DONNEES")
derlig = .Range("A" & Rows.Count).End(xlUp).Row
If WorksheetFunction.CountIf(.Range("A1:A" & derlig), TextBox1.Text) = 0 Then
.Range("A" & derlig + 1).Value = TextBox1.Text
mise_a_jour
TextBox1.Text = ""
End If
End With
End Sub
Private Sub UserForm_Activate()
mise_a_jour
End Sub

Private Sub mise_a_jour()
' on trie systématiquement
With ActiveWorkbook.Worksheets("DONNEES").Sort
.SortFields.Clear
.SortFields.Add Key:=Range("A:A"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A:A")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' on lie la combo (on lui affecte la totalité des lignes non vides
With ComboBox1
On Error Resume Next
.RowSource = "DONNEES!" & Worksheets("DONNEES").Range("A:A").SpecialCells(xlCellTypeConstants).Address
If Err Then .RowSource = ""
On Error GoTo 0
.Style = 2
.MatchEntry = fmMatchEntryComplete
.MatchRequired = True
.ColumnCount = 1
End With
End Sub

lançons ==>> saisissons "poires" dans la textbox puis cliquons sur commandbutton1 ===>> regardons ce qui s'est passé, tant dans la textbox que sur la feuille "DONNEES"
faisons cette opération à nouveau, en saisissant "ananas", puis "bananes", puis "cerises" ===>>>
observons que le tri est fait partout
essayons maintenant de saisir un fruit déjà présent ("cerises", par exemple) ===>> observons ==>> pas ajouté en doublon.



________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017
10 févr. 2016 à 22:54
Bonjour ucfoutu,
merci beaucoup pour ton aide , sa marche très bien j'esseille de comprendre les formule que ta utilise ,
merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 11/02/2016 à 08:35
Bon ...
Content pour toi.

Nous allons cependant maintenant perfectionner tout cela (que j'avais bâclé hier) :
1) nous allons ajouter sur ton userform de quoi ajouter des mots (en série), corriger un mot sélectionné et/ou supprimer un mot sélectionné.
enlève la textbox (devenue inutile) et ajoute ces trois boutons de commande :
- CommandButton1 avec son caption = "Ajouter des mots"
- CommandButton2 avec son caption = "Corriger le mot sélectionné"
- CommandButton3 avec son caption = "Supprimer le mot sélectionné"
et ce code (qui remplace la TOTALITE du code précédent) :
Option Explicit

Private Sub UserForm_Activate()
Set F = Worksheets("DONNEES")
tri
maj ComboBox1
End Sub

Private Sub CommandButton1_Click()
With F
Dim ajout As String, n As Long, derl As Long
ajout = "on s'en moque": n = 1
Do While Not ajout = ""
ajout = Trim(InputBox("Ajout mot " & n, "AJOUTER DES MOTS"))
If WorksheetFunction.CountIf(.Range("A:A"), ajout) = 0 Then
derl = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & derl).Value = ajout
n = n + 1
Else
If ajout <> "" Then MsgBox "ce mot existe déjà !"
End If
Loop
tri
maj Me.ComboBox1
End With
End Sub

Private Sub CommandButton2_Click()
If ComboBox1.ListIndex = -1 Then
MsgBox "aucun mot n'a été sélectionné"
Exit Sub
End If
Dim mot As String
mot = "on s'en moque"
Do Until mot = ""
mot = Trim(InputBox("Remplacer le mot " & ComboBox1.List(ComboBox1.ListIndex) & " par ", "CORRECTION DU MOT " & ComboBox1.List(ComboBox1.ListIndex)))
If WorksheetFunction.CountIf(F.Range("A:A"), mot) = 0 Then
F.Range("A" & ComboBox1.ListIndex + 1).Value = mot
tri
Exit Sub
Else
MsgBox mot & " existe déjà !": mot = "": Exit Sub
End If
Loop
End Sub

Private Sub CommandButton3_Click()
If ComboBox1.ListIndex = -1 Then
MsgBox "aucun mot n'a été sélectionné"
Exit Sub
End If
F.Range("A" & ComboBox1.ListIndex + 1).Value = ""
tri
maj ComboBox1
End Sub

2) crée un nouveau module (insertion ===>> module) destiné à abriter( les fonctions tri et maj, que vous allons utiliser ainsi à moindres frais depuis partout. Et mets-y ce code :
Public F As Worksheet

Public Sub tri()
With F.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("A:A"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A:A")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Public Sub maj(cb As ComboBox)
With cb
On Error Resume Next
.RowSource = F.Name & "!" & F.Range("A:A").SpecialCells(xlCellTypeConstants).Address
If Err Then .RowSource = ""
On Error GoTo 0
.Style = 2
.MatchEntry = fmMatchEntryComplete
.MatchRequired = False
.ColumnCount = 1
End With
End Sub


3) nous allons maintenant mettre des garde-fous sur ta feuille DONNEES, qui ne pourra être mise à jour que comme nous l'entendons. Nous empêcherons ainsi un utilisateur de faire n'importe quoi.
Sur cette feuille données, ajoute trois boutons de commande :
- CommandButton1 avec son caption = "Ajout des mots"
- CommandButton2 avec son caption = "Correction d'un mot"
- CommandButton3 avec son caption = "Suppression d'un mot"
et ce code :
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then Range("B" & Target.Row).Select: Exit Sub
If Target.Column = 1 Then
Target.Offset(0, 1).Select
Target.Offset(0, 1).Value = ""
MsgBox "les données de cette colonne sont à manipuler à l'aide des seuls bolutons ad hoc"
End If
End Sub

Private Sub CommandButton1_Click()
Dim ajout As String, n As Long, derl As Long
Set F = ActiveSheet
ajout = "on s'en moque": n = 1
Do While Not ajout = ""
With F
ajout = Trim(InputBox("Ajout mot " & n, "AJOUTER DES MOTS"))
If WorksheetFunction.CountIf(.Range("A:A"), ajout) = 0 Then
derl = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & derl).Value = ajout
n = n + 1
Else
If ajout <> "" Then MsgBox "ce mot existe déjà !"
End If
End With
Loop
tri
End Sub

Private Sub CommandButton2_Click()
Dim choix As Range, mot As String
Application.DisplayAlerts = False
On Error Resume Next
Set choix = Application.InputBox("Cliquez sur le mot à corriger ou annulez", "corriger des mots", Type:=8)
On Error GoTo 0
Application.DisplayAlerts = True
If choix Is Nothing Then Exit Sub
mot = "on s'en moque"
Do Until mot = ""
mot = Trim(InputBox("Remplacer le mot " & choix.Text & " par ", "CORRECTION DU MOT " & choix.Text))
If WorksheetFunction.CountIf(Range("A:A"), mot) = 0 Then
choix.Value = mot: Exit Do
Else
If mot <> "" Then MsgBox "ce mot existe déjà !": mot = ""
End If
Loop
tri
End Sub
Private Sub CommandButton3_Click()
Dim choix As Range
Application.DisplayAlerts = False
On Error Resume Next
Set choix = Application.InputBox("Cliquez sur le mot à supprimer ou annulez", "supprimer un mot", Type:=8)
On Error GoTo 0
Application.DisplayAlerts = True
If choix Is Nothing Then Exit Sub
choix.Value = ""
tri
End Sub

Voilà : fais joujou avec tout cela (tu vas vite en comprendre le fonctionnement)

N'oublie ensuite pas de libérer cette discussion par un clic sur le tag RESOLU" au niveau de ton tout premier message.


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
aminesc Messages postés 70 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 3 juillet 2017
15 févr. 2016 à 10:04
Bonjour ucfoutu,
ohh merci beaucoup c'est tres bien fais , je te poserai plus tard des question sur les formule que j'arrive pas a comprendre .
0
Rejoignez-nous