2016-05-24 43 views
0

MSXML2クラスを使用してWebサイトにログインし、スプレッドシートに価格をダウンロードしようとしています。私は、コードが製品を検索するために使用する製品番号のリストを持っています。そして、それはhtmlからprice要素を引き出すことになっています。getElementById FirstChildが実行時エラー91をスローする

私の問題は、「オブジェクト変数またはブロック変数が設定されていません」というエラーが発生し続けていることです。フォーラムダイビングで解決策が得られませんでした。

エラーがdocument.getElementById("prix").FirstChild.innerHTML = .responseText

再び
Option Explicit 

Function loginRematek() 

Dim XMLHttpRequest As New MSXML2.XMLHTTP60 
Dim xhr As MSXML2.XMLHTTP60 
Dim cell 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=&[email protected]&motpasse=password&connexion=Sign in" 
    End With 

    Debug.Print XMLHttpRequest.responseText 

    'Get Element 
    Set xhr = New MSXML2.XMLHTTP60 

    For cell = 1 To 38 

     ItemNbr = Cells(cell, 1).Value 

     With xhr 

      .Open "GET", "https://rematek-energie.com/eng/pg/1/r/" & ItemNbr, False 
      .send 

      If .readyState = 4 And .Status = 200 Then 
       Set document = New MSHTML.HTMLDocument 
       document.getElementById("prix").FirstChild.innerHTML = .responseText 
      Else 
       MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & _ 
       vbNewLine & "HTTP request status: " & .Status 
      End If 

     Cells(cell, 2).Value = .responseText 

     End With 

    Next cell 
End Function 

で発生し、エラーがdocument.getElementById("prix").FirstChild.innerHTML = .responseText

で発生した私は、ターゲットにしようとしているHTMLはpanier_prix_326値ですが、すべてのページにIDの変更、およびIなど複数のページをターゲットにしています。最初に定数prixをターゲットにしてから、その要素の最初の子をターゲットにする方が良いと思いました。

<tr> 
    <td id="col-action"> 
     <div class="prix"> 
      <span id="panier_prix_326">99.40</span> 
      <div id="prix-detail">MSRP: 152.93$</div> 
     </div> 
    </td> 
</tr> 
+0

'document'は、新しい空のドキュメントです。 idを持つ要素を含むことはできません。 'document.getElementById(" prix ")'は常に 'nothing'になります – litelite

+0

これで、ページのHTMLの要素をターゲットにするにはどうしたらいいですか? – ActuallyJane

答えて

3
Set document = New MSHTML.HTMLDocument 
document.getElementById("prix").FirstChild.innerHTML = .responseText 

document空のHTML文書である - 選択するコンテンツがありません。

おそらくこれはあなたが何を望むかである:

If .readyState = 4 And .Status = 200 Then 
    Set document = New MSHTML.HTMLDocument 
    document.body.innerHTML = .responseText 
    Cells(cell, 2).Value = _ 
        document.getElementById("prix").FirstChild.innerHTML 
Else 
    MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & _ 
      vbNewLine & "HTTP request status: " & .Status 
End If 

EDIT - あなたがここにgetElementByIdを使用することはできませんので、あなたのHTMLにid "グランプリ" を持っていません。

<tr> 
    <td id="col-action"> 
     <div class="prix"> 
      <span id="panier_prix_326">99.40</span> 
      <div id="prix-detail">MSRP: 152.93$</div> 
     </div> 
    </td> 
</tr> 

たぶん代わりに:

Cells(cell, 2).Value = _ 
document.getElementById("col-action").getElementsByTagName("span")(0).innerText 
+0

私はこれを試しましたが、 'document.innerHTML = .responseText'は"オブジェクトはこのプロパティやメソッドをサポートしていません "というエラーを返します。 – ActuallyJane

+0

試してみる' document.body.innerHTML' –

+0

その問題を解決しました。 FirstChild.innerHTML'が最初のエラー(「オブジェクト変数またはWithブロック変数が設定されていません」)を再度指定しています – ActuallyJane

関連する問題