VBA Excel 2003: appeler une macro

pjg111 Messages postés 9 Statut Membre -  
rvduclos Messages postés 2 Statut Membre -
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

20 réponses

  1. rvduclos Messages postés 2 Statut Membre 2
     
    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
  2. Fxbrg Messages postés 715 Statut Membre 199
     
    Euh, les deux Sub qui se suivent, c'est normal?
    0
    1. pjg111 Messages postés 9 Statut Membre
       
      Pourquoi pas?

      Les deux procs sont dans le même module. C'est un problème?
      0
  3. Fxbrg Messages postés 715 Statut Membre 199
     
    Excuse, il me semblait avoir vu une ligne qui commençait par Sub sub ....

    Je regarde dès que j'ai un moment :-)
    0
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  4. amigo
     
    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
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fxbrg Messages postés 715 Statut Membre 199
     
    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
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  7. Fxbrg Messages postés 715 Statut Membre 199
     
    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
  8. amigo
     
    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
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  9. Fxbrg Messages postés 715 Statut Membre 199
     
    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
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  10. Fxbrg Messages postés 715 Statut Membre 199
     
    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
  11. Fxbrg Messages postés 715 Statut Membre 199
     
    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
  12. amigo
     
    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
    1. pjg111 Messages postés 9 Statut Membre
       
      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
  13. Fxbrg Messages postés 715 Statut Membre 199
     
    Cool... bravo Amigo :-)
    0
  14. rvduclos
     
    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
  15. amigo
     
    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
  16. rvduclos
     
    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
  17. amigo
     
    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
  18. rvduclos
     
    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
  19. amigo
     
    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
  20. rvduclos Messages postés 2 Statut Membre 2
     
    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
  21. amigo
     
    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