[VBA excel] liste deroulante a nom variable

Fermé
JsJulieta - 19 oct. 2006 à 12:04
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 - 26 oct. 2006 à 02:14
hello
un petit souci sous VBA excel, en fait c est plutot un gros puisque ca fait plusieurs jours q je m arrach les cheveux dessus sans trouver la solution. voici ma bete noire :
j ai cree un programme qui permet de creer une liste deroulante
en gros sous excel ca marche comme ca :
- je selectionne ma ligne de donnes (dans la premiere colonne j ai un code, et les colonnes suivantes sont les differents noms de zone auquel le code peut appartenir)
-je defini alors une liste dont le nom est automatiquement la premiere colonne (insert/name/define desolee excel v. ang), la reference de la liste sera les 5 cellules suivantes
- dans une autre feuille, je selectionne la cellule dans laquelle je veu creer ma liste et je fais data/validation
- dans le menu qui apparait, onglets parametres : allow list et je choisis comme source la liste q j ai cree juste avant: insert/name/paste
- je n oublie pas de cocher d ignorer les cellules vides puisque chaque code n appartient pas forcement a 5 zones.
vous me suivez toujour?
alors je me di chouette ca va etre facile sous vba, eh ben non car le nom de la liste q je cree a chque nouvelle ligne change (c est le contenu de ma premiere cellule) et impossible de trouver comment faire. je vous montre la partie epineuse du prog :



(a as string, i as integer)
For i = 2 To 1345
Workbooks("Modele for new program").Worksheet("result").Activate
Rows(i).Select
a = Cells(i, 1).Value
ActiveWorkbook.Names.Add Name:=a,
RefersToR1C1:= _
"=result!R2C2:R2C256"
Sheets("final").Select
Cells(i, 2).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=AB21_1BB"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

Next i

(en italique ce qui bloque)
j ai essaye de changer plusieurs fois la syntaxe mais sans jamais trouver
de plus, meme en choisissant d ignorer les blancs, ils apparaissent qd meme dans ma liste...
alors si vous avez une petite solution, merci de m aider!
A voir également:

13 réponses

J'aimerais bien t'aider mais je comprends pas exactement ton problème...
Quel est le résultat obtenu, quelles différence avec celui que tu veux, en quoi c'est genant etc
0
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
19 oct. 2006 à 15:29
en fait si tu as en premiere colonne le mot X et puis 3 cellules suivantes sur la meme ligne contenant des infos sur X, je veux creer dans une autre feuille une cellule avec X dedans et a cote une cellule avec liste deroulante comprenant le contenu des 3 cellules precedentes.
pour cela je cree sous vba une liste avec les 3 cellules et je leur attribue un nom, a savoir celui contenu dans la premiere colonne (par exemple X) :
a = Cells(i, 1).Value
ActiveWorkbook.Names.Add Name:=a, RefersToR1C1:= _
"=result!R2C2:R2C4"
je veux creer une liste deroulante pour chacune des premieres cellules, donc creer pour chaque ligne une liste sous vba avec comme nom le contenu de la premiere cellule (le nom de cette liste variera donc pour chaque ligne).
Le probleme est que si la variable a = le contenu de chaque premiere cellule, et qu ensuite la liste doit prendre le nom contenu dans a, eh bien ca bug
Name:=a VBA comprend pas et j arrive pas a trouver la bonne syntaxe
aurai tu une idee?
0
J'avoue que là je vois pas trop le problème...

Met un point d'arret juste avant ta ligne name:=a, et avec la fenetre d'execution VB (affichage fenetre d'execution) regarde ce que contient a en tapant : " ? a" et entrée.

essaye aussi en déclarant ta variable au tout début de ton code
dim a as string
0
autre chose...

il semble que t'oublies d'incrémenter les valeurs des listes à ce niveau

RefersToR1C1:= _ 
"=result!R2C2:R2C256" 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
19 oct. 2006 à 16:52
quand je met le point d arret, a contient "X" (avec les guillemets, normal c est une chaine de caractere) ce qui en theorie est normalement reconnu par la commande Name, enfin c est ce que je croyais!
en fait niveau syntaxe ca devrait etre marque comme ca: Name:="X"
Mais comme le nom varie a chaque fois, je suis obligee de preciser que le nom est egal a la variable a et donc de retirer les guillemets. et si je les mets, il croit que le nom de la liste est a chaque fois le mot "a"
en ce qui concerne la variable, pas de souci elle est bien definie au debut comme une chaine de caractere.
pour: "il semble que t'oublies d'incrémenter les valeurs des listes à ce niveau

RefersToR1C1:= _
"=result!R2C2:R2C256
"
il y a en effet une erreur. je croi q les chiffres qui font reference a l emplacement des cellules sont une reference fixe (designe l'emplacement dans la feuille) et pas relative (emplacement par rapport a la cellule selectionnee). du coup ca me fai un probleme supplementaire, car mes chiffres doivent varier en meme temps que je passe a la ligne suivante...
0
Il semblerait que le problème se situe bien au niveau des guillemets...

Je suppose que si tu mets le nom de la liste en dur ca marche... A ce moment là il faut essayer de bidouiller sur ca.

Pour créer ta macro tu as utilisé l'enregistreur?

Sinon pour ton 2ème problème, tu peux passer utiliser l'autre syntaxe 'un truc genre R[2]C[2] qui veut dire la ligne courante + 2, la colonne courante +2 (un truc du genre, ca fait 2 ans que j'ai pas fait de VB excel) ou alors tu te sert de ton i... A mon avis les 2 doivent marcher.
Je regarderai demain pour otn nom de variable

Bonne soirée et bon courage
0
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
19 oct. 2006 à 17:31
ok ca marche pour les references de liste je vai utiliser ce que tu m a conseille
pour creer le programme, je me suis efectivement base sur l enregistrement de la macro, mais bon ca a pas toujours du bon.. si tu veu modifier un truc, eh ben ca marche plus!
en tou k merci pour ton aide, je vai continuer a m arracher les cheveux sur le probleme encore un peu pour aujourd hui.
Bonne soiree a toi aussi, tiens moi au courant si tu as du nouveau
merci
0
Re bonjour!

J'ai un peu regardé chez moi vite fait et j'ai pas eu le meme problème que toi.
Avec le meme code (à peu près)...

J'ai bien réussi à créer 2 listes. Le contenu était le meme mais ca c'est normal car j'ai laissé les références fixes comme toi.

La seule chose qui change par rapport à toi c'est ma déclaration de variables faite avec dim, et la ligne avec workbook machin que j'ai pas.
Sinon ta ligne rows(i).select est inutile je pense...

Préviens moi si jamais ca marche
Bon courage
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
20 oct. 2006 à 10:51
Bonjour,

sans trop approfondir ton pb (au passage, un fichier joint aurait facilité la compréhension!), je pense que la solution repose sur l'utilisation de la fonction INDIRECT() que tu positionnes dans la définition de ta liste de validation.

donc a priori pas besoin de code pour cela.

voici un exemple : https://www.cjoint.com/?kukZuvllyr


A+
0
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
25 oct. 2006 à 16:51
merci pour ces reponses, je vai essayer de suite!
0
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
25 oct. 2006 à 16:52
merci pour ces reponses, je vai essayer de suite!
0
JsJulieta Messages postés 6 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
25 oct. 2006 à 16:56
merci pour ces reponses, je vai essayer de suite!
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
26 oct. 2006 à 02:14
Bonsoir,

une solution plus complète et sans macro :

tu définis un nom disons "test" avec :
test=DECALER(Feuil1!$A$1;EQUIV(Feuil1!$B$4;Feuil1!$A$1:$A$1000;0)-1;1;1;NBVAL(INDEX(Feuil1!$1:$1000;EQUIV(Feuil1!$B$4;Feuil1!$A$1:$A$1000;0);0))-1)

où B4 contient une première liste de validation pour choisir le premier niveau de nom.

tu mets en C4 une validation liste =test et le tour est joué.

si tu veux un fichier, regarde https://www.cjoint.com/?kAcoesVkze

cordialement
0