VBA GetElementsById 方法 "Object Variable Not Set"
VBA GetElementsById Method "Object Variable Not Set"
我正在尝试 select 此页面的主菜单 ID http://greyhoundstats.co.uk/index.php 标记为 ("menu_wholesome")
以便稍后获取它们的超链接。在 HTML 文档中,有两个具有此 ID 的标签,一个 <div>
及其子元素 <ul>
,但是当我使用下面的代码搜索它们时,我得到的对象变量不是设置”错误。
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim XMLHTTPReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As MSHTML.IHTMLElement
Dim aElement As MSHTML.IHTMLElementCollection
Dim ulElement As MSHTML.IHTMLUListElement
Dim liElement As MSHTML.IHTMLLIElement
XMLHTTPReq.Open "GET", MenuPage, False
XMLHTTPReq.send
HTMLDoc.body.innerText = XMLHTTPReq.responseText
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0) '<-- error happens here
End Sub
任何人都知道为什么 getElementsById 找不到引用的 ID,尽管它是 HTML 文档集的一部分?我知道这个方法应该 return 一个唯一的 ID,但是当我们有相同的被其他标签引用时,我也知道我会 return 找到的第一个 ID 应该是 <div id="menu_wholesome">
正在请求的 HTML 页面的一部分。
不清楚您要达到什么目的。我刚刚解决了您目前遇到的当前问题。 .getElementById() 处理单个元素,因此当您将其视为元素集合时,它会抛出该错误。如果您注意到这部分 getElementBy 和 getElementsBy,您可以看到哪个是元素集合的变化(不要忽略s)。当您使用 getElementsBy.
时,您只能使用 (0)
或类似的东西
您应该以正确的方式缩进您的代码,以便其他人可以毫无困难地阅读它:
Sub BrowseMenus()
Const MenuPage$ = "http://greyhoundstats.co.uk/index.php"
Dim HTTPReq As New XMLHTTP60, HTMLDoc As New HTMLDocument
Dim MainMenuList As Object
With HTTPReq
.Open "GET", MenuPage, False
.send
HTMLDoc.body.innerHTML = .responseText
End With
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")
End Sub
首先:您想在打算遍历 DOM 文档时设置 innerHTML。
其次:这一行
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0)
这是不正确的。 getElementById
return 是您无法索引的单个元素。您索引到一个集合中。
请注意:div 和 ul 都指向相同的内容。
如果你想 select 它们分开使用 querySelector
HTMLDoc.querySelector("div#menu_wholesome")
HTMLDoc.querySelector("ul#menu_wholesome")
上面的target先是标签名然后是id属性。
如果你想要一个 id 集合,那么使用 querySelectorAll
到 return 一个匹配项目的节点列表。页面 ID 应该是唯一的,但有时它们不是!
HTMLDoc.querySelectorAll("#menu_wholesome")
然后您可以索引到 nodeList,例如
HTMLDoc.querySelectorAll("#menu_wholesome").item(0)
VBA:
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim sResponse As String, HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As Object, div As Object, ul As Object
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", MenuPage, False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
HTMLDoc.body.innerHTML = sResponse
Set MainMenuList = HTMLDoc.querySelectorAll("#menu_wholesome")
Debug.Print MainMenuList.Length
Set div = HTMLDoc.querySelector("div#menu_wholesome")
Set ul = HTMLDoc.querySelector("ul#menu_wholesome")
Debug.Print div.outerHTML
Debug.Print ul.outerHTML
End Sub
我正在尝试 select 此页面的主菜单 ID http://greyhoundstats.co.uk/index.php 标记为 ("menu_wholesome")
以便稍后获取它们的超链接。在 HTML 文档中,有两个具有此 ID 的标签,一个 <div>
及其子元素 <ul>
,但是当我使用下面的代码搜索它们时,我得到的对象变量不是设置”错误。
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim XMLHTTPReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As MSHTML.IHTMLElement
Dim aElement As MSHTML.IHTMLElementCollection
Dim ulElement As MSHTML.IHTMLUListElement
Dim liElement As MSHTML.IHTMLLIElement
XMLHTTPReq.Open "GET", MenuPage, False
XMLHTTPReq.send
HTMLDoc.body.innerText = XMLHTTPReq.responseText
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0) '<-- error happens here
End Sub
任何人都知道为什么 getElementsById 找不到引用的 ID,尽管它是 HTML 文档集的一部分?我知道这个方法应该 return 一个唯一的 ID,但是当我们有相同的被其他标签引用时,我也知道我会 return 找到的第一个 ID 应该是 <div id="menu_wholesome">
正在请求的 HTML 页面的一部分。
不清楚您要达到什么目的。我刚刚解决了您目前遇到的当前问题。 .getElementById() 处理单个元素,因此当您将其视为元素集合时,它会抛出该错误。如果您注意到这部分 getElementBy 和 getElementsBy,您可以看到哪个是元素集合的变化(不要忽略s)。当您使用 getElementsBy.
时,您只能使用(0)
或类似的东西
您应该以正确的方式缩进您的代码,以便其他人可以毫无困难地阅读它:
Sub BrowseMenus()
Const MenuPage$ = "http://greyhoundstats.co.uk/index.php"
Dim HTTPReq As New XMLHTTP60, HTMLDoc As New HTMLDocument
Dim MainMenuList As Object
With HTTPReq
.Open "GET", MenuPage, False
.send
HTMLDoc.body.innerHTML = .responseText
End With
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")
End Sub
首先:您想在打算遍历 DOM 文档时设置 innerHTML。
其次:这一行
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0)
这是不正确的。 getElementById
return 是您无法索引的单个元素。您索引到一个集合中。
请注意:div 和 ul 都指向相同的内容。
如果你想 select 它们分开使用 querySelector
HTMLDoc.querySelector("div#menu_wholesome")
HTMLDoc.querySelector("ul#menu_wholesome")
上面的target先是标签名然后是id属性。
如果你想要一个 id 集合,那么使用 querySelectorAll
到 return 一个匹配项目的节点列表。页面 ID 应该是唯一的,但有时它们不是!
HTMLDoc.querySelectorAll("#menu_wholesome")
然后您可以索引到 nodeList,例如
HTMLDoc.querySelectorAll("#menu_wholesome").item(0)
VBA:
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim sResponse As String, HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As Object, div As Object, ul As Object
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", MenuPage, False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
HTMLDoc.body.innerHTML = sResponse
Set MainMenuList = HTMLDoc.querySelectorAll("#menu_wholesome")
Debug.Print MainMenuList.Length
Set div = HTMLDoc.querySelector("div#menu_wholesome")
Set ul = HTMLDoc.querySelector("ul#menu_wholesome")
Debug.Print div.outerHTML
Debug.Print ul.outerHTML
End Sub