Excel VBA-在GetElementsByCassName中使用变量时出错
当我试图使用一个变量来指定类列表中要使用的元素时,出现了一个“Object不支持此属性或方法”(运行时错误“438”)错误Excel VBA-在GetElementsByCassName中使用变量时出错,excel,vba,Excel,Vba,当我试图使用一个变量来指定类列表中要使用的元素时,出现了一个“Object不支持此属性或方法”(运行时错误“438”)错误 For tdNum = 0 To 1000 If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then Cells(cell, 2).Value = document.getElements
For tdNum = 0 To 1000
If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then
Cells(cell, 2).Value = document.getElementsByClassName("prod-somm")(tdNum).getElementById("col-action").getElementsByTagName("span")(0).innerText
Exit For
End If
Next tdNum
HTML:
方法
getElementById
仅在html文档中可用,而在html元素中不可用。
但是,由于您有重复的ID,这里最好的选择可能是使用querySelector
获取目标元素。
请注意,该标准强制使用唯一id,但在浏览器中不强制使用
下面是一个应该让您开始学习的示例:
' execute the query
Dim xhr As New MSXML2.XMLHTTP60
xhr.Open "GET", "https://rematek-energie.com/eng/pg/1/r/5", False
xhr.send
' load the html
Dim html As New HTMLDocument, html2 As Object
Set html2 = html
html2.write xhr.responseText
' scrap the html
Dim elements As MSHTML.IHTMLElementCollection
Dim element As MSHTML.IElementSelector
Dim link As IHTMLElement
Set elements = html.getElementsByClassName("prod-somm")
For i = 0 To elements.Length - 1
Set element = elements(i)
' get the link with id="no-piece"
Set link = element.querySelector("a[id='no-piece']")
If Not link Is Nothing Then
' display the product code
Debug.Print link.FirstChild.data
End If
Next
(“prod-somm”)(tdNum)
语法不正确。如果删除(“prod-somm”)
比如getElementsByClassName(tdNum)
,那么如果程序员不能指定类名,那么通过类名获取元素又有什么意义呢?@findwindow它用于直接访问集合或数组的元素。与设置x=d.getElementsByClassName(“a”):设置y=x(1)不同的是,您只需执行设置y=d.getElementsByClassName(“a”)(1)@MacroMan我刚才在测试您是否使用了后期绑定GetElementsByCassName
需要提前绑定
Option Explicit
Function priceGetRematek()
Dim XMLHttpRequest As New MSXML2.XMLHTTP60
Dim xhr As MSXML2.XMLHTTP60
Dim cell As Integer
Dim tdNum As Integer
Dim ItemNbr As String
Dim document As MSHTML.HTMLDocument
'Login to Rematek
With XMLHttpRequest
.Open "POST", "https://rematek-energie.com/eng/customer-login/account-authentication.php", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send "name_se_connecter=se_connecter&zebra_honeypot_se_connecter=&courriel=rob@solacity.com&motpasse=password&connexion=Sign in"
End With
'Debug.Print XMLHttpRequest.responseText
'Get Price Element from HTML
Set xhr = New MSXML2.XMLHTTP60
For cell = 2 To 38
ItemNbr = Cells(cell, 1).Value
With xhr
.Open "POST", "https://rematek-energie.com/eng/pg/1/r/" & ItemNbr, False
.send
'Debug.Print xhr.responseText
If .readyState = 4 And .Status = 200 Then
Set document = New MSHTML.HTMLDocument
document.body.innerHTML = .responseText
For tdNum = 0 To 1000
If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then
Cells(cell, 2).Value = document.getElementsByClassName("prod-somm")(tdNum).getElementById("col-action").getElementsByTagName("span")(0).innerText
Exit For
End If
Next tdNum
Else
MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & vbNewLine & "HTTP request status: " & .Status
End If
End With
Next cell
End Function
' execute the query
Dim xhr As New MSXML2.XMLHTTP60
xhr.Open "GET", "https://rematek-energie.com/eng/pg/1/r/5", False
xhr.send
' load the html
Dim html As New HTMLDocument, html2 As Object
Set html2 = html
html2.write xhr.responseText
' scrap the html
Dim elements As MSHTML.IHTMLElementCollection
Dim element As MSHTML.IElementSelector
Dim link As IHTMLElement
Set elements = html.getElementsByClassName("prod-somm")
For i = 0 To elements.Length - 1
Set element = elements(i)
' get the link with id="no-piece"
Set link = element.querySelector("a[id='no-piece']")
If Not link Is Nothing Then
' display the product code
Debug.Print link.FirstChild.data
End If
Next