2013-11-25 2 views
4

Я использую excel для получения значений с веб-страницы. Среди других элементов HTML содержится следующая таблица:Excel VBA: Получить внутренний текст таблицы HTML td

<div id="myDiv">  
<table class="myTable"> 
     <tbody> 
      <tr> 
       <td>Text1:</td> 
       <td class="data"><strong>0.51</strong></td> 
      </tr> 
      <tr> 
       <td>Text2:</td> 
       <td class="data"><strong>2199</strong></td> 
      </tr> 
     </tbody> 
    </table> 
</div> 

Страница хранится в переменной oHtml. Он отлично работает, чтобы захватить другие элементы за пределами этой таблицы. Но когда я пытаюсь захватить 0,51 значение, например, я использую JS в консоли:

document.getElementById("myDiv").getElementsByClassName("myTable")[0].getElementsByClassName("data")[0].innerText 

И выбирается значение 0,51.

Однако, следующий код VBA, используемый внутри функции, возвращает #VALUE!

Function myFunction(id) 
Call myConnection(id)  
Set myDadta = oHtml.getElementById("myDiv").getElementsByClassName("myTable")(0).getElementsByClassName("data")(0) 
     myFunction = myData.innerText 
End Function 

Это соединение IE:

Public Sub myConnection(id) 

Set oHtml = New HTMLDocument 

With CreateObject("WINHTTP.WinHTTPRequest.5.1") 
    .Open "GET", "http://www.example.com" & id, False 
    .send 
    oHtml.body.innerHTML = .responseText 
End With 

End Sub 

Как я уже сказал, этот вид синтаксиса работает отлично с другими элементами из этой таблицы в этой же странице, так почему я получаю это ошибка?

ответ

7

Вы, кажется, опечатка в вашем имени переменной. Вы использовали Option Explicit?

Function myFunction(id) 
    Call myConnection(id)  
    Set myDadta = oHtml.getElementById("myDiv").getElementsByClassName("myTable")(0).getElementsByClassName("data")(0) 
    myFunction = myData.innerText ' <-- This line 
End Function 

UPDATE

Я поставил кнопку на VBA форму и следующий исправленный код, который работает:

Option Explicit 

Dim oHtml, myData 

Private Sub CommandButton1_Click() 
    MsgBox myFunction(0) 
End Sub 

Function myFunction(id) 
    Call myConnection(id) 
    Set myData = oHtml.getElementById("myDiv").getElementsByTagName("Table")(0).getElementsByTagName("td")(1) 
    myFunction = myData.innerText ' <-- will give 0.51 
End Function 

Public Sub myConnection(id) 
    Set oHtml = New HTMLDocument 
    With CreateObject("WINHTTP.WinHTTPRequest.5.1") 
     '.Open "GET", "http://www.example.com" & id, False 
     .Open "GET", "http://localhost/Test/Test.htm", False '<-- this is my local machine; replace appropriately 
     .send 
     oHtml.body.innerHTML = .responseText 
    End With 
End Sub 

ОБНОВЛЕНО КОД ПОКАЗАТЬ ФУНКЦИИ НА ЖИВОЙ URL

Option Explicit 

Dim oHtml, myData 

Private Sub CommandButton1_Click() 
    MsgBox myFunction(0) 
End Sub 

Function myFunction(id) 
    Call myConnection(id) 
    Set myData = oHtml.getElementById("overallRatios").getElementsByTagName("Table")(0).getElementsByTagName("td")(1) 
    myFunction = myData.innerText 
End Function 

Public Sub myConnection(id) 
    Set oHtml = New HTMLDocument 
    With CreateObject("WINHTTP.WinHTTPRequest.5.1") 
     '.Open "GET", "http://www.example.com" & id, False 
     .Open "GET", "http://www.reuters.com/finance/stocks/overview?symbol=PTI.LS", False 
     .send 
     oHtml.body.innerHTML = .responseText 
    End With 
End Sub 

screenshot of working demo

+0

+ 1 LOL Nice catch :) –

+1

Это было только на первый взгляд. С кодом больше проблем. Публикация обновлений ... –

+0

Извините, он возвращает #VALUE! Вы можете получить значение бета-версии этой страницы (1.12) http://www.reuters.com/finance/stocks/overview?symbol=PTI.LS –

4

Это работает для меня. Я поставил ссылку на Microsoft HTML Object Library

BTW вам не хватает " в <div id=myDiv">

Option Explicit 

Sub Sample() 
    Dim objIe As Object, xobj As HTMLDivElement 

    Set objIe = CreateObject("InternetExplorer.Application") 
    objIe.Visible = True 

    objIe.navigate "C:\a.htm" 

    While (objIe.Busy Or objIe.READYSTATE <> 4): DoEvents: Wend 

    Set xobj = objIe.document.getElementById("myDiv") 
    Set xobj = xobj.getElementsByClassName("myTable").Item(0) 
    Set xobj = xobj.getElementsByClassName("data")(0) 

    Debug.Print xobj.innerText 

    Set xobj = Nothing 

    objIe.Quit 
    Set objIe = Nothing 
End Sub 

Скриншот:

enter image description here

+0

Я получаю ошибку времени выполнения '91' Объектная переменная или с переменной блока, не заданной в строке. Установить xobj ... –

+0

Вы установили ссылку на «Microsoft HTML Object Library»? –

+0

Да, ваш код верен. Теперь я вижу, но это не работает для меня, потому что я установил другое соединение, я отредактирую свой вопрос выше. –

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