Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA: comment connaitre le nom de la liste déroulante qui a appelé la macro?

11 réponses
Avatar
Laurent
bonjour



j'ai 42 listes déroulantes qui appellent des macros identiques

donc, je ne veux pas faire 42 macros mais une qui s'adapterait à
chacune des listes déroulantes

dans la macro, je veux le nom de la liste déroulante qui l'a appelée..
comment faire?

c'est dans controlformat?

merci
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

10 réponses

1 2
Avatar
michdenis
Bonjour Laurent,

Comme tu ne donnes pas de détails... je suppose que tu veux le faire par toi-même !

Si A1 a une liste de validatation, Adr contient l'adresse de la cellule
Adr = Range("A1").Validation.Parent.Address

B contient =Maliste si MaListe est une plage de données
auquel réfère la liste de validation en A1
B = Range("A1").Validation.Formula1

Pour ce qui est du reste, tu dois avoir ta petite idée !


Salutations!




"Laurent" a écrit dans le message de news:
bonjour



j'ai 42 listes déroulantes qui appellent des macros identiques

donc, je ne veux pas faire 42 macros mais une qui s'adapterait à
chacune des listes déroulantes

dans la macro, je veux le nom de la liste déroulante qui l'a appelée..
comment faire?

c'est dans controlformat?

merci
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp
Avatar
Laurent
Le Fri, 26 Aug 2005 20:07:26 +0200, Laurent


Bonjour

je ne voyais pas de réponse arriver donc je suis allé sur google
groups et comme d'hab, une réponse non reçue par le serveur news de
free... je ne sais pas pourquoi... grrr.

merci pour cette réponse, mais je ne comprends pas l'intérêt de ces
macros... en effet, il faut que je sache déjà l'emplacement de la
liste pour avoir..... l'emplacement de la liste.

Adr = Range("A1").Validation.Parent.Address
me retourne A1
Adr = Range("A2").Validation.Parent.Address
me retourne A2

quelque chose a du m'échapper.Je reprécise ma question:

en fait, j'ai 42 zones de listes déroulantes dans une feuille. Chaque
liste appelle une base de données qui affiche l'image correspondante
au mot choisi.
La macro type marche mais actuellement j'ai du faire 42 macros presque
identiques, soit une pour chaque liste.

Mon objectif est de faire une macro universelle qui s'adapterait en
fonction du nom de la liste déroulante qui l'a activée. mais pour
cela, j'ai besoin de connaitre un élément au moins de la zone de liste
qui a activé la macro (soit la cellule liée, soit le nom de la liste,
ou autre)

quelques pistes:

peut on passer un paramètre dans une macro activée par zone de liste?

existe t il une propriété du type activeshape ? (j'ai pas trouvé)

pardon si ma question est idiote mais je ne suis débutant en VBA



merci



2. michdenis 26 août 20:42 afficher les options
Groupes de discussion : microsoft.public.fr.excel
De : "michdenis" - Rechercher les messages de cet auteur
Date : Fri, 26 Aug 2005 14:42:38 -0400
Local : Ven 26 août 2005 20:42
Objet : Re: comment connaitre le nom de la liste déroulante qui a appelé la macro?
Répondre | Répondre à l'auteur | Transférer | Imprimer | Message individuel | Afficher l'original | Signaler un cas d'utilisation abusive

Bonjour Laurent,

Comme tu ne donnes pas de détails... je suppose que tu veux le faire par toi-même !

Si A1 a une liste de validatation, Adr contient l'adresse de la cellule
Adr = Range("A1").Validation.Parent.Address

B contient =Maliste si MaListe est une plage de données
auquel réfère la liste de validation en A1
B = Range("A1").Validation.Formula1

Pour ce qui est du reste, tu dois avoir ta petite idée !

Salutations!

bonjour



j'ai 42 listes déroulantes qui appellent des macros identiques

donc, je ne veux pas faire 42 macros mais une qui s'adapterait à
chacune des listes déroulantes

dans la macro, je veux le nom de la liste déroulante qui l'a appelée..
comment faire?

c'est dans controlformat?

merci


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
michdenis
Bonjour Laurent,

comme ta question se précise, tu pourrais essayer ceci :

Dans le module feuille où se retrouve lesdites cellules :

'-------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim A As Variant
On Error Resume Next
With Target.Validation
A = .InCellDropdown
If Err <> 0 Then
On Error GoTo 0
Exit Sub
Else
Call MaSub(Target)
End If
End With

End Sub
'-------------------------------------

Sub MaSub(Rg As Range)
'Le traitement que tu désires !
Dim Plg As String

With Rg
With .Validation
Plg = Right(.Formula1, Len(.Formula1) - 1)
MsgBox "adresse de la liste déroulante : " & Range(Plg).Name
End If
End With
End Sub
'-------------------------------------


Salutations!



"Laurent" a écrit dans le message de news:
Le Fri, 26 Aug 2005 20:07:26 +0200, Laurent


Bonjour

je ne voyais pas de réponse arriver donc je suis allé sur google
groups et comme d'hab, une réponse non reçue par le serveur news de
free... je ne sais pas pourquoi... grrr.

merci pour cette réponse, mais je ne comprends pas l'intérêt de ces
macros... en effet, il faut que je sache déjà l'emplacement de la
liste pour avoir..... l'emplacement de la liste.

Adr = Range("A1").Validation.Parent.Address
me retourne A1
Adr = Range("A2").Validation.Parent.Address
me retourne A2

quelque chose a du m'échapper.Je reprécise ma question:

en fait, j'ai 42 zones de listes déroulantes dans une feuille. Chaque
liste appelle une base de données qui affiche l'image correspondante
au mot choisi.
La macro type marche mais actuellement j'ai du faire 42 macros presque
identiques, soit une pour chaque liste.

Mon objectif est de faire une macro universelle qui s'adapterait en
fonction du nom de la liste déroulante qui l'a activée. mais pour
cela, j'ai besoin de connaitre un élément au moins de la zone de liste
qui a activé la macro (soit la cellule liée, soit le nom de la liste,
ou autre)

quelques pistes:

peut on passer un paramètre dans une macro activée par zone de liste?

existe t il une propriété du type activeshape ? (j'ai pas trouvé)

pardon si ma question est idiote mais je ne suis débutant en VBA



merci



2. michdenis 26 août 20:42 afficher les options
Groupes de discussion : microsoft.public.fr.excel
De : "michdenis" - Rechercher les messages de cet auteur
Date : Fri, 26 Aug 2005 14:42:38 -0400
Local : Ven 26 août 2005 20:42
Objet : Re: comment connaitre le nom de la liste déroulante qui a appelé la macro?
Répondre | Répondre à l'auteur | Transférer | Imprimer | Message individuel | Afficher l'original | Signaler un cas d'utilisation
abusive

Bonjour Laurent,

Comme tu ne donnes pas de détails... je suppose que tu veux le faire par toi-même !

Si A1 a une liste de validatation, Adr contient l'adresse de la cellule
Adr = Range("A1").Validation.Parent.Address

B contient =Maliste si MaListe est une plage de données
auquel réfère la liste de validation en A1
B = Range("A1").Validation.Formula1

Pour ce qui est du reste, tu dois avoir ta petite idée !

Salutations!

bonjour



j'ai 42 listes déroulantes qui appellent des macros identiques

donc, je ne veux pas faire 42 macros mais une qui s'adapterait à
chacune des listes déroulantes

dans la macro, je veux le nom de la liste déroulante qui l'a appelée..
comment faire?

c'est dans controlformat?

merci


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
Laurent
Le Sat, 27 Aug 2005 07:12:37 -0400, "michdenis"

Bonjour Laurent,

comme ta question se précise, tu pourrais essayer ceci :

Dans le module feuille où se retrouve lesdites cellules :

'-------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim A As Variant
On Error Resume Next
With Target.Validation
A = .InCellDropdown
If Err <> 0 Then
On Error GoTo 0
Exit Sub
Else
Call MaSub(Target)
End If
End With

End Sub
'-------------------------------------

Sub MaSub(Rg As Range)
'Le traitement que tu désires !
Dim Plg As String

With Rg
With .Validation
Plg = Right(.Formula1, Len(.Formula1) - 1)
MsgBox "adresse de la liste déroulante : " & Range(Plg).Name
End If
End With
End Sub
'-------------------------------------


Merci pour ta réponse rapide...

Excuse moi, je dois être complètement bouché ou débile mais je ne
comprends rien à ta solution...

1) quelle macro est appelée par la liste déroulante?

Worksheet_SelectionChange ? dans ce cas, quel paramètre je lui donne
et comment? Target ça correspond à quoi? et d'ailleurs est ce
possible d'attribuer une fonction privée avec paramètre à une liste
déroulante?

2) Que font en gros ces macros? MaSub récupère la formule dans la
cellule qu'on lui met en paramètre, j'imagine mais l'autre, je vois
pas... la variable err, d'ou vient elle? à quoi sert elle?
.InCellDropdown , ça sert à quoi? ça fait quoi?

je te rappelle que je ne connais pas la cellule où se trouve la liste
déroulante utilisée vu qu'il y en a 42 et que je ne sais pas celle qui
est appelée.

actuellement le programme marche avec mes 42 macros portant un nom
différent pour chaque liste mais ça rame et en plus c'est pas
élégant..

je voudrais un moyen de fusionner ces 42 en 1 seule mais il me faut
avoir un élément de la liste qui a appelé la macro au moins ...

aie aie.. je sens que ce n'est pas simple.



merci pour ta patience !
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
michdenis
As-tu seulement copiée le code dans ton module feuille ou tu as des cellules de validatation
????????????????????????????????????????

Qu'est-ce qui se passe lorsque tu cliques dans une cellule qui a une liste de validation versus une cellule qui n'en a pas ?

L'as-tu testé ? Si tu exécutes le code pas à pas à l'aide en mettant un point d'arrêt sur la première ligne de code, tu devrais
avoir un début de réponse à ta question.

Ce que tu veux faire n'est pas défini dans ta question, faut quand même pas demander au répondeur de deviner tes intentions !


Salutations!





"Laurent" a écrit dans le message de news:
Le Sat, 27 Aug 2005 07:12:37 -0400, "michdenis"

Bonjour Laurent,

comme ta question se précise, tu pourrais essayer ceci :

Dans le module feuille où se retrouve lesdites cellules :

'-------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim A As Variant
On Error Resume Next
With Target.Validation
A = .InCellDropdown
If Err <> 0 Then
On Error GoTo 0
Exit Sub
Else
Call MaSub(Target)
End If
End With

End Sub
'-------------------------------------

Sub MaSub(Rg As Range)
'Le traitement que tu désires !
Dim Plg As String

With Rg
With .Validation
Plg = Right(.Formula1, Len(.Formula1) - 1)
MsgBox "adresse de la liste déroulante : " & Range(Plg).Name
End If
End With
End Sub
'-------------------------------------


Merci pour ta réponse rapide...

Excuse moi, je dois être complètement bouché ou débile mais je ne
comprends rien à ta solution...

1) quelle macro est appelée par la liste déroulante?

Worksheet_SelectionChange ? dans ce cas, quel paramètre je lui donne
et comment? Target ça correspond à quoi? et d'ailleurs est ce
possible d'attribuer une fonction privée avec paramètre à une liste
déroulante?

2) Que font en gros ces macros? MaSub récupère la formule dans la
cellule qu'on lui met en paramètre, j'imagine mais l'autre, je vois
pas... la variable err, d'ou vient elle? à quoi sert elle?
.InCellDropdown , ça sert à quoi? ça fait quoi?

je te rappelle que je ne connais pas la cellule où se trouve la liste
déroulante utilisée vu qu'il y en a 42 et que je ne sais pas celle qui
est appelée.

actuellement le programme marche avec mes 42 macros portant un nom
différent pour chaque liste mais ça rame et en plus c'est pas
élégant..

je voudrais un moyen de fusionner ces 42 en 1 seule mais il me faut
avoir un élément de la liste qui a appelé la macro au moins ...

aie aie.. je sens que ce n'est pas simple.



merci pour ta patience !
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
Laurent
Le Sat, 27 Aug 2005 08:55:51 -0400, "michdenis"

As-tu seulement copiée le code dans ton module feuille ou tu as des cellules de validatation
????????????????????????????????????????



oui , j'ai recopié..

Qu'est-ce qui se passe lorsque tu cliques dans une cellule qui a une liste de validation versus une cellule qui n'en a pas ?


rien. il ne se passe rien. ce qui est normal puisqu'aucune macro n'est
appelée. Je pense que je n'ai pas du comprendre d'où mes questions...

L'as-tu testé ? Si tu exécutes le code pas à pas à l'aide en mettant un point d'arrêt sur la première ligne de code, tu devrais
avoir un début de réponse à ta question.


je n'ai pas pu executer le code .

Ce que tu veux faire n'est pas défini dans ta question, faut quand même pas demander au répondeur de deviner tes intentions !


oui certes... Pardon, si je m'exprime dans des termes peu précis mais
j'ai toujours l'impression de débuter en VBA même s'il m'est arrivé de
faire des trucs complexes.

Une fois que j'aurai le nom du shape qui définit la liste déroulante,
je peux me débrouiller tout seul mais le probleme c'est que je
n'arrive pas à savoir quelle liste déroulante (posée sur les cellules)
a été activée pour lancer la macro


Merci pour ta réponse rapide...

Excuse moi, je dois être complètement bouché ou débile mais je ne
comprends rien à ta solution...

1) quelle macro est appelée par la liste déroulante?

Worksheet_SelectionChange ? dans ce cas, quel paramètre je lui donne
et comment? Target ça correspond à quoi? et d'ailleurs est ce
possible d'attribuer une fonction privée avec paramètre à une liste
déroulante?

2) Que font en gros ces macros? MaSub récupère la formule dans la
cellule qu'on lui met en paramètre, j'imagine mais l'autre, je vois
pas... la variable err, d'ou vient elle? à quoi sert elle?
.InCellDropdown , ça sert à quoi? ça fait quoi?

je te rappelle que je ne connais pas la cellule où se trouve la liste
déroulante utilisée vu qu'il y en a 42 et que je ne sais pas celle qui
est appelée.

actuellement le programme marche avec mes 42 macros portant un nom
différent pour chaque liste mais ça rame et en plus c'est pas
élégant..

je voudrais un moyen de fusionner ces 42 en 1 seule mais il me faut
avoir un élément de la liste qui a appelé la macro au moins ...

aie aie.. je sens que ce n'est pas simple.



merci pour ta patience !


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
michdenis
Bonjour Laurent,

Tu as un fichier exemple là : http://cjoint.com/?iBrxzofphN

Pour ce qui est de l'adresse du "shape" dont tu parles, je ne saisi pas trop... on parle de liste de validation ...et ceci n'est pas
une "Shape" au sens où excel définit ce qu'est un objet "shape"


Salutations!



"Laurent" a écrit dans le message de news:
Le Sat, 27 Aug 2005 08:55:51 -0400, "michdenis"

As-tu seulement copiée le code dans ton module feuille ou tu as des cellules de validatation
????????????????????????????????????????



oui , j'ai recopié..

Qu'est-ce qui se passe lorsque tu cliques dans une cellule qui a une liste de validation versus une cellule qui n'en a pas ?


rien. il ne se passe rien. ce qui est normal puisqu'aucune macro n'est
appelée. Je pense que je n'ai pas du comprendre d'où mes questions...

L'as-tu testé ? Si tu exécutes le code pas à pas à l'aide en mettant un point d'arrêt sur la première ligne de code, tu devrais
avoir un début de réponse à ta question.


je n'ai pas pu executer le code .

Ce que tu veux faire n'est pas défini dans ta question, faut quand même pas demander au répondeur de deviner tes intentions !


oui certes... Pardon, si je m'exprime dans des termes peu précis mais
j'ai toujours l'impression de débuter en VBA même s'il m'est arrivé de
faire des trucs complexes.

Une fois que j'aurai le nom du shape qui définit la liste déroulante,
je peux me débrouiller tout seul mais le probleme c'est que je
n'arrive pas à savoir quelle liste déroulante (posée sur les cellules)
a été activée pour lancer la macro


Merci pour ta réponse rapide...

Excuse moi, je dois être complètement bouché ou débile mais je ne
comprends rien à ta solution...

1) quelle macro est appelée par la liste déroulante?

Worksheet_SelectionChange ? dans ce cas, quel paramètre je lui donne
et comment? Target ça correspond à quoi? et d'ailleurs est ce
possible d'attribuer une fonction privée avec paramètre à une liste
déroulante?

2) Que font en gros ces macros? MaSub récupère la formule dans la
cellule qu'on lui met en paramètre, j'imagine mais l'autre, je vois
pas... la variable err, d'ou vient elle? à quoi sert elle?
.InCellDropdown , ça sert à quoi? ça fait quoi?

je te rappelle que je ne connais pas la cellule où se trouve la liste
déroulante utilisée vu qu'il y en a 42 et que je ne sais pas celle qui
est appelée.

actuellement le programme marche avec mes 42 macros portant un nom
différent pour chaque liste mais ça rame et en plus c'est pas
élégant..

je voudrais un moyen de fusionner ces 42 en 1 seule mais il me faut
avoir un élément de la liste qui a appelé la macro au moins ...

aie aie.. je sens que ce n'est pas simple.



merci pour ta patience !


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
Laurent
Le Sat, 27 Aug 2005 10:30:15 -0400, "michdenis"



Pour ce qui est de l'adresse du "shape" dont tu parles, je ne saisi pas trop... on parle de liste de validation ...et ceci n'est pas
une "Shape" au sens où excel définit ce qu'est un objet "shape"


le malentendu vient de là donc...

argh ! inculte que je suis, je ne connaissais pas ces listes de
validations ! celle ci semblent figées sur une cellule de la grille
contrairement à ce que j'utilise mais ça m'arrange car j'ai
l'impression que c'est moins gourmand en ressources non?

moi j'utilisais barre d'outils/formulaire puis "zone de liste
déroulante" donc c'est bien une shape et dans ce cas, j'étais
coincé...

je vais donc tout réanalyser à partir de ces nouvelles données...

merci en tout cas.


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
michdenis
Bonjour Laurent,

Si tes listbox ou combobox provient de la barre d'outils "Formulaire"

Tu peux ATTACHER cette macro à tous tes contrôles et tu vas n'avoir besoin que de une macro.

Dès que tu va cliquer sur un item de ta liste déroulante, la macro va s'exécuter

'---------------------------------------
Sub MacroGeneral()

Dim A As String, B As String
Dim C As String, D As String
Dim Sh As Shape
With Worksheets("Feuil1")
Set Sh = .Shapes(Application.Caller)
End With
With Sh
A = "Nom de la Shape : " & .Name
B = "Nom de la feuille : " & .Parent.Name
C = "Adresse de la cellule en haut à gauche : " & .TopLeftCell
D = "Adresse de la cellule en bas à droite : " & .BottomRightCell
End With
MsgBox "Information sur : " & vbCrLf & _
A & vbCrLf & B & vbCrLf & C & vbCrLf & D


'Le reste du code que tu veux faire

End Sub
'---------------------------------------


Salutations!




"Laurent" a écrit dans le message de news:
Le Sat, 27 Aug 2005 10:30:15 -0400, "michdenis"



Pour ce qui est de l'adresse du "shape" dont tu parles, je ne saisi pas trop... on parle de liste de validation ...et ceci n'est
pas
une "Shape" au sens où excel définit ce qu'est un objet "shape"


le malentendu vient de là donc...

argh ! inculte que je suis, je ne connaissais pas ces listes de
validations ! celle ci semblent figées sur une cellule de la grille
contrairement à ce que j'utilise mais ça m'arrange car j'ai
l'impression que c'est moins gourmand en ressources non?

moi j'utilisais barre d'outils/formulaire puis "zone de liste
déroulante" donc c'est bien une shape et dans ce cas, j'étais
coincé...

je vais donc tout réanalyser à partir de ces nouvelles données...

merci en tout cas.


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

Avatar
Laurent
Le Sat, 27 Aug 2005 12:33:37 -0400, "michdenis"

OK SUPER ... CA MARCHE.. tout était dans le "application.caller" que
je ne connaissais pas ...

Bravo...

peux tu m'expliquer succintement dans quels cas on doit utiliser les
listbox ou combox plutot que les listes de validation ?
est ce que l'une est plus limitée que l'autre? plus gourmande en
ressources? c'est quoi la différence?
par exemple, comme ma base de données n'est pas sur la meme feuille,
il me dit que dans la liste de validation, je ne dois pas faire
référence à une autre feuille, donc je suis obligé de passer par les
listbox si je ne veux pas recopier en double une partie de ma base?


tu as l'air de bien t'y connaître en VBA apparemment.. Moi je marche
par tatonnements sans vraiment maîtriser les concepts de propriétés,
méthodes.. je les oublie aussitôt après les avoir utilisées... mais
malgré tout j'arrive à mes fins à chaque fois... j'ai fait un
classeur moyennes pour les profs:
http://membres.lycos.fr/rolfan/moyennes.html version 9.6 si tu as le
temps d'y jeter un coup d'oeil pour critiquer.. !

merci encore pour le temps passé... je garde tout ça précieusement.



Bonjour Laurent,

Si tes listbox ou combobox provient de la barre d'outils "Formulaire"

Tu peux ATTACHER cette macro à tous tes contrôles et tu vas n'avoir besoin que de une macro.

Dès que tu va cliquer sur un item de ta liste déroulante, la macro va s'exécuter

'---------------------------------------
Sub MacroGeneral()

Dim A As String, B As String
Dim C As String, D As String
Dim Sh As Shape
With Worksheets("Feuil1")
Set Sh = .Shapes(Application.Caller)
End With
With Sh
A = "Nom de la Shape : " & .Name
B = "Nom de la feuille : " & .Parent.Name
C = "Adresse de la cellule en haut à gauche : " & .TopLeftCell
D = "Adresse de la cellule en bas à droite : " & .BottomRightCell
End With
MsgBox "Information sur : " & vbCrLf & _
A & vbCrLf & B & vbCrLf & C & vbCrLf & D


'Le reste du code que tu veux faire

End Sub


--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

1 2