2012-03-28 158 views
9

我在Microsoft VBA中编程。起初我需要在宏的帮助下生成一个QueryTable(我已经得到了代码),然后在宏的帮助下,我需要应用使用QueryTable中的数据的公式。我面临的问题是,QueryTable只出现在其代码所在的Sub已完成工作之后。这意味着我不能在其中包含生成公式的代码,因为没有用于生成公式的数据。运行其他模块的VBA模块

的想法,现在是编写运行其他模块一个模块:

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

这给了错误:

Run time error 1004 - cannot run the macro "macroname". The macro may not be available in this workbook or all macros may be disabled.

可能是什么解决办法吗?也许有我的QueryTable加载问题的另一种解决方案?

+0

您的QueryTable有两个可能的问题。 1.)你添加后刷新查询吗? 2.)默认情况下,新的查询设置为在后台刷新。如果你不改变它,那么你的宏不会等待查询结束。尝试使用'.Refresh BackgroundQuery:= False'刷新您的查询。 – mischab1 2012-03-28 18:20:41

回答

16

只要有问题的宏在同一个工作簿中,并且您确认名称存在,您可以通过名称而不是模块从其他任何模块调用这些宏。

因此,如果在模块1你有两个宏宏1和Macro2和单词数你有Macro3和宏4,然后在另一个宏,你可以把他们都称为:

Sub MasterMacro() 
    Call Macro1 
    Call Macro2 
    Call Macro3 
    Call Macro4 
End Sub 
+0

此外,如果Macro1 - Macro4与MasterMacro不在同一模块中,则需要将Macro1 - Macro4声明为公共,而不是私有。 – mischab1 2012-03-28 17:57:55

+0

谢谢杰瑞!你解决了它! 应该指出,我偶然发现的另一个问题是,宏的名称不能与模块的名称相同。他们必须有所不同! – ositra 2012-03-29 06:56:01

2

“Module1”是否包含“moduleController”的同一工作簿的一部分?
如果不是,您可以使用Application.Run someWorkbook.xlsm!methodOfModule来调用公共方法“Module1”。

+0

是的,它在同一个工作簿上。尽管如此,感谢您的代码行!我学到了一些新东西。 – ositra 2012-03-29 06:33:22

1

我刚学到新的东西感谢Artiso 。我在属性框中给每个模块一个名字。这些名字也是我在模块中声明的。当我试图打电话给我的第二个模块时,我一直收到一个错误:编译错误:预期的变量或过程,而不是模块

在阅读Artiso上面关于不具有相同名称的评论后,我重命名为第二个模块,第一个,问题解决了。有趣的东西!感谢Artiso的信息!

如果我的经验是不清楚:

模块名称:AllFSGroupsCY 公用Sub AllFSGroupsCY()

模块名称:AllFSGroupsPY 公用Sub AllFSGroupsPY()

从AllFSGroupsCY()

Public Sub FSGroupsCY() 

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

End Sub