Création listes de validation en VB

Résolu/Fermé
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 - 19 mai 2012 à 16:24
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 - 5 oct. 2012 à 13:36
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 :

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:

7 réponses

Eltorosam137 Messages postés 28 Date d'inscription samedi 15 octobre 2011 Statut Membre Dernière intervention 19 mai 2012 7
19 mai 2012 à 16:38
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é
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
19 mai 2012 à 17:12
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 ;-)
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
20 mai 2012 à 14:11
Petit up svp :-)
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
22 mai 2012 à 14:31
Up ! :)
0

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

Posez votre question
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
27 mai 2012 à 14:11
Up !
0
Bonjour,

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
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
5 oct. 2012 à 13:36
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 :

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 :-)
0