Appel d'une macro Excel à partir d'un autre Classeur
J'ai un Classeur HasMacros.xlsm et un Classeur HasData.xlsm
Dans HasMacros.xlsm-je ajouter un Module nommé Mod1 avec exactement ce que ce code:
Sub testmacro()
MsgBox ("Test")
End Sub
Dans HasData.xlsm-je ajouter un Module nommé Mod2 avec exactement ce que ce code:
Sub testmacro2()
'XXX
End Sub
Donc bon. Rien d'autre d'ouvert dans Excel.
Maintenant, je veux l'appeler testmacro de testmacro2 où XXX est écrit.
Cela échoue immédiatement erreur de compilation:
Sub testmacro2()
testmacro()
End Sub
Cette échoue avec l'erreur de compilation "les Sous de la fonction non définie" sur exec:
Sub testmacro2()
Call testmacro
End Sub
Cela échoue immédiatement erreur de compilation:
Sub testmacro2()
Mod1.testmacro()
End Sub
Cela échoue sur exec:
Sous testmacro2()
Appel Mod1.testmacro
End Sub
Ensuite, j'ai essayé Comment appeler une fonction à partir d'un autre classeur spécifique en VBA? mais je reçois
Les conflits de noms avec module existant, un projet ou un objet de la bibliothèque
Je suis à court d'idées sur comment faire pour appeler une macro dans HasMacros.xlsm à partir du code VBA dans HasData.xlsm
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également modifier le nom du projet VBA dans
Workbook HasMacros.xlsm
quelque chose d'autre queVBAProject
et ensuite définir une référence (Outils - Références dans l'Éditeur VB) pour que le projet de la HasData.xlsm projet. Qui vous permettra ensuite d'appeler directement la macro autre sans l'aide deRun
.Application.Run("'Classeur HasMacros.xlsm'!testmacro")
Je n'avais pas envie de coder en dur le nom du maître classeur qui contenait mon sous-routine dans mon esclave classeur. J'avais déjà utilisé le registre pour stocker de l'information clé sur mon classeur maître, et avait des routines qui permettrait d'extraire cette information.
Quand je suis allé à l'utilisation de l'Application.Exécutez je n'ai trouvé que des exemples qui ont montré une chaîne codée en dur pour l'esclave classeur pour accéder au classeur Maître de la méthode. J'ai été en mesure de venir avec une solution qui a construit la chaîne à la volée.
Cette solution, toujours difficile, de codes dans le Module et Sous son nom, mais vous avez l'idée générale et peut s'adapter pour répondre à vos besoins.
============
Classeur Maître: Maître.xlsm
Modules: GlobalMethods
Sujet: SetThePath(string)
Esclave Classeur: Esclave.xlsm
Modules: Init
Sujet: SetUpMyWorld
==============
Sous SetUpMyWorld () " Défini dans l'Esclave Classeur
Dim myMaster comme une chaîne de caractères
Dim myMasterWB comme Classeur
Dim SlaveWB comme Classeur
Complaint1:
MsgBox "impossible d'ouvrir votre classeur Maître:" + myMaster + ". Oups!"
End Sub