【问题标题】:Vba Excel Trust access to the VBA project modelVba Excel 信任访问 VBA 项目模型
【发布时间】:2019-12-25 21:50:12
【问题描述】:

我需要为我的客户执行以下代码行,问题是为了访问它们我必须在项目中激活某个选项,有什么办法可以避免这种情况吗?

Application.VBE.ActiveVBProject.References.AddFromFile "C:\Windows\System32\mshtml.tlb"
Application.VBE.ActiveVBProject.References.AddFromFile "C:\Windows\System32\msxml6.dll"

它们是执行我的宏所必需的几个库。

我正在运行的宏如下:

Sub GetCurrentDate()
    Dim S$

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://www.fechadehoy.com/venezuela", False
        .send
        S = .responseText
    End With

    With CreateObject("htmlfile")
        .body.innerHTML = S
        MsgBox .getElementById("fecha").innerText
    End With
End Sub

执行我的宏所需的库

Microsoft XML, v6.0
Microsoft HTML Object Library

【问题讨论】:

  • 如果使用后期绑定,则不需要添加引用。
  • 正确,感谢您的回复,问题是要添加这些链接,您必须激活图像中显示的选项。
  • 后期绑定也没问题。
  • 旁注,请不要做Dim S$,想想未来的维护者并拼写出来:Dim S As String。还可以考虑使用实际有意义的标识符名称,例如contents,或response,随便。

标签: excel vba trust


【解决方案1】:

为了访问它们,我必须在项目中激活某个选项,有没有办法避免这种情况?

该选项不在项目中,它位于主机应用程序级别 (Excel):是否信任对 VBIDE API 的编程访问是宏安全设置的重要组成部分,以及不,没有任何办法。

任何规避此安全设置的程序化方式都会造成世界上每个宏病毒都会跳入的巨大安全漏洞。


但您不需要这样做。您的代码正在使用 CreateObject 而不是 New 运算符创建位于这些库中的类的实例:不需要引用。

With CreateObject("MSXML2.XMLHTTP") ' returns an Object/XMLHTTP reference
    .Open ...  'late-bound member call (no intellisense, no compile-time validation)
    '...
End With

CreateObject 使用指定的 ProgID 字符串在 Windows 注册表中查找注册,定位类型库,创建该类型的实例,并返回对该对象的引用 - 一切都在运行时解决(因此“ Late" 绑定),只要 ProgID 存在于注册表中并且后期绑定代码中没有错字(Option Explicit 无法将您从这些错误中拯救出来),一切都“正常工作”。

如果您改用 New 关键字...

With New MSXML2.XMLHTTP ' returns an XMLHTTP reference
    .Open ... 'early-bound member call (with intelilsense and compile-time validation)
    '...
End With

如果没有对 MSXML2 库的项目引用,则无法编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2022-12-19
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多