web-dev-qa-db-fra.com

Module VBA qui exécute d'autres modules

Je programme dans Microsoft VBA. Au début, je dois générer une QueryTable à l'aide d'une macro (j'ai le code correspondant), puis à l'aide de macros, je dois appliquer des formules utilisant les données de la QueryTable. Le problème auquel je suis confronté est que la QueryTable apparaît uniquement après que le sous-marin, dans lequel se trouve son code, a fini de fonctionner. Cela signifie que je ne peux pas inclure le code qui génère des formules, car il n'y a pas de données pour les formules à générer.

L'idée actuelle est d'écrire un module qui exécute d'autres modules:

Sub moduleController()
    Run "Module1"
    Run "Module2"
End Sub

Cela donne l'erreur:

Erreur d'exécution 1004 - impossible d'exécuter la macro "macroname". La macro peut ne pas être disponible dans ce classeur ou toutes les macros peuvent être désactivées.

Quelle pourrait être la solution? Peut-être y at-il une autre solution à mon problème de chargement de QueryTable?

9
ositra

Tant que les macros en question se trouvent dans le même classeur et que vous vérifiez que les noms existent, vous pouvez appeler ces macros à partir de tout autre module par son nom, et non par module.

Donc, si dans Module1 vous avez deux macros Macro1 et Macro2 et dans Module2 vous avez Macro3 et Macro 4, alors dans une autre macro, vous pouvez les appeler toutes:

Sub MasterMacro()
    Call Macro1
    Call Macro2
    Call Macro3
    Call Macro4
End Sub
17
Jerry Beaucaire

"Module1" fait-il partie du même classeur qui contient "moduleController"?
Sinon, vous pourriez appeler la méthode publique de "Module1" en utilisant Application.Run someWorkbook.xlsm!methodOfModule.

3
shahkalpesh

Je viens d'apprendre quelque chose de nouveau grâce à Artiso. J'ai donné un nom à chaque module dans la boîte des propriétés. Ces noms étaient aussi ce que j'ai déclaré dans le module. Lorsque j'ai essayé d'appeler mon deuxième module, j'ai continué à avoir une erreur: Erreur de compilation: variable ou procédure attendue, pas de module

Après avoir lu le commentaire d'Artiso ci-dessus sur le fait de ne pas avoir les mêmes noms, j'ai renommé mon deuxième module, appelé depuis le premier, et résolu le problème. Des choses intéressantes! Merci pour l'info Artiso!

Au cas où mon expérience ne serait pas claire:

Nom du module: AllFSGroupsCY Public Sub AllFSGroupsCY ()

Nom du module: AllFSGroupsPY Public Sub AllFSGroupsPY ()

De AllFSGroupsCY ()

Public Sub FSGroupsCY()

    AllFSGroupsPY 'will error each time until the properties name is changed

End Sub
1
KeithG