Liste déroulante créée par VBA
Bonjour à tous,
j'ai pas mal cherché sur le problème mais j'ai essayé diverses solutions trouvées sur le net, rien n'y fait...
J'ai un code qui, sous certaines conditions qui ne nous intéressent pas ici, est censé appliquer à des cellules une liste déroulante dynamique.
En gros : j'ai un tableau structuré contenant des dates et j'ai nommé 'dates' la plage de cellules contenant ces dates (car on ne peut pas directement citer le tableau dans la liste de validation). La formule permet d'appliquer à des cellules une liste déroulante contenant une partie seulement du tableau, ceci en fonction de la valeur de la cellule située en colonne M sur la même ligne ; cette dernière contient une date et le but est que la liste déroulante parte de cette date (chaque cellule concernée par la formule aura donc une liste déroulante qui contient les dates mais à chaque fois, on ne démarre pas de la même date)...
Bon, je reconnais que c'est peu clair.
La ligne en français, avec les double guillemets est celle-ci, mais ça ne fonctionne pas (précision: je sélectionne bien la cellule au préalable): j'ai une erreur 1004.
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""source!L"" & EQUIV(INDIRECT(""M"" & LIGNE());dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates)&"":L""&EQUIV(MAX(dates);dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates);FAUX)"En anglais, ce n'est pas mieux:
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""source!R"" & MATCH(INDIRECT(""M"" & ROW()),dates,1)+ROW(dates)-1 & ""C"" & COLUMN(dates) & "":R"" & MATCH(MAX(dates),dates,1)+ROW(dates)-1 & ""C"" & COLUMN(dates),FALSE)"Pourtant, quand j'entre directement la formule (en français avec des simples guillemets) dans la fenêtre Excel (sans passer par VBA), ça fonctionne.
Quelqu'un saurait-il d'où peut venir le problème, svp?
Merci par avance.
Yohann
Bonjour,
Merci de joindre un fichier à ta demande.
Cdlt.
Voici un fichier allégé.
C'est la colonne jaune sur laquelle on est censé avoir une liste de validation.
Merci à toi.
Précision: la macro se lance à la modification de la feuille Gantt.
J'ai enfin trouvé.
En fait, il y a deux problèmes:
- la cellule qu'on prend pour référence (date à partir de laquelle on souhaite démarrer la liste) ne doit pas être vide (il faut une date)
- l'utilisation de INDIRECT au format R1C1 n'est pas conseillée: quand VBA retranscrit la formule en français dans la liste de validation de la cellule, il ne remplace par R (row) par L (ligne) => on obtient alors une liste qu'on ne peut pas dérouler et il faut modifier à la main le R en L
Le bout de code est donc celui-ci (je simplifie). On remarque qu'il faut aussi calculer la lettre où se situe la liste des dates : LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1)
With plage
.Validation.Delete
If Range("M" & row()) <> "" Then
.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= _
"=INDIRECT(""source!"" & LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1) & MATCH(INDIRECT(""M"" & ROW()), dates, 1) + ROW(dates) - 1 & "":"" & LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1) & MATCH(MAX(dates), dates, 1) + ROW(dates) - 1)"
End If
End With