我可以在打开的工作簿上编译 VBA 吗?
Posted
技术标签:
【中文标题】我可以在打开的工作簿上编译 VBA 吗?【英文标题】:Can I compile VBA on workbook open? 【发布时间】:2015-03-16 02:24:30 【问题描述】:我正在尝试找到一种在打开工作簿时在 VBA 中编译代码的方法。我可以通过打开 VBA 环境手动执行此操作,进入调试和“编译 VBAProject”,但想知道是否有办法在每次打开工作簿时通过代码执行此操作。
这样做的目的是将代码加载到计算机内存中,以防止由于使用某些 Active X 对象而导致编译错误。如前所述,我可以手动执行此操作,但它解决了问题,因为有很多用户使用它并且工作簿受密码保护,并非所有人都可以访问调试选项。
【问题讨论】:
如果不是这个,那么有谁知道编译后的文件存放在哪里?我在想,与其编译新的工作簿,不如将这些编译后的文件发送给所有用户,并提供这些文件必须存储在 temp 目录中的位置的说明? 谢谢你,Matteo,这并不紧急,只是我在之前的许多工作簿中遇到过很多麻烦,包括我当前的项目。我期待看到您的解决方案。 好了,答案就在其中。我刚刚在我的一个项目上进行了测试,它似乎工作正常。不要犹豫指出可能的缺点,这也是我第一次尝试这样的事情。 只是好奇,但是创建一个插件来分发您的代码会解决问题吗? 【参考方案1】:我认为您可以尝试通过自动化 VBE(Visual Basic 编辑器)来做到这一点。
要求:
您需要转到Excel / File / Options / Trust Center / Trust Center settings
并检查选项Trust access to the VBA project object model
(出于安全原因,默认情况下禁用此选项,如果您不检查它,下面的代码将引发运行时错误1004 programmatic access to visual basic project is not trusted
)。显然,您只需要执行一次(当然,在您要执行自动编译的每台计算机上)。
编码:
您的命令栏指令(即“编译 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
这将允许编译项目。正如您所问的,您只需将其放入本工作簿打开事件中:
Private Sub ThisWorkbook_Open()
Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578)
compileMe.Execute 'the project should hence be compiled
End Sub
【讨论】:
非常感谢您,您解决了我最大的问题。我现在正试图弄清楚如何使用锁定的工作簿执行此操作,因为在此类工作簿中,调试->编译选项被禁用。你知道在锁定代码的同时保持编译选项启用的任何方法吗? 这是一个不同的问题,我建议你打开另一个线程(既因为它可以为其他用户分离问题,又因为我无法跟进你,下一个不会回家24 小时 ;) 我创建了一个新模块并将这段代码放在那里,但它仍然要求我在打开时编译?有什么我想念的东西吗? 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 @AspiringDeveloper 您不应将代码放在模块中,而应放在ThisWorkbook_Open
事件中。 Check this page以上是关于我可以在打开的工作簿上编译 VBA 吗?的主要内容,如果未能解决你的问题,请参考以下文章
引用另外表格,提示 #REF!路径也设置好了。被引用的表格不打开就错误,打开就正常。不用vba能处理吗?