Création listes de validation en VB

Résolu
sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   -  
sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   -
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 !

--
Si votre problème est résolu, merci de clôturer le sujet en cliquant sur "Problème résolu".
Administrateur réseaux sous Windows Serveur 2003

7 réponses

  1. Eltorosam137 Messages postés 33 Statut Membre 7
     
    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
  2. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    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
  3. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Petit up svp :-)
    0
  4. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Up ! :)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Up !
    0
  7. Utilisateur anonyme
     
    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
  8. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    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