我可以在工作簿打开时编译VBA吗?

12

我正在尝试找到一种在工作簿打开时编译VBA代码的方法。我可以通过打开VBA环境,进入Debug并选择“Compile VBAProject”手动完成此操作,但我想知道是否有一种方法可以每次工作簿打开时通过代码来实现这一点。

其目的是将代码加载到计算机内存中,以防止由于使用某些ActiveX对象而导致编译错误。正如提到的那样,我可以手动完成此操作并解决问题,但由于有许多用户使用此工作簿并且该工作簿受密码保护,因此并不是所有人都能够访问调试选项。


如果不是这样,那么有人知道编译文件存储在哪里吗?我想,与其编译新的工作簿,不如将所有用户发送这些已编译的文件,并提供这些文件必须存储在临时目录中的说明。 - Examorph
谢谢你,Matteo。这并不是非常紧急的事情,只是我在许多工作簿中遇到了很多麻烦,包括我的当前项目。我期待着看到你的解决方案。 - Examorph
这就是答案,我刚在我的一个项目上测试了一下,看起来运行良好。如果有可能的缺陷,请不要犹豫指出,因为这也是我第一次尝试这样做。 - Matteo NNZ
只是好奇,创建一个插件来分发你的代码能解决这个问题吗? - Rick Henderson
1个回答

19

我认为你可以尝试通过自动化VBE(Visual Basic Editor)来完成这个操作。

要求:

你需要进入 Excel / 文件 / 选项 / 信任中心 / 信任中心设置 并勾选选项 信任对VBA项目对象模型的访问 (由于安全原因,默认情况下此选项处于未激活状态,如果不勾选此选项,则下面的代码将引发运行时错误1004 无法信任编程访问Visual Basic Project)。显然,你只需要在每台计算机上执行自动编译之前执行一次此举。

编码:

你的命令栏指令(即“编译VBA项目”)位于Excel应用程序的VBE对象内部,具体位于命令栏内:

Dim objVBECommandBar As Object
Set objVBECommandBar  = Application.VBE.CommandBars

该对象现在将包含Visual Basic编辑器的整个命令栏。 特别地,您要查找ID按钮“578”,实际上是“编译VBA项目”(您可以在变量上放置监视器并浏览本地窗口中的所有内容,您可能还想搜索其他命令)。 因此,总结一下:

Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578) 
compileMe.Execute

这将允许项目进行编译。就您的问题而言,您只需将其放入此Workbook打开事件中:

Private Sub ThisWorkbook_Open()
    Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578) 
    compileMe.Execute 'the project should hence be compiled
End Sub

非常感谢您,您解决了我问题的最大部分。现在我正在尝试弄清楚如何在锁定的工作簿中完成此操作,因为在这种工作簿中,调试->编译选项被禁用。您知道在锁定代码的同时保持编译选项启用的任何方法吗? - Examorph
这是一个不同的问题,我建议您打开另一个线程(因为将问题分开对其他用户有好处,而且我也无法跟进,接下来的24小时内不会在家;) - Matteo NNZ
我创建了一个新模块并将此代码放在其中,但打开时仍然要求编译?我是否遗漏了某些特定的东西?Private Sub ThisWorkbook_Open()Dim objVBECommandBar As Object Set objVBECommandBar = Application.VBE.CommandBars Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578) compileMe.Execute '因此应编译该项目End Sub - Aspiring Developer
@AspiringDeveloper,你不应该把代码放在一个模块中,而是应该放在ThisWorkbook_Open事件中。查看此页面 - Matteo NNZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接