用于跨工作簿访问的后期绑定UDF

时间:2017-04-25 08:52:42

标签: excel vba excel-vba

我在excel中创建了一个UDF,我想从所有excel项目中访问它。为此,我将其放在PERSONAL.XLSB的模块中,并使用=PERSONAL.XLSB!MYFUNC(Arg1, Arg2...)

进行调用

但是我收到错误User-defined type not defined。这是,如果我理解正确(我可能不会!),因为我的项目使用早期绑定并需要库引用 Microsoft Internet Controls 。根据{{​​3}}的解决方案是使用后期绑定,首先将所有变量声明为Object s,然后以某种方式设置它们,我不完全确定

一些代码

这是我的代码,除了引用互联网控件的DimSet之外的所有内容:

Public Function GOOGLE_COUNT_latebound(searchTerm As String, xRes As Long, yRes As Long, Optional timeout As Long = 10, Optional arrayIndex As Long = 1) As Variant

    Dim objIE As InternetExplorer
    Dim currPage As HTMLDocument
    Dim valueResult As IHTMLElementCollection
    Set objIE = New InternetExplorer
    Set currPage = objIE.document
    Dim myDiv As HTMLDivElement: Set myDiv = currPage.getElementById("fbar")
    Dim elemRect As IHTMLRect: Set elemRect = myDiv.getBoundingClientRect
    Set valueResult = currPage.getElementById("rg_s").getElementsByTagName("IMG")
    objIE.Quit

End Function

现在要迟到绑定objIE我只需写

Dim objIE as object
Set objIE = CreateObject("InternetExplorer.Application")'(but why .Application I'm still not sure about?)

然后对于所有HTMLDocumentHTMLDivElement或其他任何objIE的子集*:链接页面让我觉得我应该将变量类型声明为常量(见下文)

*(通过“子集”我的意思是将相对设置为objIE。与HTMLDocument一样setobjIE.documentHTMLDivElement被设置为objIE.document.getElementById("fbar")。请参阅所有与应用程序相关的objIE - 我不知道这些变量的一般术语是什么。)

Const HTMLDocument As Long = 0

然后使用声明的类型从我的objIE对象创建项目:

Dim currPage As Object
Set currPage = objIE.CreateItem("HTMLDocument")

这是对的吗? Const声明的含义是什么,我是否只是声明一个这样的数字,或者它是否随数据类型而变化?我怎么知道要把它设置为什么?

也许有一种更好的方式让我的UDF可以公开访问,也许这与绑定无关。这些都是我非常新的概念,我还没有找到可以遵循的说明!

1 个答案:

答案 0 :(得分:0)

这是适合使用后期绑定的代码

Public Function GOOGLE_COUNT_latebound(searchTerm As String, xRes As Long, yRes As Long, Optional timeout As Long = 10, Optional arrayIndex As Long = 1) As Variant

    Dim objIE As Object
    Dim currPage As Object
    Dim valueResult As Object
    Set objIE = CreateObject("internetexplorer.application")
    Set currPage = objIE.document
    Dim myDiv As Object: Set myDiv = currPage.getElementById("fbar")
    Dim elemRect As Object: Set elemRect = myDiv.getBoundingClientRect
    Set valueResult = currPage.getElementById("rg_s").getElementsByTagName("IMG")
    objIE.Quit

End Function