Liste déroulante en cascade

Bonjour le Forum,

Rouillé sur Excel depuis longtemps, je souhaiterais effectuer des listes déroulantes en cascade (dont le choix sur la première liste influe sur le contenu des listes suivantes) pour ensuite effectuer des recherche dans une base de donnée (exemple d'affichage cible dans l'onglet "calculette").

Ayant un fichier source ("donne") avec de nombreuses colonnes et lignes, dont le format m'est imposé et évolutif (le nombre de lignes et de colonnes de ligne variera dans le futur) je souhaite automatiser la création de ces listes déroulantes.

Etant encore moins doué sur les formules que sur le VBA😵, je me suis orienté sur du VBA.

Concrètement :

pour chaque cellule d'entête de la feuille "donne" (ligne1; dont le nb de colonne a été limité pour l'exemple) je voudrais créer un nom (égal à la valeur de la cellule) et dont la plage de référence est:
- si ligne 2 sous la cellule d'entête est vide alors plage = ligne 2 sous la cellule d'entête
- si la ligne 2 est non vide alors plage = ensemble des cellules sous la cellule d'entête.

Le code imaginé est le suivant

Sub creation_nom()

Dim i As Integer
Dim col As Long
Dim dercol As Long
Dim lig As Long
Dim Cel As Range
Dim MaVar As String
Dim sh As Worksheet
Dim NomPlage As String

'Option Explicit
'Application.ScreenUpdating = False

Worksheets("donnee").Activate
dercol = Sheets("donnee").Cells(1, 1).End(xlToRight).Column

For Each Cel In Sheets("donnee").Range(Cells(1, 1), Cells(1, dercol))
    col = Cel.Column
  '  MsgBox (col)
    NomPlage = Cel.Value

    derlig = ThisWorkbook.Worksheets("donnee").Cells(Rows.Count, col).End(xlUp).Row
      MsgBox (derlig)
        If derlig = 1 Then

            MaVar = Sheets("donnee").Cells(2, col).Address

             ActiveWorkbook.Names.Add Name:=NomPlage, RefersTo:="=donnee!" & MaVar

                  MsgBox ("Verif")

        Else

             MaVar1 = Sheets("donnee").Range(Cells(2, col), Cells(derlig, col)).Address

             ActiveWorkbook.Names.Add Name:=NomPlage, RefersTo:="=donnee!" & MaVar1
 End If

Next
'Application.ScreenUpdating = True

End Sub

(j'avais mis des "msgbox pour voir où le code bloquait)

Le pb est que ce début de code ne semble fonctionner uniquement pour la première colonne. Pouvez vous svp me dire où est mon erreur pour que l'automatisation soit fonctionnelle?

Une fois ce pb traité je m'attaquerai à la deuxième partie visant à créer la liste conditionnelle en fonction des "noms" choisis , pour laquelle je n'ai aucune idée pour l'heure😵.

Merci d'avance pour votre aide.

Pierrot

bonjour,

ton problème provient de la definition de ta plage, tu dois préciser le nom de la feuille sur laquelle se trouvent tes cellules dans ton instruction range(cell(debut),cell(fin)) sinon il prend la feuille active, et si la feuille active est différence de celle que tu as mise pour ton range, tu reçois une erreur 1004.

j'ai également ajouté une suppression des plages nommées qui existeraient déjà (à vérifier si cela te convient)

Une façon de corriger le problème

Sub creation_nom()

Dim i As Integer
Dim col As Long
Dim dercol As Long
Dim lig As Long
Dim Cel As Range
Dim MaVar As String
Dim sh As Worksheet
Dim NomPlage As String

'Option Explicit
'Application.ScreenUpdating = False
For Each pn In ActiveWorkbook.Names
 pn.Delete
 Next

With Sheets("donnee")
dercol = .Cells(1, 1).End(xlToRight).Column

For Each Cel In .Range(.Cells(1, 1), .Cells(1, dercol))
    col = Cel.Column
  '  MsgBox (col)
    NomPlage = Cel.Value

    derlig = .Cells(Rows.Count, col).End(xlUp).Row

        If derlig = 1 Then

            MaVar = .Cells(2, col).Address

             ActiveWorkbook.Names.Add Name:=NomPlage, RefersTo:="=donnee!" & MaVar

        Else

             MaVar1 = .Range(.Cells(2, col), .Cells(derlig, col)).Address

             ActiveWorkbook.Names.Add Name:=NomPlage, RefersTo:="=donnee!" & MaVar1
 End If

Next
End With
'Application.ScreenUpdating = True

End Sub

Merci h2so4!

ça fonctionne nikel.

De ce que je comprends la fonction "With" permettant de garder en mémoire la feuille active, permet d'éviter de spécifier chaque fois la feuille active.

Ce que je ne comprends pas par contre c'est pourquoi la feuille active change alors que celle ci avait été activée avant la boucle "For"?😵

En tout cas à l'avenir je passerai par "With".

Merci encore.

bonjour Pierrot,

l'instruction permet de travailler sur un objet sans devoir le répéter à chaque fois. pour cela, il suffit de faire précéder les objets enfants, les propriétés ou les méthodes d'un point.

pour faire référence à la plage de cellule A1 à la dernière cellule utilisée de la colonne A de la feuille "feuil1")

with sheets("feuil1")
 derlig=.cells(rows.count,1).end(xlup).row
 set plage=.range(.range("A1"),.cells(derlig,1))
end with
Rechercher des sujets similaires à "liste deroulante cascade"