2017-09-14 18 views
0

私はmorningstarのウェブサイトで資金量を更新しようとしています。私の以前のIE自動化の試みは機能しませんでしたので、XML httpRequestに切り替えました。今私は、私がウェブサイトから入手した文書から正しい行を印刷することに困難を抱えています。私はコードが私に "tr"タグの中に3番目の "td"タグを与えることを望みます。これは "td"タグが "Fund Size(Mil)"と呼ばれています。だから、コードはすべての "td"タグの見出しをループし、その結果が"{line heading}" = "Fund Size (Mil)"であればアクションにジャンプします。今これが問題です。私はこれらの見出しを参照する方法を知らない。VBAのHTML解析

"td"タグを変数に設定しようとしました( "tr"タグに3つの "td"タグがあるので、変数 "row1"、row2、row3 "td-tag" )が、私は今これを行うにしようとすると、私は実行時エラー438を取得:さらに、I Debug.Print TDElement.innerHTML、私は見ていないときにオブジェクトが行にこのプロパティまたはメソッドをサポートしていません

Debug.Print TDElements.getElementsByTagName("tr")(0).Cells(0).innerHTML 

を私が必要とする「td」タグ。代わりに.innerTextを代わりに入力すると、すべての「td」タグが表示されます。

今質問は次のとおりです。 1)見出しを直接参照するにはどうすればよいですか? (For Eachループ内のコメント行を参照してください) 2).innerHTMLですべてのtdタグが表示されない理由は何でしょうか。

のURL http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW エクセル2010、IEのバージョン11

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

Dim myurl As String 
Dim TDElement As Object 
Dim TDElements As IHTMLElementCollection 
Dim IE As MSXML2.XMLHTTP60 

Dim HTMLDoc As MSHTML.HTMLDocument 
Dim HTMLBody As MSHTML.HTMLBody 

Set IE = New MSXML2.XMLHTTP60 
Set HTMLDoc = New MSHTML.HTMLDocument 
Set HTMLBody = HTMLDoc.body 


myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
IE.Open "GET", myurl, False 
IE.send 

HTMLBody.innerHTML = IE.responseText 

Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     Debug.Print TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
'  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
'   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
    Next 


End Sub 

H2SO4の答えは、上記の問題を修正しました。以下は最初の質問への拡張です。

TDElementには、2行のテキストが割り当てられます(h2so4の値10を3に変更しました。したがって、資金化文字列が見つかるとコードに次の3行が表示されます)。これをさらに解析するにはどうすればよいですか?現在の行Worksheets("helper").Cells(x, 6).Value = Split(TDElement.innerText, " ")(1)は私が必要とする値(769.28)を返しますが、実際にここで何が起こっているのか本当に分かっていれば、将来的に役立ちます。

練習のために、私はどのようにして自分のセルに3行すべてを印刷するのですか?したがって、出力は、ファンドサイズ(Mil)、31/08/2017、セル(x、6)、(x、7)、(x、8)の769.28となります。関数 "Split"または "Left"をTDElementに使用すると、関数は上の他の行ではなく最後の行のみを対象とします。しかし、私がDebug.Print TDElement.innerText/.innerHTMLとなると、私は他の行も見ています。では、最後の行の上にある行にはどうすればアクセスできますか? Debug.Print TDElement.innerText

出力:

基金サイズ(ミル)

31/08/2017

EUR 769.28

答えて

0

次のコードは、 "ファンドの大きさ" 行にあなたを取得します

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      Debug.Print ":" & TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
      '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
      '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      k = k + 1 
      If k < 10 Then Flag = True Else Flag = False 
     End If 
    Next 


End Sub 
+0

ありがとうございました!これは機能します。新しい整数変数nを宣言してコードを修正し、10の代わりに3に設定しました(必要な行のみを対象としています)。しかし、私はコードが返す最後の行だけを解析できる理由を知りたいと思います。上記の最初の質問**の拡張子をご覧ください。 – Samppa

0

あなたの内線に答えるには、 nswerは、ページがどのように設計されているかによって異なります。ここでは、3つの異なるセルでデータを取得するための可能なソリューションです。

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long, text 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      text = Split(TDElement.innerText, vbLf) 
      If text(0) <> "" Then 
       Worksheets("Sheet3").Cells(3, k + 2).Resize(, UBound(text) + 1) = text '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
       '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
       '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      End If 
      k = k + 1 
      If k < 3 Then Flag = True Else Flag = False 
     End If 
    Next 
End Sub