使用 Excel VBA 如果元素存在则获取 web 元素,如果不存在则跳过

With Excel VBA get web element if element is present, skip if not

我对清理网页还比较陌生,但我已经掌握了窍门。我已经成功地使用以下命令从网页获取数据:

sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value

我的挑战是并非我搜索的所有网页都有这些元素,因此脚本停止并显示 运行-time error 424 - Object required.

我试过 On Error GoTo 命令,但它只适用于第一个事件,然后在第二个网页上停止,缺少元素。

那个代码是:

Next_sku:
Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error GoTo Next_sku

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

任何人都可以帮我提供一个代码,该代码将 return 一个空白结果,手动输入如 f.eks "Does not exist" og 如果元素,则直接跳到下一个命令行是不存在的。最重要的是脚本没有停止

谢谢 :-)

我认为问题在于您的代码尚未从第一个错误中恢复。您无法在错误处理程序中检查错误。通过在您的代码中添加恢复语句,VBA 将不再认为您在错误处理程序中并且您的代码将恢复正常。

这是一个例子:

On Error GoTo Next_sku
   sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
   sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
Next_sku:
   'Do something on error
Resume Next

如果未找到 SKU,以上代码将留下空白结果。您可以在 Next_sku: 标签后添加代码到 return "Does not exist".

您也可以尝试使用 on error resume next 语句。

非常感谢@Hubvill 找到答案。

代码 On Error Resume Next 解决了这个问题。我的代码现在如下所示:

Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error Resume Next

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

结果是将该字段留空,并继续沿着列表 og SKU 查找并获取数据。

优秀的解决方案。