以编程方式添加没有 VBE 或 VBIDE 的 VBA 项目引用..?

Posted

技术标签:

【中文标题】以编程方式添加没有 VBE 或 VBIDE 的 VBA 项目引用..?【英文标题】:Programmatically add VBA project references without VBE or VBIDE..? 【发布时间】:2018-12-22 06:12:54 【问题描述】:

这与关于以编程方式添加 VBA 项目引用的老问题有所不同:有没有办法以编程方式添加引用,但是...没有 VBE 或对 VBIDE 的现有引用..?

许多 Microsoft 应用程序都有内置的应用程序类 VBE,并具有自己的引用集合:Application.VBE.ActiveVBProject.References。这包括 Access、Excel、Word、PowerPoint、Visio,可能还有许多其他。但是某些 Microsoft 应用程序没有 VBE,例如 Outlook 和 Publisher。此外,还有多种带有 VBA 的 3rd-party 软件包,例如 AutoCad 和 Corel Draw,但它们是否具有 VBE 类尚不清楚。

对于那些没有 VBE 的应用程序,是否有任何完全编程的方式来添加对 VBIDE.. 的引用? (假设它在系统上)

我愿意接受除SendKeys 之外的任何想法。我有过在角色级别编辑文档文件的想法。例如,我确定如果我深入研究 Excel 文件的 XML,我会找到存储 VBA 引用的标签。对于 Access,它将是 SaveToText 和 LoadFromText,然后挖掘文本文件。但对于其他应用程序,我对它们的文件结构一无所知或几乎一无所知。

【问题讨论】:

很确定这将是一个安全漏洞。需要明确启用对 VBIDE 可扩展性库的编程访问...至少在 Office 中。 你到底想完成什么? 另外.. Outlook VBE 主机应用程序。 OneNote 不是。 我建议您考虑改用后期绑定。这将解决您在参考文献中可能遇到的问题,而且花费更少。 > 可能不会。 VBA 代码以 二进制 文件格式存储在 Office Open XML zip 包中。 【参考方案1】:

Mathieu Guindon 是对的,VBA 需要授予访问权限才能操作工作簿项目,通常只授予一次安装权限,并且很少会被撤销。 Cindy Meister 是对的,因为引用存储在二进制 blob 中,因此深入研究 xml 将无济于事。

授予访问权限,(这是在 Excel 2016 上)

单击文件,然后在从左侧飞入的菜单上选择选项,这将显示 Excel 选项对话框。 在 Excel 选项对话框的左侧菜单中选择信任中心,这将显示信任中心窗格。 在“信任中心”窗格中,单击“信任中心设置”,这将显示“信任中心”对话框。 在信任中心对话框的左侧菜单中,选择宏设置... 在“宏设置”窗格中,选中“信任对 VBA 项目对象模型的访问”复选框

因此,以下代码对我有用,因为已授予访问权限。该代码添加了 Microsoft Scripting Runtime 库(这是我最喜欢的非核心)。

Sub Test()

    Dim objProj As Object 'VBIDE.VBProject
    Set objProj = ThisWorkbook.VBProject

    Dim vRefLoop As Variant

    Dim bIsMyReferencePresent As Boolean
    bIsMyReferencePresent = False
    For Each vRefLoop In objProj.References

        Debug.Print vRefLoop.Name
        If vRefLoop.Name = "Scripting" Then

            bIsMyReferencePresent = True

        End If

    Next

    If bIsMyReferencePresent = False Then

        objProj.References.AddFromFile "c:\windows\syswow64\scrrun.dll"

    End If

End Sub

【讨论】:

是的,我很熟悉。在 Access 和 Excel 中编写 VBA 代码是我一天工作的主要部分。当我向以前没有启用宏和 VBIDE 的用户提供一些东西时,我经常需要启用它。我没有考虑所有这些安全问题,以及我所询问的内容会造成的主要漏洞。来自与 VBA 集成的主机的文档文件存在巨大的安全风险。我已经阅读了关于 AV 扫描仪的 Chip Pearson cmets,这些扫描仪会立即删除与 VBIDE 相关的任何引用和代码。令开发商不快。但这是有道理的。这就是为什么我们不能拥有美好的事物。 哦,好的,我看到了 AV 扫描仪的问题。 Erm,作为您解决方案的一部分,可能会提供一个包含所有参考的模板,因此不需要 VBIDE。 你要添加什么库?是另一本工作簿吗? 否;这是在 Access 中,自动使用 SQL 数据创建具有复杂格式的 Excel 工作簿,然后通过电子邮件发送它们,并计划使用调度系统对其进行扩展。将其视为 Access 数据导出功能的更复杂、更通用的版本。除了每个 Office 应用程序具有的四个基本引用之外,该项目还有九个附加引用。这是一个列表:Excel、Graph、Scripting、VBScript_RegExp_55、VBIDE、Office、MSACAL、MSComCtl2 和 MSForms。 然后提供一个包含所有这些的 Excel 模板 (*.xltm)?【参考方案2】:

你的想法很有趣:

我曾想过在角色编辑文档文件 等级。例如,我确定如果我深入研究 Excel 的 XML 文件

引用不保存在 XML 中,而是保存在 .xlsm 文件中的 ./vbaProject.bin(适用于 Excel 版本>5)中,该文件只是 zip 存档。这个vbaProject.bin 是 zip 存档中的二进制 blob,但已经尝试对其进行解码,例如在 officeparser 项目中有 some code 来检测 VBA 引用的数组。 使用这个代码应该可以为这个数组设计一个更新函数。

【讨论】:

以上是关于以编程方式添加没有 VBE 或 VBIDE 的 VBA 项目引用..?的主要内容,如果未能解决你的问题,请参考以下文章

解决项目无法添加VBIDE问题

为啥不能从 VB IDE (VB6 & VBA) 调用 RegFree COM 和 .NET?

如何以编程方式将标记 (UIControl) 添加到 UITextField 或 SearchBar?

以编程方式向 UIView 或 UIViewController 添加约束?

以编程方式将系列添加到 OxyPlot 图表:没有显示

以编程方式添加 ODR 资源