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
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
A voir également:
- VBA Excel 2003: appeler une macro
- Liste déroulante excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
- Excel compter cellule couleur sans vba - Guide
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
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.
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.
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 15:58
12 mars 2008 à 15:58
Euh, les deux Sub qui se suivent, c'est normal?
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
12 mars 2008 à 16:06
Pourquoi pas?
Les deux procs sont dans le même module. C'est un problème?
Les deux procs sont dans le même module. C'est un problème?
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 16:08
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 :-)
Je regarde dès que j'ai un moment :-)
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
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
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
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
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
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 18:24
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?
Ce que tu appelles sous-menu, c'est un formulaire?
Et ce que tu appelles article, c'est kel genre de contrôle?
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
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
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
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 18:27
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
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
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+
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+
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
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
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
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 20:10
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...
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...
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
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
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
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 20:24
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!
Reste le problème de syntaxe... je suis dessus!
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
12 mars 2008 à 20:36
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?
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
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
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
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
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
Fxbrg
Messages postés
710
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
16 novembre 2013
199
13 mars 2008 à 08:38
13 mars 2008 à 08:38
Cool... bravo Amigo :-)
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
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
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+.
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+.
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
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
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+.
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+.
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é...
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é...
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+.
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+.
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
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
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
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
Tu remarqueras que "'OuvreTemplate " & dq & fich & dq & "'" est encadré par des simples cotes ('). Il semble que cela a son importance.
Salut.
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.