VBA Web Scraper For 循环从 Excel 列 C 输入数据,给出运行时错误“438”:对象不支持此属性或方法

VBA Web Scraper For Loop to Input Data from Excel Column C is Giving Run-time error '438': Object Doesn't Support This Property or Method

提问人:PJB 提问时间:6/25/2023 最后编辑:PJB 更新时间:6/26/2023 访问量:71

问:

我对 VBA 非常陌生,因为这是一台工作计算机,我不能使用 Selenium 之类的东西。我的宏的目的是为我的老板从基于供应商的应用程序(数据存储在我公司的服务器上)生成工作报告。我已经删除了很多代码,因为有些代码包含机密信息。

我正在尝试使用 For 循环在搜索框中输入 ID,以将我带到我需要从中抓取数据的页面。这些 ID 列在名为“Data2”的工作表的 C 列中。我基本上需要它进入搜索框,然后点击一个按钮。

我的VBA:

Sub D_Scrape()

'Declare variables
Dim url As String
Dim browser As InternetExplorerMedium
Dim htmlDoc As Object
Dim cCoEnter As Object
Dim sButton As Object
Dim ws As Worksheet
Dim i As Long
Dim lRow As Long
Dim td As Object
Dim tr As Object

'Initialize variables
url = 'unable to share this
Set ws = Worksheets("Data2")

'Initialize IE & Set Visibility
Set browser = New InternetExplorerMedium
browser.Visible = True
browser.navigate url

'Set document referencefi
Set htmlDoc = browser.document 

'Enter Collection into Search box in collection
Application.Wait (Now + TimeSerial(0, 0, 8))
lRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
Set cCoEnter = htmlDoc.getElementsByName("collectionSearchBox:collectionSearchTxt")

For i = 2 To lRow
     cCoEnter.Value = ws.Range("C" & i).Value

htmlDoc.getElementsByName("collectionSearchBox:collectionSearchBtn").Item.Click

'Get Mileage
Set tr = htmlDoc
Application.Wait (Now + TimeSerial(0, 0, 1))
For each td in tr.getElementsByName("collectionInfoBox;SummaryInformationBox:milesTraveled")
     ws.Range("K" & i).Value = td.getAttribute("value")
Next
Next i

End Sub

适用于此的 HTML 是:

<tr align="left">

<td align="left" width="15%"><label>ID:</label></td>

<td align="left" width="15%" name="collectionSearchBox:collectionSearchTxt" type="text" value=""/></td>

<td align="left"><input name="collectionSearchBox:collectionSearchBtn"/></td>

</tr>

我的Excel:

Excel Screenshot

我看过几篇关于如何指定动态范围的帖子(有些月份我需要生成数百个报告,而其他月份则少得多)。

我收到运行时错误“438”:对象不支持此属性或方法cCoEnter.Value = ws.Range("C" & i).Value

我尝试将变量设置为 的范围,但它没有区别,仍然在 .ws.Range("C1:C" & lRow)cCoEnter.Value = ws.Range("C" & i).Value

在“ID”框中未输入任何值。

我非常不确定还有什么可以尝试的,并希望有任何建议。先谢谢你。

Excel VBA for-loop 网页抓取 范围

评论

0赞 Tim Roberts 6/25/2023
就像以前一样,分而治之。你能回应一下的值吗?如果你呼应 的值,你看到了什么?ws.Range("C"&i).ValuecCoEnter
0赞 PJB 6/25/2023
我尝试将 cCoEnter 值直接设置为 C 列单元格之一(单列和范围“C2:C16”),但仍然出现错误。我在变量中没有看到任何错别字。
1赞 Shrotter 6/25/2023
getElementsByName 返回元素的集合。您想为这些元素中的哪一个赋值(或比较)?
0赞 igittr 6/25/2023
要回答如何对输入文本进行值值,请使用此构造函数。您应该能够在循环外部捕获 sButton 对象,然后在循环内执行该对象的单击。在单步执行代码时,可以使用一个检查器工具,用于查看已捕获的内容。它可以是“nothing”,这意味着它没有正确配置,或者是一些你可以展开并查看哪些属性可用的对象。在“调试”菜单下是“添加监视”。在代码中选择对象,然后单击“添加监视”。cCoEnter.Item.innerText = ws.Range("C" & i).Value
0赞 PJB 6/26/2023
我将值更改为 cCoEnter.Item.innerText = ws。范围(“C” & i)。值,我第一次运行代码时,它输入了第一个 ID 号并单击。然后它停了下来。我再次运行它,它输入了最后一个 ID 并单击。现在,它只是默认为列表中的最后一个 ID。

答: 暂无答案