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 SubMerci 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