VBA – 错误使用getElementsByClassName中的variables

当我尝试使用variables来指定要使用的类列表中的哪个元素时,出现“对象不支持此属性或方法”(运行时错误'438')错误。

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:

 <table align="center" cellspacing="0" class="prod-somm"> <tbody> <tr> <td align="center" rowspan="2" class="prod-somm-image"></td> <td class="prod-somm-texte" valign="top"> <a href="/eng/Balance-of-system/Fuse-and-holder/Wohner-31110.000/p/284" id="no-piece"> 90-FT017 <span class="prod-somm-sepno"></span> <span id="panier_fab_284">Wohner</span> <span id="panier_nomanufact_284">31110.000</span> </a> <a href="/eng/Balance-of-system/Fuse-and-holder/Wohner-31110.000/p/284"></a> </td> </tr> <tr> <td id="col-action"> <div class="prix"> <span id="panier_prix_284">10.43</span> </div> </td> </tr> </table> 

If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then

目标是使程序在search结果列表中运行,直到find与我的Excel电子表格中的项目编号相匹配的项目编号,然后取对应于该项目的价格。

编辑:这是整个代码。 可能使我想要做的更清楚一点。

 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 

getElementById方法只能在html文档中使用,而不能在html元素上使用。 但是既然你有重复的id,这里最好的select可能是用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