Création listes de validation en VB
Résolu
sipherion
Messages postés
2462
Statut
Membre
-
sipherion Messages postés 2462 Statut Membre -
sipherion Messages postés 2462 Statut Membre -
Bonjour à tous,
Attention, ce cas est un cas de maîtrise dans Excel VBA :-)
Je vous explique. J'ai une liste de critères, et pour chacun des sous critère.
L'utilisateur sélectionne un critère dans une liste déroulante qui, sous effet d'une marco, devrait mettre à jour une autre liste déroulante contenant les sous critères rattachés au critère sélectionné.
Voici le code que j'essaye de mettre en place :
Si vous avez bien compris le code, je voudrais qu'il me fasse une validation en sélectionnant la plage qui contient des données ; la boucle doit s'arrêter quand il n'y a plus de données pour ne pas avoir de ligne vides dans la liste déroulante.
Pour traduire, la ligne :
"=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
Est la même que
=$S$43:$S$46
Et c'est apparemment ce fragment que le With Selection n'arrive pas à interpréter.
En attendant, j'ai forcé mes validations en déclarant chaque plage selon le critère initial.
Pouvez vous m'aider à m'en sortir ?
Merci d'avance !
Attention, ce cas est un cas de maîtrise dans Excel VBA :-)
Je vous explique. J'ai une liste de critères, et pour chacun des sous critère.
L'utilisateur sélectionne un critère dans une liste déroulante qui, sous effet d'une marco, devrait mettre à jour une autre liste déroulante contenant les sous critères rattachés au critère sélectionné.
Voici le code que j'essaye de mettre en place :
For projet = 18 To 40 If Sheets("Saisie").Cells(42, projet).Value = "" Then MsgBox ("Une erreur s'est produite.") Exit Sub End If If Range("F7").Value = Cells(42, projet).Value Then For a = 43 To 60 If Cells(a, projet).Value = "" Then Exit For End If Next Exit For End If Next Range("J7").Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With
Si vous avez bien compris le code, je voudrais qu'il me fasse une validation en sélectionnant la plage qui contient des données ; la boucle doit s'arrêter quand il n'y a plus de données pour ne pas avoir de ligne vides dans la liste déroulante.
Pour traduire, la ligne :
"=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
Est la même que
=$S$43:$S$46
Et c'est apparemment ce fragment que le With Selection n'arrive pas à interpréter.
En attendant, j'ai forcé mes validations en déclarant chaque plage selon le critère initial.
Pouvez vous m'aider à m'en sortir ?
Merci d'avance !
A voir également:
- Création listes de validation en VB
- Ethernet n'a pas de configuration ip valide - Guide
- Creation de site web - Guide
- Creation de compte google - Guide
- Creation compte gmail - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
7 réponses
Bonjour,
Moi pour obtenir des liste déroulantes qui nécessitent deux filtres avancé sur une plage dont je récupère les valeurs par "copier les valeurs dans une autre plage", de cette plage j'effectue un second filtre avancé avec la même manip
pour ne pas avoir de bloc vide dans ta liste déroulante tu dois utiliser une méthode xldown pour descendre jusqu'en bas de toutes tes données et ajouter toutes tes valeurs en remontant de cellule en cellule avec la méthode add jusqu'au moment ou la cellule est égale au contenu du sommet de ta colonne et ainsi tu as le contenu résultant de ton filtre avancé
Moi pour obtenir des liste déroulantes qui nécessitent deux filtres avancé sur une plage dont je récupère les valeurs par "copier les valeurs dans une autre plage", de cette plage j'effectue un second filtre avancé avec la même manip
pour ne pas avoir de bloc vide dans ta liste déroulante tu dois utiliser une méthode xldown pour descendre jusqu'en bas de toutes tes données et ajouter toutes tes valeurs en remontant de cellule en cellule avec la méthode add jusqu'au moment ou la cellule est égale au contenu du sommet de ta colonne et ainsi tu as le contenu résultant de ton filtre avancé
Salut Eltorosam137, et merci pour ta réponse :)
Mais je ne comprends pas ce que tu veux dire, tu parles de filtres automatiques avancés alors que ce n'est pas du tout le sujet :-)
Cela concerne la création d'une liste de valeur pour la validation du contenu d'une cellule.
Cependant, j'aimerais bien en savoir un peu plus sur cette méthode xldown et add, si tu pouvais me donner un exemple ce serait sympas ;-)
Mais je ne comprends pas ce que tu veux dire, tu parles de filtres automatiques avancés alors que ce n'est pas du tout le sujet :-)
Cela concerne la création d'une liste de valeur pour la validation du contenu d'une cellule.
Cependant, j'aimerais bien en savoir un peu plus sur cette méthode xldown et add, si tu pouvais me donner un exemple ce serait sympas ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Voici comment je procède :
n.b. Serie est ici une adresse explicite, ex.: $G$53:$H$78 sous
forme de string.
Je recommande de construire la formule à côté :
trouver la concordance de :
"=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
Dim Serie As String
Serie = "=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
à transformer vers
Serie = "=$E$36:$E$54"
quelque chose comme :
Serie = "=$E$" & CStr(projet - 10) & ":$" & CStr( projet - 10 ) & "$" & CStr( a - 8 )
dans mon classeur remplie de types pour l'adressage j'ai
3 étages de liste déroulante qui ont cette spécificité de
dépendre l'une de l'autre, le choix de la première influe
le contenu de la deuxième et le choix de la deuxième
influe le contenu de la troisième et le choix de la troisième
inscrit un montant dans une colonne de même ligne.
l'adressage RC est plutôt difficile à manipuler, plus abstrait j'en convient.
Cdt
Lupin
Voici comment je procède :
' Affectation de la série à la cellule Serie = "" Serie = PtrRecherche.Niv1OutPtr.Niv2OutSeries Cible.Offset(0, adrBFctColA_Spec).Validation.Delete Cible.Offset(0, adrBFctColA_Spec).Validation.Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=Serie
n.b. Serie est ici une adresse explicite, ex.: $G$53:$H$78 sous
forme de string.
Je recommande de construire la formule à côté :
trouver la concordance de :
"=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
Dim Serie As String
Serie = "=R[36]C[" & projet - 10 & "]:R[" & a - 8 & "]C[" & projet - 10 & "]"
à transformer vers
Serie = "=$E$36:$E$54"
quelque chose comme :
Serie = "=$E$" & CStr(projet - 10) & ":$" & CStr( projet - 10 ) & "$" & CStr( a - 8 )
dans mon classeur remplie de types pour l'adressage j'ai
3 étages de liste déroulante qui ont cette spécificité de
dépendre l'une de l'autre, le choix de la première influe
le contenu de la deuxième et le choix de la deuxième
influe le contenu de la troisième et le choix de la troisième
inscrit un montant dans une colonne de même ligne.
l'adressage RC est plutôt difficile à manipuler, plus abstrait j'en convient.
Cdt
Lupin
Bonjour Lupin, et désolé d'avoir mis si longtemps à répondre, pas mal de soucis au boulot ces derniers mois ;-)
J'ai finalement abandonné ce projet complexe ; il y a peu de liste déroulantes à faire automatiquement, j'ai donc créé un code spécifique pour chacune d'elle en posant une condition pour chaque sélection initiale.
En gros je fais :
Etc, jusqu'au End If
Merci encore de ton aide :-)
J'ai finalement abandonné ce projet complexe ; il y a peu de liste déroulantes à faire automatiquement, j'ai donc créé un code spécifique pour chacune d'elle en posant une condition pour chaque sélection initiale.
En gros je fais :
If Range("F12").Value = "Liste1" Then With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=$P$4:$P$4" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With ElseIf Range("F12").Value = "Liste2" Then With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=$Q$4:$Q$4" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With ElseIf ...............
Etc, jusqu'au End If
Merci encore de ton aide :-)