我需要为我的客户执行以下代码行,问题是要访问它们,我必须在项目中激活某个选项,有什么办法可以避免这种情况?
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
答案 0 :(得分:4)
为了访问它们,我必须在项目中激活了某个选项,有什么办法可以避免这种情况?
该选项不是项目内的 ,它是在主机应用程序级别(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注册表中查找注册,找到类型库,创建类型的实例,并返回对该对象的引用-一切都在运行时解决(因此,它是“后期”绑定),并且只要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
库的项目引用,就无法编译该文件。