首页 > 解决方案 > 从函数返回的 VBA 对象不可用

问题描述

在函数中创建的自动化对象可以在这个函数中使用就好了。但是当我尝试从这个函数返回它然后在另一个函数中使用它时变得不可用。

我知道将对象传递给应该由 ByRef 分配给哪个函数返回值的技巧购买我想知道 VBA 不允许在我的情况下直接从函数返回对象。

谢谢。

UPD。querySelectorAll()尽管它是“静态”列表,但同样的问题。

Function GetElementByClass(Html As String, ClassName As String) _
                           As IHTMLElementCollection

    Dim WebPage As MSHTML.HTMLDocument
    Set WebPage = New MSHTML.HTMLDocument
    WebPage.body.innerHTML = Html

    'GetElementByClass is valid object
    Set GetElementByClass = WebPage.getElementsByClassName(ClassName)

End Function


Sub GetDataFromPage()

        Dim Element As IHTMLElementCollection

        'Element is Nothing here. Why?
        Set Element = GetElementByClass(Html, "relative")

End Sub

标签: excelvba

解决方案


我认为这是因为它WebPage是一个局部变量,GetElementByClass它在End Function. 而且因为您返回Set GetElementByClass = WebPage.getElementsByClassName(ClassName)的是该WebPage对象的成员,所以它也会在函数结束时消失。

1. 解决方法

将您的变量声明为公开的,这样它就不会被破坏。

Option Explicit
Global WebPage As MSHTML.HTMLDocument

Function GetElementByClass(Html As String, ClassName As String) _
                       As IHTMLElementCollection

    Set WebPage = New MSHTML.HTMLDocument
    WebPage.body.innerHTML = Html

    'GetElementByClass is valid object
    Set GetElementByClass = WebPage.getElementsByClassName(ClassName)
End Function

2. 解决方法

或者创建变量并将其作为参数传递WebPageGetDataFromPage

Option Explicit

Function GetElementByClass(WebPage MSHTML.HTMLDocument, ClassName As String) _
                           As IHTMLElementCollection
    'GetElementByClass is valid object
    Set GetElementByClass = WebPage.getElementsByClassName(ClassName)
End Function


Sub GetDataFromPage()
    Dim WebPage As MSHTML.HTMLDocument
    Set WebPage = New MSHTML.HTMLDocument
    WebPage.body.innerHTML = Html

    Dim Element As IHTMLElementCollection

    'Element is Nothing here. Why?
    Set Element = GetElementByClass(WebPage, "relative")

End Sub

检查这是否有效。


推荐阅读