VBA Excel 2003: appeler une macro

Fermé
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008 - 12 mars 2008 à 15:56
rvduclos Messages postés 2 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 7 mai 2008 - 7 mai 2008 à 14:28
Bonjour,

Qui pourra me dire pourquoi Excel ne veut pas exécuter le code suivant:

Public xlfile as String

sub AddtotoMenu

[code...]

On Error Resume Next
xlfile = "D:\toto.xls"
With cbcCustomSubMenu1.Controls.Add(Type:=msoControlButton)
.Caption = "toto"
.OnAction = "'Runxlfile " & xlfile & "'"
End With

[code...]

end sub

Sub Runxlfile(xlfile As String)

On Error Resume Next
Workbooks.Open (xlfile)

End Sub

Lorsque je clique sur le sous-menu toto, J'obtiens un message me disant qu'Excel ne parvient pas à trouver la macro <chemin>\'!Runxlfile toto.xls

Le chemin est bon et j'ai vérifié mes variables.

Un grand merci par avance pour votre aide.

PG

A voir également:

20 réponses

rvduclos Messages postés 2 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 7 mai 2008 2
7 mai 2008 à 14:28
Super amigo !

et pourtant j'avais fais des tests avec ces simples cotes, mais surement pas comme il le faut !!!!

Pour conclure à tous ceux qui cherchent encore:

ton CstOnAction = "'OuvreTemplate " & dq & fich & dq & "'"
avec dq = Chr(34) '(double Quote) fonctionne très bien

mais plus simplement quand on met une double cote entre des doubles cotes, il suffit de la doubler comme ceci :
CstOnAction = "'OuvreTemplate """ & fich & """'"
CstOnAction = "'OuvreTemplate(""" & fich & """)'" Et cela fonctionne aussi avec les parenthèses.

Mais par contre, il a bien un souci avec la gestion d'erreur dans Excel, car si le fichier à ouvrir C:\toto2.xls n'existe pas, il dit : Impossible de trouver la macro 'OuvreTemplate("C:\toto2.xls")' , c'est pas très logique !!!
Le tout c'est de le savoir, maintenant que cela fonctionne, c'est le pied.
Merci Amigo de ton aide.
2
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 15:58
Euh, les deux Sub qui se suivent, c'est normal?
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 16:06
Pourquoi pas?

Les deux procs sont dans le même module. C'est un problème?
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 16:08
Excuse, il me semblait avoir vu une ligne qui commençait par Sub sub ....

Je regarde dès que j'ai un moment :-)
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 16:17
En fait, il vaut mieux que j'explique ce que je cherche à faire, car il est possible qu'il y ait une bien meilleure méthode pour arriver à mes fins:

J'ai créé un sous-menu personnalisé dans lequel il y a un article, appelons-le "toto"; si je clique sur "toto", j'ouvre le classeur "toto.xls".

J'utilise la propriété .onaction du control "toto" pour lancer une macro qui est censée ouvrir le classeur toto.

Mais c'est là que je bute.

Ma question est: de toute façon, comment lancer à partir d'un control une macro qui ouvre un fichier dont en plus le chemin et le nom lui sont passés comme variable?

Merci par avance.

PG
0
bonjour,

J'ai essayé ce code et ça fonctionne, si ça peut t'aider.

Private Sub CommandButton1_Click()
Dim chemin As String
Dim fichier As String

chemin = "d:\perso\"
fichier = "calendrier2008.xls"

Runxlfile (chemin & fichier)

End Sub



Sub Runxlfile(xlfile As String)

On Error Resume Next
Workbooks.Open (xlfile)

End Sub
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 18:08
Merci, amigo, mais cela ne résout pas mon problème.

Comment je fais pour appeler ta proc à partir de mon sous-menu. Mon but est: quand je clique sur l'article de mon sous-menu toto, je veux appeler le fichier toto.xls.

Merci d'avance.
0

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

Posez votre question
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 18:24
Re :-)

Ce que tu appelles sous-menu, c'est un formulaire?

Et ce que tu appelles article, c'est kel genre de contrôle?
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 18:32
Merci à tous.

Je crois que le plus simple est que je vous soumette mon code:

Sub AddFavoriteMenus()

On Error Resume Next
Application.CommandBars(1).Controls("Fa&voris").Delete

Application.CommandBars(1)

Set cbcCustomMenu = cbMainMenuBar.Controls.Add(Type:=msoControlPopup)

cbcCustomMenu.Caption = "Fa&voris"

Set cbcCustomSubMenu1 = cbcCustomMenu.Controls.Add(Type:=msoControlPopup)
' Give the control a caption
cbcCustomSubMenu1.Caption = "Perso"

On Error Resume Next
xlfile = "toto.xls"
With cbcCustomSubMenu1.Controls.Add(Type:=msoControlButton)
.Caption = "toto"
.OnAction = "'Runxlfile " & xlfile & "'"
End With

End Sub

Sub Runxlfile(xlfile As String)

On Error Resume Next
Workbooks.Open (xlfile)

End Sub

Tout commentaire et critique sont les bienvenus.

PG
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 18:27
Si ton contrôle Article, tu utilises la fonction : MouseDown

Genre :

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox "toto"
End Sub
0
Bonjour,

En lisant ton code il y a une ligne qui me parait bizare

.OnAction = "'Runxlfile " & xlfile & "'"

si xlfile = "c:\toto.xls" ça donnerait
.OnAction = 'Runxlfile c:\toto.xls'

alors que la syntaxe serait plutot
.OnAction ="Runxlfile c:\toto.xls" (doubles cotes et non simples cotes)

En plus s'il y a des blancs dans le chemin genre "c:\Mes Documents\toto.xls" ça donnerait
.OnAction = "Runxlfile c:\Mes Documents\toto.xls"

A l'appel de la procédure Runxlfile, tu lui passerait 2 paramètres , c:\Mes et Documents\toto.xls

Essaye cette écriture
With cbcCustomSubMenu1.Controls.Add(Type:=msoControlButton)
.Caption = "toto"
.OnAction = "Runxlfile (" & chr(34) & xlfile & chr(34) & ")"
End With

chr(34) c'est le code ASCII de " ce qui donnerait: Runxlfile (" c:\Mes Documents\toto.xls "), c'est mieux.

A+
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 20:16
Merci amigo pour ton temps et pour le conseil.

J'ai essayé ton code et j'obtiens toujours le message "Impossible de trouver la macro 'Runxlfile("c:\toto")'.

Je vais également essayer la suggestion de Fxbrg.

PG
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 20:10
Ok, j'avais pas compris que tu étais dans les barres de menu...

A mon avis, déplace ta sub RunXlfile dans un module, du même classeur et ça devrait le faire... Après il y aura peut-être un problème de syntaxe pour ouvrir ton fichier, mais au moins il doit te trouver le chemin de la macro...
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 20:23
Merci à toi aussi, Fxbrg.

J'ai bien déplacé la proc vers un autre modlue mais oualou!

Même message que cité plus haut: impossible de trouver la macro.

Ma question: comment lancer un fichier à partir d'une procédure elle-même appelée par clic sur un article de menu personnalisé.

Je m'y prends sans doute par le mauvais chemin.

Cordialement.

PG
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 20:24
Pour ton info, j'ai fait le test suivant : à la place de Runxlfile sur onaction, j'ai mis "Hello", et j'obtiens le message "impossible de trouver "chemin!macro Hello". j'ai donc créé une macro Hello, avec l'assistant, que j'ai appelé Hello, et là il me la trouve sans problème. Par défaut, l'assistant crée les ùacros dans le module1, d'où ma suggestion...:-)

Reste le problème de syntaxe... je suis dessus!
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
12 mars 2008 à 20:36
Question bête, tu es obligé de passé ton argument Toto.xls? Tu ne peux pas l'écrire en dur dans une macro, quitte, selon le nom du fichier, à créer ta macro dans le code?
0
A mon avis, c'est le passage de paramètre qui ne marche pas.

Si tu mets juste...

With cbcCustomSubMenu1.Controls.Add(Type:=msoControlButton)
.Caption = "toto"
.OnAction = "Runxlfile"
End With

...ça marchera.
Ill faut déclarer xlfie dans une variable Public dans un module.

Public xlfile as String

A un moment donné tu affecte à xlfile la chaine "toto.xls", avant d'activer le sous-menu.
La procedure Runxlfile n'a pas de paramètre.

Sub Runxlfile()
On Error Resume Next
Workbooks.Open (xlfile)
End Sub
0
pjg111 Messages postés 9 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 24 juillet 2008
12 mars 2008 à 20:53
Merci à amigo et aussi à Fxbrg.

Amigo, cela marche.

J'avais oublié de le dire: xlfile était déclarée comme variable publique dans mon code.

Là où cela fonctionne, c'est que j'ai supprimé les arguments de Runxlfile().

Cordialement à tous.

PG
0
Fxbrg Messages postés 711 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 16 novembre 2013 198
13 mars 2008 à 08:38
Cool... bravo Amigo :-)
0
J'ai exactement le même message d'erreur que pjg911 : impossible de trouver la macro 'Runxlfile("toto.xls")'.

Et pourtant, j'ai bien mis les paramètres de Runxlfile.

Cela ne rentre même pas dans la procédure (j'ai mis un msgbox pour tester), car j'ai un cas perso ou le menu est créé à partir des infos d'une base de donnée (le onaction aussi) et où l'action sur le menu lance la macro car le msgbox se lance mais pas l'open workbook !!!!! Et chose étrange le msgbox se lance 2 fois à chaque fois !!! (ça sent le bug Microsoft ou une protection pour ne pas lancer un fichier, non ?)

Quelqu'un a t-il une idée pour lancer une procédure (avec paramètres) à partir d'un menu Excel créé en VBA ?

C'est à se mordre... les doigts !!


Option Explicit

Sub AddFavoriteMenus()
Dim cbcCustomMenu As CommandBarControl
Dim cbcCustomButton As CommandBarControl
Dim xlfile As String

' supprime le menu si deja existant
On Error Resume Next
Application.CommandBars(1).Controls("Perso").Delete

'création menu déroulant
Set cbcCustomMenu = Application.CommandBars(1).Controls.Add(Type:=msoControlPopup)
cbcCustomMenu.Caption = "Perso"

xlfile = "C:\toto.xls"

'création bouton
Set cbcCustomButton = cbcCustomMenu.Controls.Add(Type:=msoControlButton)
With cbcCustomButton
.Caption = "toto"
.OnAction = "Runxlfile(""" & xlfile & """)"
End With

End Sub
'procédure de test vérifiant que la procédure avec paramètre fonctionne bien
Sub test()
Call Runxlfile("C:\toto.xls")
End Sub
'procédure avec parametre
Public Sub Runxlfile(xlfile As String)

MsgBox xlfile

Workbooks.Open xlfile

End Sub
0
Salut,

Comme il est expliqué plus haut tu dois déclarer xlfile dans un module:
Public xlfile as String

Ensuite:

xlfile = "C:\toto.xls"
'création bouton
Set cbcCustomButton = cbcCustomMenu.Controls.Add(Type:=msoControlButton)
With cbcCustomButton
.Caption = "toto"
.OnAction = "Runxlfile" 'sans paramètre
End With


Enfin la procédure dans un module:

Sub Runxlfile()
On Error Resume Next
Workbooks.Open (xlfile)
End Sub


Lorsque tu selectionnes toto dans le menu, la routine Runxlfile est exécutée.

A+.
0
Alors là je n'ai pas tout compris car cela n'est pas la première question !!!
Evidemment, si c'est pour une constante, pas d'intérêt d'une procédure avec paramètre. Autant écrire la procédure en dure Runxlfile_toto.

Mais dans ce cas là, pour une procédure avec paramètres, avez vous une solution ?

J'ai refait un exemple ci-dessous comme si vous obteniez le Caption et le OnAction d'une requète d'une base de données par exemple: la procédure est introuvable ???
Si vous avez mis tout ce code dans un module Excel (et non dans ThisWorkbook), vous verez que le MsgBox de la procédure à variable se lance (2 fois d'ailleurs !!!) mais pas la fonction Workbooks.Open.


Option Explicit

Sub Auto_Close()
Call deleteFavoriteMenu
End Sub

Sub deleteFavoriteMenu()
On Error Resume Next
Application.CommandBars(1).Controls("Perso").Delete

End Sub
Sub AddFavoriteMenus()
Dim cbcCustomMenu As CommandBarControl
Dim cbcCustomButton As CommandBarControl
Dim xlfile As String
Dim CstCaption As String
Dim CstOnAction As String
Dim N As Integer

' supprime le menu si deja existant
Call deleteFavoriteMenu

'création menu déroulant
Set cbcCustomMenu = Application.CommandBars(1).Controls.Add(Type:=msoControlPopup)
cbcCustomMenu.Caption = "Perso"



For N = 1 To 3
' imaginons que ces deux Constante viennent d'une autre source (BDD)
CstCaption = "toto" & N
CstOnAction = "OuvreTemplate(""C:\toto" & N & ".xls"")"

'création bouton
Set cbcCustomButton = cbcCustomMenu.Controls.Add(Type:=msoControlButton)
With cbcCustomButton
.Caption = CstCaption
.OnAction = CstOnAction
End With
Next N

End Sub

'procédure avec parametre
Public Sub OuvreTemplate(xlfile As String)

MsgBox xlfile

Workbooks.Open xlfile

End Sub
0
Bonjour,

Le problème c'est que cette ligne
CstOnAction = "OuvreTemplate(""C:\toto" & N & ".xls"")"
OuvreTemplate n'est pas considérée comme une procédure avec passage de paramètre mais comme une procédure dont le nom est la concaténation de "OuvreTemplate(""C:\toto" & N & ".xls"")" et donc cette procédure n'existe pas. C'est pour cette raison de la procédure OuvreTemplate ne doit pas admettre de paramètres.

Je vais chercher, et si je trouve une astuce, je la posterai.

A+.
0
Merci Amigo,
de t'intéresser à ce problème qui revient d'ailleurs assez souvent sur le web mais sans réponse vraiment (ou tout du moins je ne l'ai pas encore trouvée et pourtant je cherche...)

Mais pour revenir à ta précédente réponse, je ne suis pas tout à fait d'accord car le MsgBox se lance bien mais pas le Workbooks.Open ! La procédure accepte donc bien le paramètre ! Non ?

Je sens le bug ! Peut-être une déformation professionnelle car j'en suis entouré...
0
Bonsoir,

Oui mais c'est ambigu.
Si je modifie la macro comme ça:

'procédure avec parametre
Public Sub OuvreTemplate(x as String)
MsgBox x
Workbooks.Open x
End Sub

MsgBox affiche bien C:\toto1.xls ce qui fait penser que le paramètre est bien passé.

Maintenant je modifie un peu pour provoquer une erreur et la récupérer avec On Error Goto

Public Sub OuvreTemplate(x as String)
On Error GoTo err
Workbooks.Open z
noerr:
Exit Sub
err:
MsgBox x
Resume noerr
End Sub

J'ai un message : Impossible de trouver la macro 'OuvreTemplate("C:\toto1.xls")'
Le détournement d'erreur n'agit pas et MsgBox n'affiche pas C:\toto1.xls comme on pourrait s'y attendre.

Alors que penser? Je continue de chercher, mais j'ai bien peur qu'il n'y ait pas d'issue. Pour que ça marche il ne faut pas passer de paramètres, et n'arrange pas tes affaires.

A+.
0
rvduclos Messages postés 2 Date d'inscription mardi 6 mai 2008 Statut Membre Dernière intervention 7 mai 2008 2
7 mai 2008 à 09:28
Hello,

Tu as : Impossible de trouver la macro 'OuvreTemplate("C:\toto1.xls")'
Et bien, pas moi. Cela entre bien dans la procédure sauf qu'on a l'impression que le Workbooks.Open est désactivé quand l'action vient d'un menu.

j'ai fait ta modif avec en plus un debug.print. Et on voit bien que la procédure est activée avec son paramètre. Mais sans message d'erreur chez moi !!!
Pour info je suis sous WinXPpro et Excel2003.

Public Sub OuvreTemplate(x As String)
Debug.Print x
On Error GoTo err
Workbooks.Open x
noerr:
Exit Sub
err:
MsgBox x
Resume noerr
End Sub
0
Bonjour,

Comme on dit "Qui cherche trouve".

J'ai résolu ton problème, enfin non, pour être honête, ce n'est pas moi, regarde ce lien

https://www.mrexcel.com/archive/vba/specifying-argument-with-onaction-in-custom-menu/

Voila comment écrire ta procédure
Sub AddFavoriteMenus()
Dim cbcCustomMenu As CommandBarControl
Dim cbcCustomButton As CommandBarControl
Dim xlfile As String
Dim CstCaption As String
Dim CstOnAction As String
Dim N As Integer
Dim dq As String
Dim fich As String
dq = Chr(34) '(double Quote)

' supprime le menu si deja existant
Call deleteFavoriteMenu

'création menu déroulant
Set cbcCustomMenu = Application.CommandBars(1).Controls.Add(Type:=msoControlPopup)
cbcCustomMenu.Caption = "Perso"

For N = 1 To 3
' imaginons que ces deux Constante viennent d'une autre source (BDD)
CstCaption = "toto" & N
fich = "C:\toto" & N & ".xls"
CstOnAction = "'OuvreTemplate " & dq & fich & dq & "'"
'création bouton
Set cbcCustomButton = cbcCustomMenu.Controls.Add(Type:=msoControlButton)
With cbcCustomButton
.Caption = CstCaption
.OnAction = CstOnAction
End With
Next N

End Sub

Tu remarqueras que "'OuvreTemplate " & dq & fich & dq & "'" est encadré par des simples cotes ('). Il semble que cela a son importance.

Salut.
0