【问题标题】:Syntax Error Issue on VBAVBA 上的语法错误问题
【发布时间】:2017-07-24 08:17:36
【问题描述】:

我正在尝试使用 VBA 从网站中提取一些值

以下代码包含我要查找的数据数组。这完美地工作并为我提供了我正在寻找的数据数组。

document.getElementsByClassName("list-flights")(0).querySelectorAll("[class$='price']")

上面的结果是

<NodeList length="23">...</NodeList>

但是当我尝试通过使用以下代码在 VBA 中运行循环来提取值时

lnth = document.getElementsByClassName("list-flights")(0).querySelectorAll("[class$='price']").Length - 1

For x = 0 To lnth

    firstResult = document.getElementsByClassName("list-flights")(0).querySelectorAll("[class$='price']")(x).innerText

Next x

代码会在 firstResult 出现错误,因为它不会得到任何值。我在 Internet Explorer 上检查了如果我使用“(”括号没有任何价值,但是如果我在 Internet Explorer 上使用“[”它可以工作,但 VBA 不会接受“[”括号。

document.getElementsByClassName("list-flights")(0).querySelectorAll("[class$='price']")[0] 

上面的代码在 Internet Explorer 控制台上工作,但不能在 VBA 中使用。

如果您能建议解决此问题的方法,我确信我遗漏了一些东西会很有帮助。

【问题讨论】:

  • 当您在 IE 控制台中输入命令时,您使用的是 Javascript,而不是 VBA。
  • 可以分享一下源码吗?

标签: vba excel


【解决方案1】:

要获取内部文本,您可以再使用两次getElementsByClassName,其中一次在for each .. next 循环中,因为您的值在list-flights -&gt; price -&gt; cash js_linkInsideCell 中:

Set priceData = IE.document.getElementsByClassName("list-flights")(0).getElementsByClassName("price")

For Each Item In priceData
    Debug.Print Item.getElementsByClassName("cash js_linkInsideCell")(0).innerHTML
Next Item

使用.querySelectorAll("[class$='price']") 也可以,但是解析后会导致 IE 对象崩溃。试试看它是否崩溃:

Set priceData = IE.document.getElementsByClassName("list-flights")(0).querySelectorAll("[class$='price']")

For Each Item In priceData
    Debug.Print Item.getElementsByClassName("cash js_linkInsideCell")(0).innerHTML
Next Item

一些快速说明:

1-您可以使用此代码等待IE对象加载url:

Do While IE.Busy
    DoEvents
Loop

2-有时,即使 IE 对象已准备好,查询结果也不会那么快返回。这意味着您要查找的元素尚未准备好并且不存在,因此您会收到一条错误消息:

运行时错误“91”:对象变量或未设置块变量

为避免此消息,我的解决方法如下:

Do
On Error Resume Next
Set priceData = IE.document.getElementsByClassName("list-flights")(0).getElementsByClassName("price")
Loop Until Err.Number <> 91

我希望这会有所帮助。

【讨论】:

  • 是的,我也意识到,这不适用于 querySelector,但适用于 ClassName。谢谢你的努力。干杯!
  • @Blue Moon 很高兴为您提供帮助。
  • 顺便说一句,您使用 Error91 的循环方法是我学到的新东西。我已经尝试了很多方法来检查这种情况,但是这种方法很棒。真的,你很有天赋。 !
  • @Tehscript 我将所有 Err91 都更改为您的新代码,我很惊讶这段代码运行得如此完美。我看过很多论坛上有人询问万无一失的方法,但这一个对我来说是十年的发现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多