Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

wizard0147

XLDnaute Occasionnel
Bonjour à tous,

tout nouveau sur VB, je cherche à créer un menu déroulant en fonction d'un autre. J'ai donc créer ce code mais j'ai quelques petits problèlmes. Je cherche à créer un menu déroulant en B12 en fonction de la réponse en B9. Voici ce que j'ai fait pour le moment :



Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$9" Then
Range("B12") = ""
End If

Dim Z As Variant


If Range("B9") = "E150a" Then
Z = "=$A$29:$A$31"
End If

If Range("B9") = "E150b" Then
Z = "Unknown"
End If

If Range("B9") = "E150c" Then
Z = "=$C$29:$C$37"
End If

If Range("B9") = "E150d" Then
Z = "=$D$29:$D$36"
End If

If Range("B9") = "Unknown" Then
Z = "Unknown"
End If

Range("B12").Select

With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Z
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub



Le problème c'est que dès que je modifie une cellule sur la feuille, excel m'emmène directment en B12 !!! Si une âme charitable pouvait m'aider sur ce coup.

Merci d'avance
 
Re : Problème VB

bonjour wizard

A tester

Code:
Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$9" Then
Range("B12") = ""
[COLOR=blue]else[/COLOR]
[COLOR=blue]exit sub 
[/COLOR]End If

Dim Z As Variant


If Range("B9") = "E150a" Then
Z = "=$A$29:$A$31"
End If

If Range("B9") = "E150b" Then
Z = "Unknown"
End If

If Range("B9") = "E150c" Then
Z = "=$C$29:$C$37"
End If

If Range("B9") = "E150d" Then
Z = "=$D$29:$D$36"
End If

If Range("B9") = "Unknown" Then
Z = "Unknown"
End If

[COLOR=lime]'Range("B12").Select
[/COLOR]
With [COLOR=blue]Range("B12")[/COLOR].Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Z
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub
 
Re : Problème VB

Bonjour wizard0147,
mes amitiés PierreJean 😉

Sur la même idée que PierreJean, mais en changeant un peu le code
Code:
Sub Worksheet_Change(ByVal Target As Range)
  Dim Z As Variant
  ' Sortir si plus d'une cellule
  If Target.Count > 1 Then Exit Sub
  '
  If Target.Address = "$B$9" Then
    ' Empècher la gestion des évènements
    Application.EnableEvents = False
    Range("B12") = ""
    ' réactiver la gestion des évènements
    Application.EnableEvents = True
  Else
    Exit Sub
  End If
  Select Case Range("B9").Value
  Case "E150a"
    Z = "=$A$29:$A$31"
  Case "E150b"
    Z = "Unknown"
  Case "E150c"
    Z = "=$C$29:$C$37"
  Case "E150d"
    Z = "=$D$29:$D$36"
  Case "Unknown"
    Z = "Unknown"
  End Select
  Range("B12").Select
  With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
         xlBetween, Formula1:=Z
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
  End With
End Sub

A+
 
Re : Problème VB

Merci beaucoup à vous deux. Les deux méthodes marchent très bien même si j'avoue moins comprendre la seconde (Faut encore que je bosse 😉)

Malheureusement j'ai in deuxième souci. Je voudrais créer sur cette même feuille deux autres menus déroulant corrélés (en B15 et D15). J'ai donc copier le code pour le coller en desous en changeant les valeurs :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$9" Then
Range("B12") = ""
Else
Exit Sub
End If

Dim Z As Variant


If Range("B9") = "E150a" Then
Z = "=$A$29:$A$31"
End If

If Range("B9") = "E150b" Then
Z = "Unknown"
End If

If Range("B9") = "E150c" Then
Z = "=$C$29:$C$37"
End If

If Range("B9") = "E150d" Then
Z = "=$D$29:$D$36"
End If

If Range("B9") = "Unknown" Then
Z = "Unknown"
End If

Range("B12").Select

With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Z
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$15" Then
Range("D15") = ""
Else
Exit Sub
End If

Dim Z As Variant


If Range("B15") = "IMCD" Then
Z = "=$C$40:$C$45"
End If

If Range("B15") = "Sethness-Roquette" Then
Z = "=$C$40:$C$43"
End If

If Range("B15") = "Propsect" Then
Z = "None"
End If

Range("D15").Select

With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Z
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub


Mais maintenant, Excel me dit qu'il y a une erreur de compilation et que le nom est ambigü. Malheureusement en changeant le nom, la deuxième partie du code ne fonctionne pas.

Des idées ?
 
Re : Problème VB

Bonjour Wizard, PierreJean, Bruno, bonjour le forum,

Bon c'est même pas la peine ! Je demanderais bien un contrôle anti-dopage mais je ne serais même pas écouté... Je suis persuadé que nos deux compères se droguent ou alors c'est moi qui m'endort (ce qui plus probable)...

J'envoie quand même ma proposition qui me semble être, à peu de chose près, copie conforme de celle de Bruno...

Code:
Private test As Boolean 'déclare la variable test
 
Sub Worksheet_Change(ByVal Target As Range)
Dim Z As String 'déclare la variable Z
 
If test = True Then test = False: Exit Sub 'si test =true, test=false, sort de la procédure (évite la boucle sur l'événement change)
If Target.Address = "$B$9" Then 'condition : si le changement a lieu dans B9
    test = True 'définit la variable test
Else 'sinon
    Exit Sub 'sort de la procédure
End If 'fin de la condition
Range("B12") = "" 'vide B12
 
Select Case Range("B9").Value 'définit la variable Z en fonction de la valeur de B9
    Case "E150a"
        Z = "=$A$29:$A$31"
    Case "E150b"
        Z = "Unknown"
    Case Is = "E150c"
        Z = "=$C$29:$C$37"
    Case "E150d"
        Z = "=$D$29:$D$36"
    Case "Unknown"
        Z = "Unknown"
    Case Else 'tous les autres cas
        Exit Sub 'sort de la procédure
End Select 'fin de l'action eb fonction de...
 
'définit la validation de données
With Range("B12").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=Z
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
End Sub
 
Dernière édition:
Re : Problème VB

Bonjour wizard0147, Pierre-Jean et Bruno, bonjour à toutes et à tous 🙂

Envoyé par wizard0147
tout nouveau sur VB, je cherche à créer un menu déroulant en fonction d'un autre. J'ai donc créer ce code mais j'ai quelques petits problèlmes. Je cherche à créer un menu déroulant en B12 en fonction de la réponse en B9. Voici ce que j'ai fait pour le moment :



Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$9" Then
Range("B12") = ""
End If

Dim Z As Variant


If Range("B9") = "E150a" Then
Z = "=$A$29:$A$31"
End If

If Range("B9") = "E150b" Then
Z = "Unknown"
End If

If Range("B9") = "E150c" Then
Z = "=$C$29:$C$37"
End If

If Range("B9") = "E150d" Then
Z = "=$D$29:$D$36"
End If

If Range("B9") = "Unknown" Then
Z = "Unknown"
End If

Range("B12").Select

With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Z
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub

Le problème c'est que dès que je modifie une cellule sur la feuille, excel m'emmène directment en B12 !!! Si une âme charitable pouvait m'aider sur ce coup.

Dans le même genre que Bruno 😉

Code:
Sub Worksheet_Change(ByVal Target As Range)
'
Dim Z As Variant
'
  
  If Target.Address = "$B$9" Then
    InEvent = True
    
    Select Case Target
      Case "E150a"
        Z = "=$A$29:$A$31"
    
      Case "E150b" Or "Unknown"
        Z = "Unknown"
    
      Case "E150c"
        Z = "=$C$29:$C$37"
    
      Case "E150d"
        Z = "=$D$29:$D$36"
    End Select
    
    With Range("B12").Validation
      .Delete
      .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
    End With
    
  End If

End Sub

@+

PS : à tester car je n'ai qu'un petit portable de dépannage sans MSOffice.

EDIT : Bing Robert !! T'as pas eu trop mal 😉
 
Re : Problème VB

Merci à tous. J'ai finalement adopté la méthode de Nolich comme suit :

Sub Worksheet_Change(ByVal Target As Range)
'
Dim Z As Variant
'

If Target.Address = "$B$9" Then
InEvent = True

Select Case Target
Case "E150a"
Z = "=$A$29:$A$31"

Case "E150b"
Z = "Unknown"

Case "E150c"
Z = "=$C$29:$C$37"

Case "E150d"
Z = "=$D$29:$D$36"

Case "Unknown"
Z = "Unknown"
End Select

Range("B12").Select
Selection.ClearContents

With Range("B12").Validation
.Delete
.Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
End With

End If

If Target.Address = "$B$15" Then
InEvent = True

Select Case Target
Case "IMCD"
Z = "=$C$40:$C$45"

Case "Sethness-Roquette"
Z = "=$D$40:$D$43"

Case "Prospect"
Z = "None"

End Select

Range("D15").Select
Selection.ClearContents

With Range("D15").Validation
.Delete
.Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
End With

End If

End Sub
 
Re : Problème VB

Envoyé par wizard0147Merci à tous. J'ai finalement adopté la méthode de Nolich comme suit :

Sub Worksheet_Change(ByVal Target As Range)
'
Dim Z As Variant
'

If Target.Address = "$B$9" Then
InEvent = True

Select Case Target
Case "E150a"
Z = "=$A$29:$A$31"

Case "E150b"
Z = "Unknown"

Case "E150c"
Z = "=$C$29:$C$37"

Case "E150d"
Z = "=$D$29:$D$36"

Case "Unknown"
Z = "Unknown"
End Select

Range("B12").Select
Selection.ClearContents

With Range("B12").Validation
.Delete
.Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
End With

End If

If Target.Address = "$B$15" Then
InEvent = True

Select Case Target
Case "IMCD"
Z = "=$C$40:$C$45"

Case "Sethness-Roquette"
Z = "=$D$40:$D$43"

Case "Prospect"
Z = "None"

End Select

Range("D15").Select
Selection.ClearContents

With Range("D15").Validation
.Delete
.Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
End With

End If

End Sub

Dans ces lignes de code :

Code:
  If Target.Address = "$B$9" Then
    InEvent = True

Tu peux supprimer InEvent = True, pareil un peu plus loin dans la proc. C'était en fait une variable booléenne pour éviter l'appel de la procédure Worksheet_Change (j'utilise ce genre de flag) mais j'ai décidé de ne pas l'utiliser au dernier moment. C'est le résidu d'un autre code 😉

En effet, lorsque la procédure est appelée, si une valeur autre de B9, ou D15 maintenant, est modifiée, elle fait 2 tests et rend la main à la procédure appelante, ça me semble pas être trop gourmand en temps machine pour que tu as à faire 😉

Par ailleurs, sauf si tu as réellement besoin de sélectionner la cellule B12 ou D15 suivant le choix, ne change rien à ton code. Mais si tu souhaites que ta cellule active au départ de la procédure le reste, tu peux écrire (exemple pour B12) :

Code:
  With Range("B12")
    .ClearContents
    
    With .Validation
      .Delete
      .Add Type:=xlValidateList, Operator:=xlBetween, Formula1:=Z
    End With
  End With

@+
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
925
Réponses
12
Affichages
1 K
O
  • Question Question
Microsoft 365 Problème Exit sub
Réponses
9
Affichages
1 K
omario1995
O
A
Réponses
27
Affichages
2 K
adet ruireux
A
Réponses
11
Affichages
3 K
F
N
Réponses
12
Affichages
1 K
NadJP
N
T
  • Résolu(e)
XL pour MAC lenteur du vba
Réponses
16
Affichages
3 K
C
Réponses
4
Affichages
2 K
C
M
Réponses
2
Affichages
1 K
moialbert2
M
B
Réponses
1
Affichages
907
Bullrot
B
T
  • Question Question
Réponses
3
Affichages
1 K
Retour