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

Can I compile VBA on workbook open?

我正在尝试找到一种在工作簿打开时编译 VBA 中的代码的方法。我可以通过打开 VBA 环境,进入调试和 "Compile VBAProject" 手动执行此操作,但想知道是否有办法在每次打开工作簿时通过代码执行此操作。

这样做的目的是将代码加载到计算机内存中,以防止由于使用某些 Active X 对象而导致编译错误。如前所述,我可以手动执行此操作,但它解决了问题,因为有很多用户使用它并且工作簿受密码保护,并非所有人都可以访问调试选项。

我认为您可以尝试通过自动化 VBE(Visual Basic 编辑器)来实现这一点。

要求:

您需要转到 Excel / File / Options / Trust Center / Trust Center settings 并选中 Trust access to the VBA project object model 选项(出于安全原因,默认情况下禁用此选项,如果您不选中它,下面的代码将引发 运行-时间错误 1004programmatic access to visual basic project is not trusted)。很明显,你只需要这样做一次(当然是在你要执行自动编译的每台计算机上)。

编码:

您的命令栏指令(即 "Compile VBA Project")在 Excel 应用程序的 VBE 对象中,特别是在命令栏中:

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

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

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

这将允许编译项目。如您所问,您只是将其放入本工作簿打开事件中:

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