VBA,doc.getElementsByClassName()在调试模式下工作,而不是在运行模式下

时间:2016-01-10 09:13:56

标签: excel vba

我在vba中使用下面的代码,

Set results = Doc.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold")

If results.Length > 0 Then

但是长度只在调试模式下给出> 1而不是在运行模式下,我检查了网站并给出了上面提到的类,但是在调试模式下工作过于苛刻,这也是逐行调试模式并且在运行时不起作用模式。

由于 DJ

3 个答案:

答案 0 :(得分:1)

假设您的代码尝试从网站获取数据,请使用以下方法获取数据。 在执行IF条件之前,此代码将一直等到获取HTML数据。 (参考:Code Snippet from this website

$Query = "INSERT INTO `9154804_data` (`Parent`, `Name`)
VALUES ($Section, $inputdata);";
$InsertData = $mysqli->query($Query);
if ($InsertData){
    $InsertID   =  $mysqli->insert_id;
    $Return['Success']  = "Successfully added.";
}else{
    $Return['Error']    = "Something went wrong!";
}

答案 1 :(得分:1)

听起来您正在加载文档,但在您尝试检查文档之前它尚未完成。在调试模式下运行时,文档有时间完成加载。强制VBA等待文档完全加载的最佳方法是在同步模式下打开URL /文档。您还需要检查文档请求是否返回了有效的HTTP状态代码。

如果您的文档源是有效的XML / XHTML,那么您可以直接从XMLHttpRequest获取文档对象,但我假设您使用普通的旧HTML。

您需要知道XMLHttpRequest将检索页面的HTML内容,但它不会加载或运行任何支持脚本/ css,因此,如果这些脚本中的任何一个生成动态HTML内容,然后它将不会出现在HTML文档中。

Sub Test()

  Const URL As String = "http://stackoverflow.com"
  Const CLASS_NAME As String = "row-fluid"

  'The getElementsByClassName method is unavailable under some/all IE versions?
  'It seems to need to be strongly typed as MSHTML.HTMLDocument
  'You'll need to Add a reference to Microsoft HTML Object Libarary
  Dim oDoc As MSHTML.HTMLDocument

  Dim results As Object

  With CreateObject("MSXML2.XMLHttp")
    .Open "GET", "http://www.microsoft.com", False
    .send
    'Check the response is valid
    If .Status = 200 Then
      Set oDoc = CreateObject("htmlfile")
      oDoc.body.innerHTML = .responseText
      Set results = oDoc.getElementsByClassName(CLASS_NAME)
    End If
  End With

End Sub

答案 2 :(得分:0)

通过检查IE的ReadyStateBusy属性,确保在尝试访问DOM元素之前加载页面:

Sub Foo()

    Const READYSTATE_COMPLETE As Integer = 4

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Navigate "http://www.stackoverflow.com"

    '// The important bit:
    While IE.ReadyState <> READYSTATE_COMPLETE Or IE.Busy
        DoEvents
    Wend

    '// Rest of your code, presumably something like:
    Set Doc = IE.Document

    Set results = Doc.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold")

    If results.Length > 0 Then

    '// Rest of code here .....
End Sub