2016-05-24 3 views
0

Я пытаюсь использовать класс MSXML2 для входа на сайт и загрузки цен в таблицу. У меня есть список номеров продуктов, которые код использует для поиска продукта, а затем он должен вытащить элемент цены из html.getElementById FirstChild throws Ошибка времени выполнения 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 на каждой странице, и как я Я нацелился на несколько страниц, я думал, что лучше ориентировать сначала константу 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 - ваш HTML не имеет идентификатор «Prix», так что вы не можете использовать getElementById здесь.

<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

Это решило эту проблему , но теперь 'Cells (cell, 2) .Value = document.getElementById (« prix »). FirstChild.innerHTML' возвращает первую ошибку (« Object variable или With block variable not set ») снова – ActuallyJane

Смежные вопросы