Pblm d'erreur d'execution 91 sur listbox à choix multiple condit

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour,
Vous êtes mon dernier recours pour arriver à mes fins donc je me lance:

-Mon userform dispose d'une combobox et d'une listBox
-La combobox alimente les données de la liste box à partir du choix qui a été fait:
'Determination des valeurs de la combobox'

Private Sub UserForm_Initialize()

ComboBox1.AddItem "0 - Tomate"
ComboBox1.AddItem "1 -Choux"
ComboBox1.AddItem "2 - Bettrave"
ComboBox1.AddItem "3 - Salade"
ComboBox1.AddItem "4 - Pizza"
ComboBox1.AddItem "5 - Fromage"
ComboBox1.AddItem "6 - Tout"

End Sub

'Ici, j'alimente la listbox à partir du choix de la combobox'


Private Sub ComboBox1_Change()

If ComboBox1.Value = "0 - tomate" Then
ListBox1.RowSource = ("Feuil1!C26:C35")
ElseIf ComboBox1.Value = "1 - choux" Then
ListBox1.RowSource = ("Feuil1!F26:F32")
ElseIf ComboBox1.Value = "2 - bettrave" Then
ListBox1.RowSource = ("Feuil1!I26:I32")
ElseIf ComboBox1.Value = "3 - salade" Then
ListBox1.RowSource = ("Feuil1!M26:M32")
ElseIf ComboBox1.Value = "4 - pizza" Then
ListBox1.RowSource = ("Feuil1!R26:R32")
ElseIf ComboBox1.Value = ("5 - Fromage") Then
ListBox1.RowSource = ("Feuil1!V26:V30")
ElseIf ComboBox1.Value = "" Then
ListBox1.RowSource = ""
ElseIf ComboBox1.Value = "6 - Tout" Then
ListBox1.RowSource = ("")
End If

End Sub



-Ensuite je voudrais que pour chaque choix de la listbox, une action s'execute: voici donc ce que j ai écris:

Sub perimetre()

Dim ListBox1 As ListBox







If ListBox1.Value = ("APPUI ET EXPERTISE") Then
Call EtatmajAPPUIETEXPERTISE



End If
If ListBox1.Value = ("AQHSE") Then
Call EtatmajAQHSE


End If
If ListBox1.Value = ("COMMUNICATION") Then
Call EtatmajCOMMUNICATION


End If
If ListBox1.Value = ("DETACHES SYNDICAUX ET SOCIAUX") Then
Call Etatmajdetachesyndic


End If
If ListBox1.Value = ("DIRECTION") Then
Call EtatmajDirection


End If
If ListBox1.Value = ("ETAT MAJOR") Then
Call Etatmaj


End If
If ListBox1.Value = ("GESTION") Then
Call EtatmajGESTION


End If
If ListBox1.Value = ("LOGISTIQUE SECRETARIAT ASSISTANCE") Then
Call EtatmajLOGISTIQUESECRETARIATASSISTANCE


End If
If ListBox1.Value = ("Nouveau groupe") Then
Call EtatmajNouveaugroupe

End If

If ListBox1.Value = ("RESSOURCES HUMAINES") Then
Call EtatmajRESSOURCESHUMAINES

End If
If ListBox1.Value = ("CALVADOS") Then
Call OPEcalvados

End If

If ListBox1.Value = ("EURE") Then
Call OPEEure
End If

If ListBox1.Value = ("ORNE") Then
Call OPEOrne

End If

If ListBox1.Value = ("SEINE MARITIME") Then
Call OPEseinemaritime
End If


'etc(il y en a 20)'



End Sub



Bien évidemment, le code ne marche pas et VBA surligne la partie
If ListBox1.Value = ("APPUI ET EXPERTISE") Then



et me renvoit l'erreur dexecution 91, en précisant que la variable objet ou variable de bloc with est non-definit

J'ai essayé avec des ifelse à la place des if ( sauf le premier en enlevant les end if intermédiaires), avec des select cases (mais même probleme à la ligne "selct case listbox1.value", en introduisant des variables intermédiaires , en changeant le LIstBox1.value en selected, rien n'y fait. Il semble que le programme ne trouve pas la valeur sélectionnée de ma listbox...

J'ai donc un grand besoin d'aide

Merci d'avance

16 réponses

Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
118
Bonjour,

Essaie ceci:

Private Sub ListBox1_Click()
Select Case ListBox1.Value
Case "APPUI ET EXPERTISE"
MsgBox "Cliquez sur APPUI ET EXPERTISE"
Case "COMMUNICATION"
MsgBox "Cliquez sur COMMUNICATION"
Case "DETACHES SYNDICAUX ET SOCIAUX"
MsgBox "Cliquez sur DETACHES SYNDICAUX ET SOCIAUX"
Case "DIRECTION"
MsgBox "Cliquez sur DIRECTION"
Case "GESTION"
MsgBox "Cliquez sur GESTION"
Case Else
MsgBox "Erreur"
End Select
End Sub

Bonjour et merci pour ta réponse,
mais cette solution ne marche pas: comme avec des if, le programme ne reconnait pas d'alternative qui convient, et passe les choix un à un, sans en choisir... Le programme ne semble pas reconnaitre le "Userform1.ListBox1.Value"
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour,
Devrait alors être tout simplement :
Private toto()
Private Sub UserForm_Initialize()
toto = Array("C26:C35", "F26:F32", "I26:I32", "M26:M32", "R26:R32", "V26:V30", "")
ComboBox1.AddItem "0 - Tomate"
ComboBox1.AddItem "1 -Choux"
ComboBox1.AddItem "2 - Bettrave"
ComboBox1.AddItem "3 - Salade"
ComboBox1.AddItem "4 - Pizza"
ComboBox1.AddItem "5 - Fromage"
ComboBox1.AddItem "6 - Tout"
End Sub
Private Sub ComboBox1_Click()
If ComboBox1.ListIndex = 6 Then
ListBox1.RowSource = ("")
Else
ListBox1.RowSource = "Feuil1!" & toto(ComboBox1.ListIndex)
End If
End Sub

Ne pas utiliser (c'est maladroit) l'évènement Change d'une combobox. Il n'intervient pas uniquement lorsque l'on clique sur un choix, mais également si l'utilisateur écrit dans la zone de saisie !
PS : je ne comprends pas ton "tout", qui n'aboutit à "rien" !
Merci pour ta réponse,
mais mon problème n'est pas l'affectation des valeurs de la listbox, mais d'appeller un sub en fonction de la valeur de la listbox1 (elle même dépendante de la valeur de la combobox, j'en conviens).C'est cette ligne de code
Sub perimetre()


Dim Value As Variant


If UserForm1.ListBox1.Value = ("APPUI ET EXPERTISE") Then
Call EtatmajAPPUIETEXPERTISE
End if
If UserForm1.ListBox1.Value = ("AQHSE") Then
Call EtatmajAQHSE
End If
If UserForm1.ListBox1.Value = ("COMMUNICATION") Then
Call EtatmajCOMMUNICATION
End If
If UserForm1.ListBox1.Value = ("DETACHES SYNDICAUX ET SOCIAUX") Then
Call Etatmajdetachesyndic
End If
If UserForm1.ListBox1.Value = ("DIRECTION") Then
Call EtatmajDirection
End If
If UserForm1.ListBox1.Value = ("ETAT MAJOR") Then
Call Etatmaj
End If
If UserForm1.ListBox1.Value = ("GESTION") Then
Call EtatmajGESTION
End If
If UserForm1.ListBox1.Value = ("LOGISTIQUE SECRETARIAT ASSISTANCE") Then
End If
If UserForm1.ListBox1.Value = ("Nouveau groupe") Then
Call EtatmajNouveaugroupe
End If
If UserForm1.ListBox1.Value = ("RESSOURCES HUMAINES") Then
Call EtatmajRESSOURCESHUMAINES
End If



Mon programme ne reconnait pas les alternatives, ce que je vois bien en fragmentant le processus avec F8.

PS: la valeur tout est vide parce que je vais renvoyer tout les choix possibles, donc pas besoins de précision dans la listbox, qui ne fait que détailler le choix de la Combobox
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233 > Benjam'
1) Que signifie pour toi (et à quoi et où t'en sers-tu ?) :
Dim Value As Variant

je note à ce propos que, dans ton tout premier message, tu avais un :
Dim ListBox1 As ListBox

tout aussi incompréhensible
2) pourquoi une procédure (ta sub périmètre) ?
et pas tout simplement la procédure évènementielle Click de la listbox ?
Quelle en est la raison exacte ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
je viens de lire ta réponse à cs_Le Pivert.
Si tu clicques bien sur la listbox listbox1, le code que t'a montré cs_Le Pivert affiche FORCEMENT l'un des messages !
Lequel ?
PS : j'espère que tu as bien utilisé la procédure évènementielle Click et non une sous-routine à toi.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Non, Pas de message, rien
Les deux objets ne servent à rien, ce sont des vestige de code que j'ai essayé, mais que je n'ai pas pris la pein d'éffacer, mais je crois que cela n'impacte pas trop le reste.


Ensuite, je fais une procédure "périmêtre" parce que je l'appelle dans une autre procédure principale, avec d'autre procédures différentes, et que la procédure évenementielle "click" ou "change" ne déclenche pas le "périmêtre".
Périmêtre est déclenché par d'autres boutons de la userform, qui ont une fonctions propres et des procédures propres, mais qui doivent toutes utiliser cette même procédure"périmêtre" de détermination
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
1) veux-tu prendre dorénavant le soin (ne serait-c e que par respect et pour ne pas faire perdre du temps) de ne mettre ici que ton code, tel qu'il est écrit lorsqu'il pose problème ?
Merci de faire ce effort !
2) j'attends une réponse à mon message du 13 mars 2015 à 11:29
1) oui, mais détends toi, je suis pas en train de t'aggresser là!
2) C'est déjà fait!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
1) tu as raison ===>> je vais me "détendre", hein ... (peut-être même totalement). Tu n'as agressé personne, mais tu as fait perdre du temps
2) oui ===>> tu ne l'as fait qu_'après que je te l'ai réclamé à nouveau !.*
Si tu n'as aucun message, ni même d'erreur, c'est très clair : tu ne passes pas par cette procédure ou tu n'as pas recopié intégralement le code de cs_Le Pivert, ou encore ta procédure n'est pas dans le module de code de ton userform.
Montre le code intégral que tu as écrit ("purifié", s'il te plait ... et TEL qu'écrit) en précisant dans quel module de code tu l'as mis.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Ah oui (j'oubliais) :
Ou encore (si tu n'as pas non plus de message d'erreur) : la procédure ainsi appelée (EtatmajAPPUIETEXPERTISE, etc...) existe bien mais est sans effet visible aucun ...)
Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
118
Je suis tout a fait d'accord avec ucfoutu. Ta procédure st sans effet visible aucun. La preuve avec ce code qui fonctionne:

Private Sub CommandButton1_Click()
perimetre
End Sub
Sub perimetre()
 If UserForm1.ListBox1.Value = ("APPUI ET EXPERTISE") Then
         MsgBox "Cliquez sur APPUI ET EXPERTISE"
      End If
   If UserForm1.ListBox1.Value = ("AQHSE") Then
          MsgBox "Cliquez sur AQHSE"
           End If
    If UserForm1.ListBox1.Value = ("COMMUNICATION") Then
           MsgBox "Cliquez sur COMMUNICATION"
               End If
      If UserForm1.ListBox1.Value = ("DETACHES SYNDICAUX ET SOCIAUX") Then
         MsgBox "Cliquez sur DETACHES SYNDICAUX ET SOCIAUX"
          End If
    If UserForm1.ListBox1.Value = ("ETAT MAJOR") Then
         MsgBox "Cliquez sur ETAT MAJOR"
              End If
    If UserForm1.ListBox1.Value = ("GESTION") Then
        MsgBox "Cliquez sur GESTION"
            End If
   End Sub


Il faut chercher de ce coté là
J'ai changé les if par des case (plus clair, tu avais raison).


Dans les deux cas, j'obtiens le message d'erreur, donc le programme n'a identifié que le cas "else" alors qu'un choix dans la liste était bien selectionné.
J'en déduis que l'objet "UserForm1.ListBox1.Value " n'est pas identifié comme étant la valeur effectivement selectionnée de ma listbox1 (dans le userform)
Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
118
Comment ce fait-il que chez moi cela fonctionne en mettant la Sub perimetre() dans un module ou avec le code de l'UserForm?
Ok, alors je vais faire un effort de clareté. Voici mon code "épuré" de ce qui marche. Il commence dans un module ou j'ai définis une table (pour les valeurs de combobox):

 

Option Explicit 'Module1'


Public Table() As String

Sub benjam() 'Module1'
'Table qui définit les valeurs de la combobox1'
ReDim Table(6) As String

Table(0) = "0 - Tomate"
Table(1) = "1 -Choux"
Table(2) = "2 - Bettrave"
Table(3) = "3 - Salade"
Table(4) = "4 - Pizza"
Table(5) = "5 - Fromage"
Table(6) = "6 - Tout"
UserForm1.Show






End Sub

'Faire dépendre la source de données de la liste en fction de la combo list'


Private Sub ComboBox1_Change() 'Userform1'


Me.ListBox1.Clear

Select Case ComboBox1.Value
Case Table(0)
Me.ListBox1.List() = Worksheets("Feuil1").Range("C26:C35").Value

Case Table(1)
Me.ListBox1.List() = Worksheets("Feuil1").Range("F26:F31").Value

Case Table(2)
Me.ListBox1.List() = Worksheets("Feuil1").Range("I26:I32").Value

Case Table(3)
Me.ListBox1.List() = Worksheets("Feuil1").Range("M26:M30").Value

Case Table(4)
Me.ListBox1.List() = Worksheets("Feuil1").Range("R26:R29").Value

Case Table(5)
Me.ListBox1.List() = Worksheets("Feuil1").Range("V26:V30").Value

Case Table(6)
Me.ListBox1.List() = ""

Case Else
Me.ListBox1.List() = ""
End Select


End Sub



Maintenant, il s'agit pour moi de choisir une valeur de la liste ci-dessus.
Ensuite 4 boutons permettent d'appeller des procédures particulières.
Chaque bouton est relié à cette procédure "périmêtre"( en fait elle définit tel ou tel filtre d'un TCD, en fonction du choix de la liste)
Quand j'appuye sur un de ces bouton, voici la procédure associée:

Private Sub CommandButton7_Click() 'Userform1'

'Bloque l'écran'
Application.ScreenUpdating = False

'ici j'ai une procédure qui fonctionne'

Call perimetre

Application.ScreenUpdating = True
End Sub

La voici la sub perimetre que j'ai laissé avec des messagebox pour voir ce qui cloche:

Sub perimetre() 'Userform1'
Select Case Me.ListBox1.Value
Case "APPUI ET EXPERTISE"
MsgBox "Cliquez sur APPUI ET EXPERTISE"
Case "COMMUNICATION"
MsgBox "Cliquez sur COMMUNICATION"
Case "DETACHES SYNDICAUX ET SOCIAUX"
MsgBox "Cliquez sur DETACHES SYNDICAUX ET SOCIAUX"
Case "DIRECTION"
MsgBox "Cliquez sur DIRECTION"
Case "GESTION"
MsgBox "Cliquez sur GESTION"
Case Else
MsgBox "Erreur"
End Select
End Sub


'Et là, j 'obtiens systématiquement le message d'erreur, qu'importe la valeur de liste box selectionnée'
Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
118
Je pense que cela doit provenir du remplissage de ta listBox. Nous ne pouvons pas le vérifier. C'est à toi de voir si le texte est bien le même. Il suffit d'un espace et cela ne sera pas reconnu!!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Et là, j 'obtiens systématiquement le message d'erreur, qu'importe la valeur de liste box selectionnée'

Quoi ?
Qu'obtiens-tu exactement ?
1) un "message d'erreur" (et quel est alors ce message ?
ou
2) un message disant "erreur" (ce qui signifierait tout simplement qu'aucune des autres valeurs (telles qu'écrites/orthographiées) n'est présente dans la listbox1 de ton userform userform1
(c'est- très loin d'être la même chose !
Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
118
Les grands esprits se rencontrent (LOL) au même moment!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233 >
Messages postés
7226
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021

Bonjour, Le Pivert.
Ouais ...
(je crois que je vais aller à la pêche. C'est moins aléatoire ...)
Amitiés
2) le message disant "erreur"
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Ah ! Ce n'est pas "un message d'erreur", mais un message disant "erreur",.
Bon. Je crois que nous t'en avons on ne peut plus clairement donné la raison, tant Le Pivert que moi-même !
Mais nous allons en avoir le coeur on ne peut plus net.
1) Ajoute une textbox nommée titi sur ton userform UserForm1
2) fais ceci :
Sub perimetre() 'Userform1'
titi.text = "-" & Me.ListBox1.Value & "-" '===>> ajouté volontairement
Select Case Me.ListBox1.Value
Case "APPUI ET EXPERTISE"
MsgBox "Cliquez sur APPUI ET EXPERTISE"
Case "COMMUNICATION"
MsgBox "Cliquez sur COMMUNICATION"
Case "DETACHES SYNDICAUX ET SOCIAUX"
MsgBox "Cliquez sur DETACHES SYNDICAUX ET SOCIAUX"
Case "DIRECTION"
MsgBox "Cliquez sur DIRECTION"
Case "GESTION"
MsgBox "Cliquez sur GESTION"
Case Else
MsgBox "Erreur"
End Select
End Sub

copie/colle nous ici (intégralement) le contenu de la textbox titi

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
ce qui veut dire que :
- soit tu n'as rien sélectionné dans la listbox
- soit tu y as sélectionné une ligne vide
- soit, quelque part ailleurs que dans le code montré, tu as désélectionné l'article sélectionné auparavant
- soit, quelque part ailleurs que dans le code montré, tu as vidé ta listbox !
je préfère ne pas croire une seconde que tu sois dans le 3ème ou le 4ème cas (ce serait vraiment trop "fort du café")

J'écarte l'éventualité d'une propriété multiselect de ta listbox à autre chose que 0, car tu aurais alors eu un message d'erreur 94 et ne serais même pas arrivé à l'affichage du mot "erreur" dans tes select case !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Quel silence radio assourdissant, tout d'un coup !
Alors, maintenant, ami Benjam', qui t'es plus haut étonné et as eu des difficultés à accepter certaines remarques :
On va reprendre, entre autres, quelques-uns des aspects :
1) par ton message du 13 mars 2015 à 11:29, tu répondais avec assez d'assurance :
ce sont des vestige de code que j'ai essayé, mais que je n'ai pas pris la pein d'éffacer, mais je crois que cela n'impacte pas trop le reste.

grave erreur. l'erreur 91 que tu avais dénoncée par ton message du
12 mars 2015 à 09:37 résultait très précisément de cette "redéfinition" pour le moins étrange de ta listbox :
Dim ListBox1 As ListBox

2) Value n'est pas un "objet"
3) Listbox1.value est encore moins un objet (ton message du 13 mars 2015 à 14:40 )
4) tu remarqueras que nous avons dépassé les 20 messages pour une affaire très simple qui aurait très rapidement été élucidée si tu t'étais contenté d'exposer avec clarté l'essentiel et que tu l'avais accompagné du code que tu appelles "épuré" (et qui ne l'était d'ailleurs pas dans un premier temps).
Je pense que nous avons maintenant fait le tour complet de la question.
Bonne chance.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend