Genérer des listes en cascade par macro

Bonsoir,

J'ai beau chercher, je n'arrive pas à reproduire mes différentes trouvailles du forum sur mon cas.

pour présenter mon problème.

_____ je reçois un fichier xls d'un sous-traitant. (formulaire.xls)

_____ j'ai un outil (outil.xls) qui va automatiquement après sélection du bon formulaire, ajouter des colonnes, mettre en forme...

Ce que je souhaite, c'est que sur les colonnes ajoutées, j'ai des listes en cascade.

Je ne souhaite pas lui fournir mes listes en cascade, je ne peux le faire qu'après la réception de son fichier.

Mes différentes listes sont stockés dans un onglet "liste" de mon outil.xls

    formulaire.Worksheets("Formulaire").Activate
    Outil.Sheets("Liste").Copy After:=formulaire.Sheets("Formulaire")

    Sheets("Liste").Range(Cells(2, 5), Cells(Range("E" & Rows.Count).End(xlUp).Row, 5)).Name = "Choix1"
    Sheets("Liste").Range(Cells(2, 6), Cells(Range("F" & Rows.Count).End(xlUp).Row, 6)).Name = "Choix2"

    With Sheets("Formulaire").Range("M30:M49").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Choix1"

    End With
    With Sheets("Formulaire").Range("N30:N49").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Choix2"
    End With

    x = ActiveSheet.CodeName

    Code = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbCrLf
    Code = Code & "If Not Intersect([M30:M49], Target) Is Nothing And Target.Count = 1 Then" & vbCrLf
    Code = Code & "Sheets(""Liste"").range(""g2"") = """" " & vbCrLf
    Code = Code & "Sheets(""Liste"").range(""C1:D1000"").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets(""Liste"").range(""E1""), Unique:=True" & vbCrLf
    Code = Code & "End If" & vbCrLf
    Code = Code & "If Not Intersect([N30:N49], Target) Is Nothing And Target.Count = 1 Then" & vbCrLf
    Code = Code & "Sheets(""Liste"").[g2] = Target.Offset(, -1)" & vbCrLf
    Code = Code & "Sheets(""Liste"").[C1:D1000].AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets(""Liste"").[g1:g2], CopyToRange:=Sheets(""Liste"").[F1]" & vbCrLf
    Code = Code & "End If" & vbCrLf
    Code = Code & "End Sub"

    With ActiveWorkbook.VBProject.VBComponents(x).CodeModule
        NextLine = .CountOfLines + 1
        .insertlines NextLine, Code
    End With

Avec ca, mes cellules ("M30:M49") recoivent bien choix1 comme liste de validation

Mais les cellules ("N30:N49") ne sont pas dynamiques.

Je vous ai joint le formulaire généré.

Une idée?

30sos-13038-panam.zip (25.09 Ko)

Bonjour

Le code était placé dans la mauvaise feuille

Modification des noms des colonnes dans la page "Liste"

Modification des zone nommées "Choix1" et Choix2" afin de les rendre dynamiques

Merci pour ton aide.

Mais peux tu me donner le code à inclure dans outil.xls ?

je ne sais comment decliner tes modifications dans mon code.

Bonsoir

Je ne sais pas si je vais y arriver

Mais il me faut déjà le fichier Outils.xls

ci joint les fichiers outil et formulaire.

Par avance, merci

26outils.zip (39.72 Ko)
30formulaire.zip (12.88 Ko)

Bonjour

A tester

Penses à remettre le bon chemin dans la macro

Merci beaucoup. cela fonctionne parfaitement.

Pour me coucher moins bete (et eviter de redemander la prochaine fois), peux tu m'expliquer les lignes suivantes, stp ?

ActiveWorkbook.Names.Add Name:="Choix1", RefersToR1C1:= _

"=OFFSET(Liste!R2C5,,,COUNTA(Liste!C5)-1)"

ActiveWorkbook.Names.Add Name:="Choix2", RefersToR1C1:= _

"=OFFSET(Liste!R2C6,,,COUNTA(Liste!C6)-1)"

Bonjour

Cela crée une zone dynamique (ses dimensions varient en fonction du nombre de noms dans la zone)

Rajoutent des noms dans la colonne E et la zone "Choix1" englobera toujours tous les noms

Idem pour "Choix2"

Une fois que la macro ait fait son boulot, va voir dans le gestionnaire des noms

Ok.

super merci.

Rechercher des sujets similaires à "generer listes cascade macro"