在函数中创建的自动化对象可以很好地用于此函数中。 但是当我尝试从此函数返回它然后在另一个函数中使用它时,它变得不可用。
我知道传递对象的技巧,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
我认为这是因为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. 解决方法
或者在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的"把戏"不是诡计。这是在函数之间处理对象的唯一方法。无法按值处理对象。