从函数返回的 VBA 对象不可用



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

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

谢谢。

上。尽管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

我认为这是因为WebPageGetElementByClass的局部变量,并且在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. 解决方法

或者在GetDataFromPage中创建变量WebPage并将其作为参数传递:

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

检查这是否有效。

它不能通过使用getElementsByClassName()创建节点列表来工作,因为这会创建一个活动节点列表。这些只能与整个文档一起使用。但是当您离开功能时,文档将丢失。没有文档,没有活动节点列表。

我认为你可以通过使用一个 statik 节点列表来解决这个问题,你可以用 querySelectorAll(( 创建它

ByRef的"把戏"不是诡计。这是在函数之间处理对象的唯一方法。无法按值处理对象。

最新更新