2017-01-29 24 views
3

株価の最終価格をExcelワークシートにコピーしようとしています。 Internet Explorerが開き、サイトに移動しますが、最後の価格はワークシートにコピーされません。 Debug.Print element.innertextを追加して、何かがコピーされているかどうかを確認しましたが、直接のボックスには何も表示されません。Excel VBA IDで要素を取得

これは私がこれまで持っているものです。

Dim element As IHTMLElement 
Dim elements As IHTMLElementCollection 

Dim ie As New InternetExplorer 
Dim html As HTMLDocument 

my_page = "http://www.morningstar.com/stocks/XASX/COH/quote.html" 

With ie 
    .Visible = TRUE 
    .Navigate my_page 

    Do While ie.readyState <> READYSTATE_COMPLETE 
    Loop 

    Set html = ie.document 
    Set element = html.getElementById("last-price-value")  
    Debug.Print element.innertext 

    Sheets("Sheet 1").Range("A2").Value = element.innertext  
End With 
+1

IDで* last-price-value *に設定された要素のようなものは、コード内のページにありません。これを確認するには、Webブラウザでページを開き、Webツールを開いてコンソールに行き、 '' document.getElementByID( 'last-price-value') '' 'を実行することで確認できます。したがって、問題はセレクタであり、コードではありません。 – mTorres

+0

ありがとうございます。私はこの要素の内側のテキストをコピーしようとしています:

127.36
。つまり、コードをgetElementsByCaseName()に変更する必要がありますか?ありがとう –

+0

あなたの問題は、要素がiframeの内側にあることです。あなたは直接それを参照することはできません、まず、iframeのドキュメントを取得する必要があります、その後、あなたが進むことができます。今、私はこれを行う方法がわからないが、それは難しいはずはありません、あなたは[ここで]開始することができます(http://stackoverflow.com/questions/1088544/javascript-get-element-from-within- an-iframe)。 – mTorres

答えて

0

だから、問題は最後の価格-value要素がiFrame-ののiframe内に含まれていることですが、痛みを少しされ、特別な構文を必要とし、データを取得するためのいくつかの追加ステップ - 基本的には、iFrameを見つけて.ContentDocumentを使用してHTMLを取得し、通常どおりにHTMLドキュメントを使用できます。ただし、iFrameからデータを抽出するこのケースは特にメインのWebページがiFrameが別のドメインにある1つのドメイン上にあるため、メインページからiFrameのHTMLにアクセスできなくなるので痛いです...だから、代わりに何をしなければならないのですか: の1-ロードメインページ 2-フレームを探す 、3-フレームのURLを取得します 、4-ロードフレームURL 、5-最後-価格-値を引いて...

は、次のコード例を参照してください。

Public Sub sampleCode() 
Dim IE As New InternetExplorer 
Dim HTMLDoc As HTMLDocument 
Dim parentURL As String 
Dim frames As IHTMLElementCollection 
Dim frameURL As String 
Dim frameHTML As HTMLDocument 
Dim fCounter As Long 
Dim targetElement As HTMLObjectElement 

parentURL = "http://www.morningstar.com/stocks/XASX/COH/quote.html" 
'1- Load the main page 
With IE 
    .Visible = False 
    .Navigate parentURL 
    While .Busy Or .readyState <> READYSTATE_COMPLETE: Wend 
    Set HTMLDoc = IE.document 
End With 

'2- Find the frame 
Set frames = HTMLDoc.getElementsByTagName("iframe") 
'Loop through all the frames 
For fCounter = 0 To frames.Length - 1 
    'Test each frame's ID to find the correct one (numerical appendix to ID can change so need to test for pre-fix) 
    If Left(frames(fCounter).ID, 10) = "QT_IFRAME_" Then 
     '3- Get the frame's URL 
     frameURL = frames(fCounter).src 
     Exit For 
    End If 
Next 

'4- Load the frame URL 
With IE 
    .Navigate frameURL 
    While .Busy Or .readyState <> READYSTATE_COMPLETE: Wend 
    Set frameHTML = IE.document 
End With 

'Find and pull the last price 
Set targetElement = frameHTML.getElementById("last-price-value") 
Sheets("Sheet 1").Range("A2").Value = CDbl(targetElement.innerText) 

IE.Quit 
Set IE = Nothing 
End Sub 

また、ヤフーソースに切り替えることであなたが不明確なミューチュアルファンドやプライベートファンドの価格を引っ張っているため、Morningstarが必要な場合を除き、ヤフーは株価を引き出すかなり簡単なVBAインターフェイスを持っています。 。

希望すると、 TheSilkCode