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

Nom du fichier appelant une macro xla

7 réponses
Avatar
Frédéric
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier .xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.

7 réponses

Avatar
Hervé
Bonsoir Frédéric,
En passant un argument à ta macro, exemple :

Sub MaMacro(NomClasseur as String)
....
Msgbox NomClasseur
...
End Sub

Hervé.

"Frédéric" a écrit dans le message de
news:
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier
.xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui
est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans
le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis
que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.


Avatar
anonymousA
Bonjour,

juste pour le fun parceque la réponse d'Hervé est la plus simple.

Imaginons que ton xla soit doté d'un module de classe appelé Classe1
dont les procédures sont les suivantes

Public WithEvents cb As msforms.CommandButton
Public WithEvents Appl As Application

Private Sub Appl_SheetActivate(ByVal Sh As Object)

affectcb

End Sub

Private Sub Appl_WorkbookActivate(ByVal Wb As Workbook)

affectcb

End Sub

Private Sub cb_Click()

MsgBox cb.Parent.Parent.Name

End Sub

dans un module standard, tu écris

Dim arrcb() As New Classe1

Sub affectcb()

Dim oleobj As OLEObject
Dim wsh As Worksheet
Erase arrcb
cbloop = 1
For Each wbk In Workbooks
For Each wsh In wbk.Worksheets
For Each oleobj In wsh.OLEObjects
On Error Resume Next
typeole = oleobj.ProgId
If Err.Number = 0 Then
If typeole = "Forms.CommandButton.1" Then
ReDim Preserve arrcb(1 To cbloop)
Set arrcb(cbloop).cb = oleobj.Object
cbloop = cbloop + 1
End If
Else
Err.Clear
End If
Next
Next
Next

End Sub

puis dans le module thisworkbook de ton xla, tu mets

Dim ApplicationClass As New Classe1
Private Sub Workbook_Open()

Set ApplicationClass.Appl = Application
affectcb

End Sub


Dans ces conditions, à chaque fois qu'une feuille sera activée ou un
classeur activé ( ouvert<=>activé) , alors tous les commandbutton de
toutes les feuilles de tous les classeurs en cours dans la session en
cours seront référencés , et lors d'un click sur l'un quelconque d'entre
eux, le message indiquant leur fichier d'appartenance s'affichera.
Plutot que d'afficher le message, il est clair que l'on peut récupérer
cette valeur et s'en servir pour être utilisée dans tes procédures de
ton xla.

La faille pour l'instant de cette affaire, c'est que si on créee un
NOUVEAU commandbutton sur une feuille quelconque, ce nouveau
commandbutton ne sera référencé par le module de classe du xla que si on
change de feuille ou de classeur.On pourrait sans doute avoir une
manière de faire en truquant sur la barre d'outils controles , lors d'un
click sur le commandbuttton , la procédure par défaut d'Excel pour la
substituer à une proc perso qui déclencherait la création du
Commandbutton et lancerait la procédure affectcb mais je dois
reconnaitre que je n'ai pas essayé .

M'enfin, c'était juste pour le fun et pour montrer la puissance des
modules de classe.

A+


Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier .xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.


Avatar
anonymousA
petite précision: pour faire déclencher la macro du module de classe
"avant" celle de ton ou tes commandbuttons (en effet, la procédure
locale du commandbutton a priorité de déclenchement sur la procédure du
module de classe du commandbutton ), il faut écrire ceci dans la
procédure Private Sub CommandButton1_Click() du commandbutton
la procédure suivante.Dans l'exemple ci-dessous, le commandbutton est
dans la feuille1 du classeur

Private Sub CommandButton1_Click()
depart = Now + TimeValue("00:00:01")
Application.OnTime depart, "Feuil1.nomdelaprocédurequilancelaprocédureduxla"
end sub

sub nomdelaprocédurequilancelaprocédureduxla
Application.Run "nomdetonxla.xla!nomdelaprocéduredanslexla"
end sub

A+

Bonjour,

juste pour le fun parceque la réponse d'Hervé est la plus simple.

Imaginons que ton xla soit doté d'un module de classe appelé Classe1
dont les procédures sont les suivantes

Public WithEvents cb As msforms.CommandButton
Public WithEvents Appl As Application

Private Sub Appl_SheetActivate(ByVal Sh As Object)

affectcb

End Sub

Private Sub Appl_WorkbookActivate(ByVal Wb As Workbook)

affectcb

End Sub

Private Sub cb_Click()

MsgBox cb.Parent.Parent.Name

End Sub

dans un module standard, tu écris

Dim arrcb() As New Classe1

Sub affectcb()

Dim oleobj As OLEObject
Dim wsh As Worksheet
Erase arrcb
cbloop = 1
For Each wbk In Workbooks
For Each wsh In wbk.Worksheets
For Each oleobj In wsh.OLEObjects
On Error Resume Next
typeole = oleobj.ProgId
If Err.Number = 0 Then
If typeole = "Forms.CommandButton.1" Then
ReDim Preserve arrcb(1 To cbloop)
Set arrcb(cbloop).cb = oleobj.Object
cbloop = cbloop + 1
End If
Else
Err.Clear
End If
Next
Next
Next

End Sub

puis dans le module thisworkbook de ton xla, tu mets

Dim ApplicationClass As New Classe1
Private Sub Workbook_Open()

Set ApplicationClass.Appl = Application
affectcb

End Sub


Dans ces conditions, à chaque fois qu'une feuille sera activée ou un
classeur activé ( ouvert<=>activé) , alors tous les commandbutton de
toutes les feuilles de tous les classeurs en cours dans la session en
cours seront référencés , et lors d'un click sur l'un quelconque d'entre
eux, le message indiquant leur fichier d'appartenance s'affichera.
Plutot que d'afficher le message, il est clair que l'on peut récupérer
cette valeur et s'en servir pour être utilisée dans tes procédures de
ton xla.

La faille pour l'instant de cette affaire, c'est que si on créee un
NOUVEAU commandbutton sur une feuille quelconque, ce nouveau
commandbutton ne sera référencé par le module de classe du xla que si on
change de feuille ou de classeur.On pourrait sans doute avoir une
manière de faire en truquant sur la barre d'outils controles , lors d'un
click sur le commandbuttton , la procédure par défaut d'Excel pour la
substituer à une proc perso qui déclencherait la création du
Commandbutton et lancerait la procédure affectcb mais je dois
reconnaitre que je n'ai pas essayé .

M'enfin, c'était juste pour le fun et pour montrer la puissance des
modules de classe.

A+



Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un
fichier .xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur
qui est à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement
dans le fichier .xls, et l'instruction "Thisworkbook.name" suffisait.
Mais depuis que je les ai copiées dans le fichier .xla, forcément,
l'instruction "Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.




Avatar
Frédéric
Bonjour Hervé,
Ta réponse semble effectivement très simple, mais à tel point que je ne vois
pas comment ca peut marcher!
J'ai n classeurs .xls qui utilisent des macros écrites dans "toto.xla" (car
c'est bien le but des .xla que de mettre à dispo des macros pour plusieurs
classeurs).
Dans chacun des n classeurs, j'ai un bouton qui appelle la même macro du
.xla. Et ce que je voudrais, c'est avoir un moyen dans cette macro de
connaitre le nom du classeur qui est à l'origine de l'appel, sachant qu'il
peut y en avoir n...
La solution de notre ami "AnonymousA" est prometeuse, mais j'espérais
effectivement qu'il existe un moyen plus simple d'y arriver...
As tu une autre idée?
Fred.



Bonsoir Frédéric,
En passant un argument à ta macro, exemple :

Sub MaMacro(NomClasseur as String)
....
Msgbox NomClasseur
...
End Sub

Hervé.

"Frédéric" a écrit dans le message de
news:
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier
.xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui
est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans
le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis
que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.







Avatar
michdenis
Bonjour Frédéric,

Si tes boutons dans feuille sont des boutons issus de la barre d'outils "Formulaire", et que tu appelles directement une fonction
dans un fichier .xla, tu peux utiliser ceci :

A ) pour assigner une fonction ou une sub à un bouton (barre outils Formulaire),
Menu contextuel -> attacher une macro
Saisir manuellement le nom de la fonction (sub) à joindre

B ) Un exemple comment récupérer le nom du classeur d'où
la fonction a été appelée.

'------------------------
Public Function Bonsoir()

Dim Bouton As Button
Set BTN = ActiveSheet.Buttons(Application.Caller)

MsgBox "Nom du classeur est : " & _
BTN.TopLeftCell.Parent.Parent.Name

'Le reste du code pour lequel tu as écris cette fonction...

End Function
'------------------------


Salutations!




"Frédéric" a écrit dans le message de news:
Bonjour Hervé,
Ta réponse semble effectivement très simple, mais à tel point que je ne vois
pas comment ca peut marcher!
J'ai n classeurs .xls qui utilisent des macros écrites dans "toto.xla" (car
c'est bien le but des .xla que de mettre à dispo des macros pour plusieurs
classeurs).
Dans chacun des n classeurs, j'ai un bouton qui appelle la même macro du
.xla. Et ce que je voudrais, c'est avoir un moyen dans cette macro de
connaitre le nom du classeur qui est à l'origine de l'appel, sachant qu'il
peut y en avoir n...
La solution de notre ami "AnonymousA" est prometeuse, mais j'espérais
effectivement qu'il existe un moyen plus simple d'y arriver...
As tu une autre idée?
Fred.



Bonsoir Frédéric,
En passant un argument à ta macro, exemple :

Sub MaMacro(NomClasseur as String)
....
Msgbox NomClasseur
...
End Sub

Hervé.

"Frédéric" a écrit dans le message de
news:
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier
.xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui
est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans
le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis
que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.







Avatar
Frédéric
Bonjour Denis,
Merci pour cette réponse.
La solution que tu proposes fonctionne, mais dans ce cas, je comprends
finalement qu'il suffit d'utiliser l'instruction "ActiveWorkbook.Name"!
Puisque toi tu utilises "ActiveSheet" pour savoir sur quelle feuille était le
bouton...

Ca me va, sauf qu'en général, j'évite tout ce qui est "Active....." (cells,
sheet...) parce que dans l'éxécution d'une macro, c'est évidemment ammené à
changer, et dans ce cas, gare aux erreurs...

Mais bon, si je m'en sers juste à l'appui bouton, l'ActiveWorkbook a quand
même de bonnes chances d'être celui qui contient le bouton!

Merci et A+



Bonjour Frédéric,

Si tes boutons dans feuille sont des boutons issus de la barre d'outils "Formulaire", et que tu appelles directement une fonction
dans un fichier .xla, tu peux utiliser ceci :

A ) pour assigner une fonction ou une sub à un bouton (barre outils Formulaire),
Menu contextuel -> attacher une macro
Saisir manuellement le nom de la fonction (sub) à joindre

B ) Un exemple comment récupérer le nom du classeur d'où
la fonction a été appelée.

'------------------------
Public Function Bonsoir()

Dim Bouton As Button
Set BTN = ActiveSheet.Buttons(Application.Caller)

MsgBox "Nom du classeur est : " & _
BTN.TopLeftCell.Parent.Parent.Name

'Le reste du code pour lequel tu as écris cette fonction...

End Function
'------------------------


Salutations!




"Frédéric" a écrit dans le message de news:
Bonjour Hervé,
Ta réponse semble effectivement très simple, mais à tel point que je ne vois
pas comment ca peut marcher!
J'ai n classeurs .xls qui utilisent des macros écrites dans "toto.xla" (car
c'est bien le but des .xla que de mettre à dispo des macros pour plusieurs
classeurs).
Dans chacun des n classeurs, j'ai un bouton qui appelle la même macro du
..xla. Et ce que je voudrais, c'est avoir un moyen dans cette macro de
connaitre le nom du classeur qui est à l'origine de l'appel, sachant qu'il
peut y en avoir n...
La solution de notre ami "AnonymousA" est prometeuse, mais j'espérais
effectivement qu'il existe un moyen plus simple d'y arriver...
As tu une autre idée?
Fred.



Bonsoir Frédéric,
En passant un argument à ta macro, exemple :

Sub MaMacro(NomClasseur as String)
....
Msgbox NomClasseur
...
End Sub

Hervé.

"Frédéric" a écrit dans le message de
news:
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier
.xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui
est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans
le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis
que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.












Avatar
michdenis
Bonjour Frédéric,

Ton propos est juste.. j'essayais seulement de remonter au nom du classeur à partir du bouton.

Évidemment, comme la fonction est appelé suite à un clic de souris sur le bouton, il est difficile que la feuille ne soit pas active
et par conséquent le classeur qui la contient ! ;-)


Salutations!



"Frédéric" a écrit dans le message de news:
Bonjour Denis,
Merci pour cette réponse.
La solution que tu proposes fonctionne, mais dans ce cas, je comprends
finalement qu'il suffit d'utiliser l'instruction "ActiveWorkbook.Name"!
Puisque toi tu utilises "ActiveSheet" pour savoir sur quelle feuille était le
bouton...

Ca me va, sauf qu'en général, j'évite tout ce qui est "Active....." (cells,
sheet...) parce que dans l'éxécution d'une macro, c'est évidemment ammené à
changer, et dans ce cas, gare aux erreurs...

Mais bon, si je m'en sers juste à l'appui bouton, l'ActiveWorkbook a quand
même de bonnes chances d'être celui qui contient le bouton!

Merci et A+



Bonjour Frédéric,

Si tes boutons dans feuille sont des boutons issus de la barre d'outils "Formulaire", et que tu appelles directement une fonction
dans un fichier .xla, tu peux utiliser ceci :

A ) pour assigner une fonction ou une sub à un bouton (barre outils Formulaire),
Menu contextuel -> attacher une macro
Saisir manuellement le nom de la fonction (sub) à joindre

B ) Un exemple comment récupérer le nom du classeur d'où
la fonction a été appelée.

'------------------------
Public Function Bonsoir()

Dim Bouton As Button
Set BTN = ActiveSheet.Buttons(Application.Caller)

MsgBox "Nom du classeur est : " & _
BTN.TopLeftCell.Parent.Parent.Name

'Le reste du code pour lequel tu as écris cette fonction...

End Function
'------------------------


Salutations!




"Frédéric" a écrit dans le message de news:

Bonjour Hervé,
Ta réponse semble effectivement très simple, mais à tel point que je ne vois
pas comment ca peut marcher!
J'ai n classeurs .xls qui utilisent des macros écrites dans "toto.xla" (car
c'est bien le but des .xla que de mettre à dispo des macros pour plusieurs
classeurs).
Dans chacun des n classeurs, j'ai un bouton qui appelle la même macro du
..xla. Et ce que je voudrais, c'est avoir un moyen dans cette macro de
connaitre le nom du classeur qui est à l'origine de l'appel, sachant qu'il
peut y en avoir n...
La solution de notre ami "AnonymousA" est prometeuse, mais j'espérais
effectivement qu'il existe un moyen plus simple d'y arriver...
As tu une autre idée?
Fred.



Bonsoir Frédéric,
En passant un argument à ta macro, exemple :

Sub MaMacro(NomClasseur as String)
....
Msgbox NomClasseur
...
End Sub

Hervé.

"Frédéric" a écrit dans le message de
news:
Bonjour,
Dans un fichier excel, j'ai un bouton qui appelle une macro d'un fichier
.xla.
Dans le macro appelée, je souhaiterais récupérer le nom du classeur qui
est
à l'origine de l'appel de la macro...

Savez vous comment faire?

Car avant d'utiliser un fichier .xla, les macros étaient directement dans
le
fichier .xls, et l'instruction "Thisworkbook.name" suffisait. Mais depuis
que
je les ai copiées dans le fichier .xla, forcément, l'instruction
"Thisworkbook.name" renvoie le nom du fichier .xla...

Merci pour votre aide!
Frederic.