2016-03-03 3 views
1

Все,VBA HTML Зачистка - «.innertext» из сложной таблицы

Я создал следующий модуль, чтобы очистить одно значение (изменение ого% лондонские цены на жилье) по указанному ниже адресу:

https://www.hometrack.com/uk/insight/uk-cities-house-price-index/

Конкретное значение вложен в следующем коде:

Please see highlighted Row

в приведенной ниже VBA с Ода - моя попытка соскабливания. Я, возможно, ошибочно считаю, что я очень близок к тому, чтобы зафиксировать ценность, но код не будет работать.

Кто-нибудь знает, где я буду здесь не так? Он не показывает сообщение об ошибке, но также не выводит никаких значений.

Sub HousePriceData() 
     Dim wb As Workbook 
     Dim ws As Worksheet 
     Dim TxtRng As Range 
     Dim ie As Object 
     Dim V As Variant 
     Dim myValue As Variant 

     Set ie = CreateObject("INTERNETEXPLORER.APPLICATION") 
     ie.NAVIGATE "https://www.hometrack.com/uk/insight/uk-cities-house-price-index/" 
     ie.Visible = False 

     While ie.ReadyState <> 4 
      DoEvents 
     Wend 

     Set wb = ActiveWorkbook 
     Set ws = wb.Sheets("Input") 
     Set TxtRng = ws.Range("C15") 

     Set myValue = ie.document.getElementById("cities-index-table").getElementsByTagName("tr")(7).g‌​etElementsByTagName("td")(5) 

     TxtRng = myValue.innerText 
     End Sub 
+0

«код не будет работать» - можете ли вы подробно остановиться на этом? Что происходит или не происходит? Любые сообщения об ошибках? –

+0

Здравствуйте, Tim, он возвращает «Ошибка времени выполнения» 13 ': Тип несоответствия'. Благодарю. – Pineapple

+0

'getElementsByTagName (" tbody ") (12)' - таблица должна иметь только один элемент body. Когда у вас длинная строка кода, например, с несколькими местами, где она может быть ошибкой, лучше всего начать вытаскивать, разбивая ее на отдельные строки, каждый из которых имеет доступ только к одному элементу или коллекции. Вы имели в виду 'getElementsByTagName (" tr ") (12)'? –

ответ

1

Попробуйте использовать XHR и примитивный парсинг вместо неудобной IE:

Sub Test() 

    Dim strUrl As String 
    Dim strTmp As String 
    Dim arrTmp As Variant 

    strUrl = "https://www.hometrack.com/uk/insight/uk-cities-house-price-index/" 
    With CreateObject("MSXML2.XMLHttp") 
     .Open "GET", strUrl, False 
     .Send "" 
     strTmp = .ResponseText 
    End With 
    arrTmp = Split(strTmp, ">London</a></td>", 2) 
    strTmp = arrTmp(1) 
    arrTmp = Split(strTmp, "<td>", 7) 
    strTmp = arrTmp(6) 
    arrTmp = Split(strTmp, "</td>", 2) 
    strTmp = arrTmp(0) 

    ThisWorkbook.Sheets("Input").Range("C15").Value = strTmp 

End Sub 
+0

Спасибо @omegastripes. Это дает значение 1,2% против 0,6% (данные за прошлый месяц в Лондоне)? – Pineapple

+0

@ Ананас проверить обновленный код. – omegastripes

0

использование попробовать этот

Dim Engmt As String 

Engmt = "ERRORHERE" 
On Error Resume Next 
Engmt = Trim(ie.document.getElementById("cities-index- table").getElementsByTagName("tr")(12).g‌​etElementsByTagName("td")(4).innerText) 
On Error GoTo 0 
If Engmt = "ERRORHERE" Then 
TxtRng.Value = "ERROR" 
Else 
TxtRng.Value = Engmt 
End If 
0

Попробуйте это также. Он также даст вам именно то, что вам нужно.

Sub HousePriceData() 
    Const URL = "https://www.hometrack.com/uk/insight/uk-cities-house-price-index/" 
    Dim http As New XMLHTTP60, html As New HTMLDocument 
    Dim htmla As Object, tRow As Object, tCel As Object 

    With http 
     .Open "GET", URL, False 
     .send 
     html.body.innerHTML = .responseText 
    End With 

    Set htmla = html.getElementsByTagName("table")(0) 

    For Each tRow In htmla.Rows 
     For Each tCel In tRow.Cells 
      c = c + 1: Cells(x + 1, c) = tCel.innerText 
     Next tCel 
     c = 0 
     x = x + 1 
    Next tRow 
End Sub