我正在尝试找到一种在工作簿打开时编译VBA代码的方法。我可以通过打开VBA环境,进入Debug并选择“Compile VBAProject”手动完成此操作,但我想知道是否有一种方法可以每次工作簿打开时通过代码来实现这一点。
其目的是将代码加载到计算机内存中,以防止由于使用某些ActiveX对象而导致编译错误。正如提到的那样,我可以手动完成此操作并解决问题,但由于有许多用户使用此工作簿并且该工作簿受密码保护,因此并不是所有人都能够访问调试选项。
我正在尝试找到一种在工作簿打开时编译VBA代码的方法。我可以通过打开VBA环境,进入Debug并选择“Compile VBAProject”手动完成此操作,但我想知道是否有一种方法可以每次工作簿打开时通过代码来实现这一点。
其目的是将代码加载到计算机内存中,以防止由于使用某些ActiveX对象而导致编译错误。正如提到的那样,我可以手动完成此操作并解决问题,但由于有许多用户使用此工作簿并且该工作簿受密码保护,因此并不是所有人都能够访问调试选项。
我认为你可以尝试通过自动化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
Dim objVBECommandBar As Object
Set objVBECommandBar = Application.VBE.CommandBars
Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578)
compileMe.Execute '因此应编译该项目
End Sub - Aspiring Developer