[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]

三流君VBA:IE操作 .parentElement で親のタグを参照?

概要:
IEのドキュメント オブジェクトの操作で、
.parentElement で親のタグを参照できたので、
調子に乗って株価の取り出し処理を作りチェックしてみました
↑ですが、別に無理して .parentElement
親のタグを参照しなくてもよかったり(笑)

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

IE操作 .parentElement で親のタグを参照?

こんにちは。
今回は、解説を忘れていた、使い方によっては便利そうな
IE操作 .parentElement について、
いつものようにキレのない 三流解説だけど・・・
※アレンジして、自分のものにしてください。

/* * 1. 今回のキッカケ */

放置してある、私のBlog 
三流君CODEのゴミ箱 : http://ken3-info.blog.ocn.ne.jp/code_gomibako/
の整理、有効活用をしようと思ってみていたら、
捨てた(おぃおぃ)本人も忘れていたお宝?候補がありました。

って、言っても はてな ですよね。

バックナンバーから過去に投げた(投稿した)コードを見つけました。
IE .parentElement で親を参照?
http://ken3-info.blog.ocn.ne.jp/code_gomibako/2007/09/ie_parentelemen_3d5d.html
↑自分でBlogに投げといて、使っていなかった。

この記事、2007/09/10 04:32 に書いてたんだね、寝ぼけてて忘れてたのかなぁ???

まぁ、そんなこんなは、置いといて、
忘れていたソースコードを貼って実験します。

Sub ie_test()

    Dim objIE      As Object  'IEオブジェクト参照用
    Dim strCOMMENT As String  'コメントの入力
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("何か一言コメントを入れてください")
    If strCOMMENT = "" Then
        MsgBox "何か文字を入れてくださいね"
        Exit Sub  '途中で抜ける
    End If
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"

    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    

     '親のオブジェクトをチェックする
     Dim objITEM As Object
     
     ' .parentElement を代入する 親のオブジェクトを代入
     Set objITEM = objIE.Document.all.Item("MEMO").parentElement
     Debug.Print objITEM.Tagname  'タグの名前
     objITEM.Submit

End Sub
↑ポイントは、 'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。 objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT して、 普通は、objIE.Document.Forms(0).Submit で送信のところを、 何を血迷ったか、 '親のオブジェクトをチェックする Dim objITEM As Object ↑一つオブジェクト変数を作ってから、↓ ' .parentElement を代入する 親のオブジェクトを代入 Set objITEM = objIE.Document.all.Item("MEMO").parentElement ↑そのオブジェクト変数に Document.all.Item("MEMO")の .parentElement を代入して、 objITEM.Submit ↑代入されたobjITEMに対して、.Submit 送信メソッドを発行? ってことは、objITEM = Document.Forms(0) ってことか? あっ、それを確かめたくって、 Debug.Print objITEM.Tagname 'タグの名前 で表示させてるのか。。。
IE Document .parentElement で親を参照?
http://www.youtube.com/watch?v=s__G4KPs3nI

/* * 2.親のオブジェクトがわかるとそんなに便利なの? */

読者の心の声:正直、
.parentElement で 
親のオブジェクトが指定できるのが、
何かそんなにいいのか?わからない。
もしかして、三流君の自己満足?

いままで、目的のオブジェクトを探す時、

.Document.all.Item("MEMO") とか .allから名前を指定
や
.Document.all(0) 番号で指定

.all じゃなくて、Formから
Document.Forms(0).Item("MEMO") とか

前回やった、
.document.all.tags("TD")  '.tags("TD")でTDタグを抜く
と、.tagsを指定したり、
同じような感じの
.document.getElementsByTagName("タグの名前")
や
For Each objTAG In objIE.Document.getElementsByName("KUBUN") '名前がKUBUN
↑では、複数の同一名称から探ったり

まぁ、該当データを探す方法は変わらないのですが、
使い方によっては、親のオブジェクトが参照できるのって便利だと思います。

/* * 3. 具体例で株価の取り出しを行う .tags("DT")でDTタグを抜く */

だからぁ、どんな感じで便利なんだよ。。。
具体例を出せって。

えっと、前回、現在値 株価の取り出しを行いました。

Yahooファイナンスで
【6723】NECエレクトロニクス(株)
を探すと
http://stocks.finance.yahoo.co.jp/stocks/detail/?code=6723
↑上記のように、URLに銘柄コード6723を指定すればOKみたいです。

ここから、
始値 高値 安値 出来高
を抜いてみたいと思います。

まずは、ソースを表示して、探り方を検討ですね。

<div class="lineFi clearfix">
<dl>
<dd class="ymuiEditLink mar0"><strong>472</strong><span class="date yjSt">(09:03)</span></dd>
<dt class="title">始値<a class="tips alignPos" href="" onMouseOver="showTips('hajimarine');" onMouseOut ="hideTips('hajimarine');"><img src="" onmouseover="this.src=''" onmouseout="this.src=''"></a>
<span class="tips yjSt" id="hajimarine">その日はじめについた値段</span></dt>
</dl>
</div>

と、なってます。
ここから、"始値"を探したいので、
まぁ<dt> の タグから"始値"を探して
ここを足がかりに、探ってみたいと思います。
と言っても

前回作成した
http://ken3-info.blog.ocn.ne.jp/objie/2009/02/217_objiedocume_09a9.html
↑2/17 objIE.document.all.tags("TD") '.tags("TD")でTDタグを抜く

これの .tags("TD") を .tags("DT")として、タグDTを取り出してみました。
ソースは、こんな感じ※って↑↓ホントぜんぜん変わってないね。
変数名を変えただけです。

'銘柄コードを入力後、
'IE を 起動して Yahooファイナンスのページを表示する
'その後 DT タグを.tagsで抜いてシートに書き込む   Windows XP IE7 Excel2003 で テスト
Sub test_0313_DT()
  '銘柄コードの入力
    Dim strCODE  As String      '銘柄コード受け取り用
    strCODE = InputBox("銘柄コード", "コード入力", "6723") '手抜きでInputBox関数を使用
  
  'IEを起動して、Yahooファイナンスのページを表示する
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定した文字列のURLを開く
    objIE.Navigate "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & strCODE
    
    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
         DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
         DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop

  'DTデータをシートに書き出す
    '.tags("DT") で DTタグを抜き出す
    Dim objDT As Object 'テーブルオブジェクトの格納用
    Set objDT = objIE.document.all.tags("DT")  '.tags("DT")でDTタグを抜く
    
    'テスト用に新規のブックを追加する
    Workbooks.Add  '新規ブックを追加
    Sheets.Add     'シートを新規追加する
    ActiveSheet.Name = "DTタグを抜くテスト"  'シートに名前を付ける
    
    '列幅を少し大きくする
    Columns("B:D").ColumnWidth = 24
    
    'DTデータをシートに貼り付ける
    Range("A1") = "DTタグを取り出すテスト"
    Range("B1") = objIE.document.URL    'URL情報をB1に書く
    Range("C1") = objIE.document.Title  'タイトル情報をC1に書く
    
    Range("A2") = "変数n"   '見出しをつける
    Range("B2") = ".InnerHTML"   '見出しをつける
    Range("C2") = ".InnerTEXT"   '見出しをつける
    Range("D2") = ".OuterHTML"   '見出しをつける
    
    'いろいろなループを作れるけど、カウンタ n でまわしてみる
    Dim n As Integer
    For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
        Cells(n + 3, "A") = n   'n+3行目にセット
        Cells(n + 3, "B") = "'" & Left(objDT(n).InnerHTML, 255)  'デバック用に左から255文字までセット
        Cells(n + 3, "C") = "'" & Left(objDT(n).InnerTEXT, 255)  'デバックなのでシングルコーテーションを付け
        Cells(n + 3, "D") = "'" & Left(objDT(n).OuterHTML, 255)  '文字列扱いでセットする
    Next n
    

  '終了処理
    '後始末(使った食器はキレイにしてから戸棚に戻そうね)
    Set objDT = Nothing
    
    'objIE.Quit    '今回はコメントにして処理しない(残しておいた方がテスト時は楽です)
    'Set objIE = Nothing
    
    MsgBox "終了しました"
    
End Sub
まぁ、 Set objDT = objIE.document.all.tags("DT") '.tags("DT")でDTタグを抜く と、.tags("DT")にしただけでした。。。
VBA objIE .document .all .tags("DT") でDTタグを抜く
http://www.youtube.com/watch?v=AEbLAROoi7c

/* * 4. テストで DTタグ から 始値を探し、その親を見る */

.tags("DT")で、無事にDTタグのデータが取れたので、
ここから[始値]を含むDTを探します。
さらに、[始値]が含まれるDTオブジェクトが探せたら、
.parentElementでDT[始値]の親オブジェクトを取りたいと思います。

'銘柄コードを入力後、
'IE を 起動して Yahooファイナンスのページを表示する
'その後 DT タグを.tagsで抜いて[始値]を探す、
'見つけたら .parentElementでDT[始値]の親オブジェクトをテスト表示
'Windows XP IE7 Excel2003 で テスト
Sub test_0313_DT_parentElement()
  '銘柄コードの入力
    Dim strCODE  As String      '銘柄コード受け取り用
    strCODE = InputBox("銘柄コード", "コード入力", "6723") '手抜きでInputBox関数を使用
  
  'IEを起動して、Yahooファイナンスのページを表示する
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定した文字列のURLを開く
    objIE.Navigate "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & strCODE

    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
         DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
         DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop

  'DTデータから[始値]を探す
    Dim objParent As Object
    '.tags("DT") で DTタグを抜き出す
    Dim objDT As Object 'DTの格納用
    Set objDT = objIE.document.all.tags("DT")  '.tags("DT")でDTタグを抜く
    
    'いろいろなループを作れるけど、カウンタ n でまわしてみる
    Dim n As Integer
    For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
        If Left(objDT(n).InnerHTML, 3) = "始値<" Then   '[始値<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            Debug.Print ".tagname = " & objParent.tagname
            Debug.Print ".OuterHTML = [" & objParent.OuterHTML & "]"
            MsgBox objParent.OuterHTML  '親オブジェクトのHTMLを画面で確認
            Exit For
        End If
    Next n
    

  '終了処理
    '後始末(使った食器はキレイにしてから戸棚に戻そうね)
    Set objDT = Nothing
    
    objIE.Quit    '終了処理
    Set objIE = Nothing
    
    MsgBox "終了しました"
    
End Sub
まずは、 Set objDT = objIE.document.all.tags("DT") '.tags("DT")でDTタグを抜く で指定したタグ ここでは、DTを取り出します。 n=0のループを作りまわします。 For n = 0 To objDT.Length - 1 'カウンタ0から.length - 1 までまわす。 If Left(objDT(n).InnerHTML, 3) = "始値<" Then '[始値<]を探す ↑If文で、左から3文字チェックして、始値のオブジェクトを探します。 Set objParent = objDT(n).parentElement '親オブジェクトを代入 ↑見つかったら、.parentElement で 親オブジェクトを代入します。     ↓あとは、.tagname と .OuterHTML をテストで表示させました。 Debug.Print ".tagname = " & objParent.tagname Debug.Print ".OuterHTML = [" & objParent.OuterHTML & "]" MsgBox objParent.OuterHTML '親オブジェクトのHTMLを画面で確認 デバック結果 .tagname = DL .OuterHTML = [ <DL><DD class="ymuiEditLink mar0"><STRONG>472</STRONG><SPAN class="date yjSt">(03/13)</SPAN> <DT class=title>始値<A class="tips alignPos" onmouseover="showTips('hajimarine');" onmouseout="hideTips('hajimarine');" href=""><IMG onmouseover="this.src=''" onmouseout="this.src=''" src=""></A> <SPAN class="tips yjSt" id=hajimarine> その日はじめについた値段</SPAN> </DT></DL>]
IE操作 DTタグ から 文字 [始値] を探し その親を .parentElement で見る
http://www.youtube.com/watch?v=perDI1yOyqU

/* * 5.<DL>タグの中の <STRONG>タグを取り出す。 */

次は、取り出した親タグ<DL>の中から、

> <dl>
> <dd class="ymuiEditLink mar0"><strong>472</strong><span class="date yjSt">(09:03)</span></dd>
> <dt class="title">始値<a class="tips alignPos" href="" onMouseOver="showTips('ha

↑から、<STRONG>472</STRONG> ←コイツを探して取り出します。

命令や方針がわからないので、
STOP で 止めます。

読者の声:何独り言言ってんだか・・・
自分だけわかったように書いて進めるな?

スイマセン、えっと、
STOPと命令を書くと、プログラムが止まってくれるんですよ。
例えば、

    For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
        If Left(objDT(n).InnerHTML, 3) = "始値<" Then   '[始値<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            Debug.Print ".tagname = " & objParent.tagname
            Debug.Print ".OuterHTML = [" & objParent.OuterHTML & "]"
            Stop '←STOPと書くと、
            Exit For
        End If
    Next n

↑これを実行すると、黄色く止まると思います。



ここで、イミディエイトで、
a = objParent.all.tags("STRONG")
? a.innertext
など、いろいろとでバックや値のチェックできるんですよ。

objParent.all.tags("STRONG")
不思議な書き方ですよね。
.all で 自分の下のタグにアクセス可能、
で、タグを指定したいので、
.tags("STRONG")
これが a に入るので、
? a.innertext
こんなたどり着き方もあるんですよ。
VBA IE デバッグ STOP で 止め オブジェクトを探る
http://www.youtube.com/watch?v=II7Dqz8Z4O4

> <dl>
> <dd class="ymuiEditLink mar0"><strong>472</strong><span class="date yjSt">(09:03)</span></dd>
> <dt class="title">始値<a class="tips alignPos" href="" onMouseOver="showTips('ha

始値 高値 安値 出来高
上記4つを 実際に取り出してみます。

Set objParent = objDT(n).parentElement  '親オブジェクトを代入
で、n番目の<DT> その親タグ<DL>が取り出せます。
ここから、取り出した親タグのオブジェクトに対して、
objParent.all.tags("STRONG")
で、子供のタグ(正確には、.allからSTRONGタグを抜き出す)
を取り出します。


'銘柄コードを入力後、
'IE を 起動して Yahooファイナンスのページを表示する
'始値 高値 安値 出来高 を探す、
'見つけたら 値をイミディエイトにテスト表示
'Windows XP IE7 Excel2003 で テスト
Sub test_0314_KABUKA_GET_TEST()
  '銘柄コードの入力
    Dim strCODE  As String      '銘柄コード受け取り用
    strCODE = InputBox("銘柄コード", "コード入力", "6723") '手抜きでInputBox関数を使用
  
  'IEを起動して、Yahooファイナンスのページを表示する
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定した文字列のURLを開く
    objIE.Navigate "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & strCODE

    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
         DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
         DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop

  'DTデータから[始値] などを探す
    Dim objParent As Object     '親のタグ オブジェクト
    Dim objTagSTRONG As Object  'STRONG の タグを保存する変数

    '.tags("DT") で DTタグを抜き出す
    Dim objDT As Object 'DTの格納用
    Set objDT = objIE.document.all.tags("DT")  '.tags("DT")でDTタグを抜く
    
    'いろいろなループを作れるけど、カウンタ n でまわしてみる
    Dim n As Integer
    For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
    
        If Left(objDT(n).InnerHTML, 3) = "始値<" Then   '[始値<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            '次にSTRONG 強調表示の値を探す
            Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
            '値の表示
            Debug.Print "始値 = " & objTagSTRONG.Item(0).InnerText   'STRONG タグ のテキスト
        End If
    
        If Left(objDT(n).InnerHTML, 3) = "高値<" Then   '[高値<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            '次にSTRONG 強調表示の値を探す
            Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
            '値の表示
            Debug.Print "高値 = " & objTagSTRONG.Item(0).InnerText   'STRONG タグ のテキスト
        End If
    
        If Left(objDT(n).InnerHTML, 3) = "安値<" Then   '[安値<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            '次にSTRONG 強調表示の値を探す
            Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
            '値の表示
            Debug.Print "安値 = " & objTagSTRONG.Item(0).InnerText   'STRONG タグ のテキスト
        End If
    
        If Left(objDT(n).InnerHTML, 4) = "出来高<" Then   '[出来高<]を探す
            Set objParent = objDT(n).parentElement  '親オブジェクトを代入
            '次にSTRONG 強調表示の値を探す
            Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
            '値の表示
            Debug.Print "出来高 = " & objTagSTRONG.Item(0).InnerText  'STRONG タグ のテキスト
        End If
    
    Next n
    

  '終了処理
    '後始末(使った食器はキレイにしてから戸棚に戻そうね)
    Set objDT = Nothing
    
    'objIE.Quit    '終了処理  ← テストで残したかったので、コメントにした。
    'Set objIE = Nothing
    
    MsgBox "終了しました"
    
End Sub
ポイントは、 If Left(objDT(n).InnerHTML, 3) = "始値<" Then '[始値<]を探す で、目的のDTタグを見つけます。みつけたら Set objParent = objDT(n).parentElement '親オブジェクトを代入 で、親のタグ DL を.parentElementでセットします。 '次にSTRONG 強調表示の値を探す Set objTagSTRONG = objParent.all.tags("STRONG") で、 '.tags("STRONG")でSTRONGタグを抜く '値の表示 Debug.Print "始値 = " & objTagSTRONG.Item(0).InnerText 探した、STRONG タグ のテキスト を 表示できました。 End If
IE を 起動して Yahooファイナンス 始値 高値 安値 出来高 を探す
http://www.youtube.com/watch?v=3kE-MqdfPAo

/* * 6.Array関数で配列を作って、処理をまとめてみました。 */

これで、終わると、読者に怒られますよね。
始値 高値 安値 出来高
の処理で、同じIf文を使って同じような処理を行ってます。

三流以外の普通のプログラマーなら、処理をまとめます。
同じ処理なら、配列とループの出番ってことで、
Array 関数を使用して、処理をまとめてみたいと思います。

で、作成したのが↓こんな感じです。

'銘柄コードを入力後、
'IE を 起動して Yahooファイナンスのページを表示する
'始値 高値 安値 出来高 を探す、
'見つけたら 値をイミディエイトにテスト表示
'Windows XP IE7 Excel2003 で テスト
Sub test_0314_KABUKA_GET_TEST()
  '銘柄コードの入力
    Dim strCODE  As String      '銘柄コード受け取り用
    strCODE = InputBox("銘柄コード", "コード入力", "6723") '手抜きでInputBox関数を使用
  
  'IEを起動して、Yahooファイナンスのページを表示する
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定した文字列のURLを開く
    objIE.Navigate "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & strCODE

    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
         DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
         DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop

  'DTデータから[始値] などを探す
    Dim objParent As Object     '親のタグ オブジェクト
    Dim objTagSTRONG As Object  'STRONG の タグを保存する変数

    '.tags("DT") で DTタグを抜き出す
    Dim objDT As Object 'DTの格納用
    Set objDT = objIE.document.all.tags("DT")  '.tags("DT")でDTタグを抜く
    
    'いろいろなループを作れるけど、カウンタ n でまわしてみる
    Dim n As Integer
    Dim x As Integer
    Dim BOX As Variant

    BOX = Array("始値", "安値", "高値", "出来高")

    For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
        For x = 0 To 3
            If Left(objDT(n).InnerHTML, 1 + Len(BOX(x))) = BOX(x) & "<" Then '[始値<]を探す
                Set objParent = objDT(n).parentElement  '親オブジェクトを代入
                '次にSTRONG 強調表示の値を探す
                Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
                '値の表示
                Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerText   'STRONG タグ のテキスト
            End If
        Next x
    Next n
    

  '終了処理
    '後始末(使った食器はキレイにしてから戸棚に戻そうね)
    Set objDT = Nothing
    
    'objIE.Quit    '終了処理  ← テストで残したかったので、コメントにした。
    'Set objIE = Nothing
    
    MsgBox "終了しました"
    
End Sub
ポイントは、 BOX = Array("始値", "安値", "高値", "出来高") で、変数BOXを文字列で初期化します。 For n = 0 To objDT.Length - 1 'カウンタ0から.length - 1 までまわす。 あとは、0から3のループを作り、 For x = 0 To 3 If Left(objDT(n).InnerHTML, 1 + Len(BOX(x))) = BOX(x) & "<" Then ↑BOX(x)を使用して、条件文を変更しました。 Set objParent = objDT(n).parentElement '親オブジェクトを代入 '次にSTRONG 強調表示の値を探す Set objTagSTRONG = objParent.all.tags("STRONG") '.tags("STRONG")でSTRONGタグを抜く ↑ここは、変わりなく、単純に親タグからSTRONGを探してます。 '値の表示 Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerText ↑ここは、見出しの文字を Box(x) で使用してます。 End If Next x Next n 読者の声で 初めから 書けよ。。。と言われそうな。。。
03/14 Array 関数を使用して処理をまとめる
http://www.youtube.com/watch?v=Faq5AuMRliA

/* * 7.エラー処理を入れる 危ないポイント、見つからない時の処理 */

三流プログラムの特徴として、
エラー処理を省いてます。

コードを公開するなら、丁寧に作らないと、
三流コード被害者の会 から また、クレームの書き込みとメールをもらうかなぁ。

今回は、危ないポイントを1つ
※それでもエラー処理は1つだけしかやらないのかよ。

危ないのは、ココ
Set objParent = objDT(n).parentElement  '親オブジェクトを代入
'次にSTRONG 強調表示の値を探す
Set objTagSTRONG = objParent.all.tags("STRONG")
↑.tags("STRONG")でSTRONGタグを抜く
ここで、もし、STRINGのタグ、指定したタグが無かったら?

指定したタグが無い時のテストをしてみます。

Set objTagSTRONG = objParent.all.tags("KEN3")
とか、ありえないタグでテストすると、エラーが発生します。
エラー発生時、デバッグでとめて、
? objTagSTRONG.Length
と確認すると、0が返ってきます。

.Length で 抜き出した数がわかるので、0以外の判断でいけそうです。

If objTagSTRONG.Length <> 0 Then
    Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerText 
End If

と、単純にチェックしました。
三流コード被害者の会 会員の皆様にお知らせします。。。
03/14 エラー処理を入れる 危ないポイント、見つからない時の処理
http://www.youtube.com/watch?v=y1I1PycOb0s

/* * 8.せっかくなんで、前回の現在値とあわせてみる */

前回、株価の現在値の取り出しを行いました。

せっかくなんで、このプログラムとあわせてみます。

仕様は

       A列        B      C    D    E     F        G列
9行  銘柄コード	現在値	始値 安値 高値	出来高	タイトル
10行  9999
11    9999
12    9999
13    9999

A列の10行目から、調査したい銘柄コードを入れ、
現在値	始値 安値 高値	出来高 を セットする、
そんなラフな仕様で作成を開始します。

と、いっても、部分的に完成しているので、

前回 入力された銘柄コード分 現在値を取り出すことができました。
今回 始値 安値 高値 出来高 4つの値の取り出しをテストしました。

2つのプログラムをまとめます。
で、作成すると、こんな感じになりました。

'  A列に入力された銘柄コードを使用して、
'6723
'6502
'  ・
'  ・
'6753
'と、調査したい銘柄コードをA列10行目から好きなように記入して、
'A列の中身が空白になるまで値をYahooファイナンスから連続で取り出し、
'B列に現在値 C:始値 D:高値 E:安値 F列:出来高 をセットします。

Sub test_0315_KABUKA_GET()
  
  '初期処理 まず、外側でIEを起動する
    Dim strTITLE As String  'Webページのタイトル保存用
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

  'A列の銘柄がなくなるまで、10行目からループ
    Dim y As Integer      'Y行カウンタ
    Dim strCODE As String 'コード保存用
    Dim objTD As Object 'テーブルオブジェクトの格納用
    Dim n As Integer        'TDのループで使うカウンタ
    Dim lngKABUKA As Long   '株価(現在値)一時保存用

    For y = 10 To 9999    '10行目から9999行目までのループを作る
        strCODE = Cells(y, "A")  '銘柄コードを1つ取り出す
        Debug.Print strCODE
        If Len(strCODE) = 0 Then '文字数が0なら空白とみなしループを抜ける
            Exit For      'forのy行 ループを抜ける
        End If
      'Yahooファイナンスのページを表示させる
        '.Navigate で strCODEを付加した文字列のURLを開く
    objIE.Navigate "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & strCODE

      '表示が完了するまで待つ
        '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
        Do While objIE.Busy = True
             DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Loop
        Do While objIE.ReadyState <> 4
             DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
        Loop
        
        strTITLE = objIE.document.Title  'ドキュメントのタイトルを保存する
        Cells(y, "G") = strTITLE         'G列に Webページのタイトルをセットする
    
      '現在値・株価を取り出す※探す
        Set objTD = objIE.document.all.tags("TD")  '.tags("TD")でTDタグを抜く
    
        '左から3文字が[現在値]のデータを探す 文字現在値の隣の値を抜き出す・・
        lngKABUKA = -1   'ありえない価格 −1を入れる※あとでエラーチェックで使う
        For n = 0 To objTD.Length - 1  'カウンタ0から.length - 1 までまわす。
            If Left(objTD(n).InnerTEXT, 3) = "現在値" Then  '左から3文字をチェックする
                lngKABUKA = CLng(objTD(n + 1).InnerTEXT)  'n+1番目を変換し 株価・現在値
                Exit For  '探し終わったので、TDのループを抜けます
            End If
        Next n
        
        '後始末(使った食器はキレイにしてから戸棚に戻そうね)
        Set objTD = Nothing
      
      'B列にセット
        If lngKABUKA = -1 Then  '見つからなかったエラーのチェック
            Cells(y, "B") = "エラー 値の検索に失敗しました。"
        Else
            Cells(y, "B") = lngKABUKA   'B列に取り出した値をセットする。
        End If
      
      'C列:始値 D列:高値 E列:安値 F列:出来高 をセット
        'DTデータから[始値] などを探す
        Dim objParent As Object     '親のタグ オブジェクト
        Dim objTagSTRONG As Object  'STRONG の タグを保存する変数
    
        '.tags("DT") で DTタグを抜き出す
        Dim objDT As Object 'DTの格納用
        Set objDT = objIE.document.all.tags("DT")  '.tags("DT")でDTタグを抜く
        
        'いろいろなループを作れるけど、カウンタ n でまわしてみる
        Dim x As Integer
        Dim BOX As Variant
        
        BOX = Array("始値", "安値", "高値", "出来高")  '条件を初期化
        
        For n = 0 To objDT.Length - 1  'カウンタ0から.length - 1 までまわす。
            For x = 0 To 3
                If Left(objDT(n).InnerHTML, 1 + Len(BOX(x))) = BOX(x) & "<" Then '[始値<]を探す
                    Set objParent = objDT(n).parentElement  '親オブジェクトを代入
                    '次にSTRONG 強調表示の値を探す
                    Set objTagSTRONG = objParent.all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
                    '値の表示
                    If objTagSTRONG.Length <> 0 Then
                        Cells(y, 3 + x) = CLng(objTagSTRONG.Item(0).InnerTEXT)
                        Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerTEXT   'STRONG タグ のテキスト
                    End If
                End If
            Next x
        Next n
    
    Next y   '行のループ、次の行へ
  
  '終了処理
    objIE.Quit    '今回は.QUITで使ったIEを閉じてみた。
    Set objIE = Nothing

End Sub
↑なんか、簡単に結合・作成できたと、文章だけだと感じるけど、 ↓実際は、ボロボロなやっつけ仕事でした。う〜ん。(作成過程を見せると 恥ずかしい失敗の連発・・・)
03/15 VBA IE 株価の取り込み プログラム結合でグダグタ
http://www.youtube.com/watch?v=nJqaTWGxXd0

/* * 9.終わりの挨拶 */

今回は、
ドキュメント、タグのオブジェクトで、
.parentElement で親のタグを参照?
を書いてみました。

サンプルファイル(Excel2003 Windows XP IE7でテスト)
http://www.ken3.org/vba/lzh/IE_TEST_0313.zip
zipを解答解凍して中のIE_TEST_0313.xlsを実行しながら確認してみてください。

読者の声:
 だから、.parentElement で親のタグを参照 は わかったけど、
 使用すると便利なメリットがわからなかった。

ギク、、、確かに今回の処理では、メリット無かったですね。
※おぃおぃ、なんで発行したんだよ。

例えば、今回の取り出しなら、

> <dl>
> <dd class="ymuiEditLink mar0"><strong>472</strong><span class="date yjSt">(09:03)</span></dd>
> <dt class="title">始値<a class="tips alignPos" href="" onMouseOver="showTips('ha

まず、DLのタグでループを作り、
 その下の、DTを取り出し、
  DT内に 始値や安値・高値・出来高があるかチェック
      見つかったら、STRONGタグを取り出す。
        取り出したSTRONGタグのInnerTextが値です。

と、前回やった、.tags("タグ") で OKだし、こっちのほうがスッキリしてる?

    '.tags("") で タグを抜き出す
    Dim objDT As Object 'DTの格納用
    Dim objDL As Object
    Dim objTagSTRONG As Object  'STRONG の タグを保存する変数

    'いろいろなループを作れるけど、カウンタ n でまわしてみる
    Dim n As Integer
    Dim x As Integer
    Dim BOX As Variant
    
    BOX = Array("始値", "安値", "高値", "出来高")

    Set objDL = objIE.document.all.tags("DL")  '.tags("DL")でDLタグを抜く

    For n = 0 To objDL.Length - 1  'カウンタ0から.length - 1 までまわす。
        Set objDT = objDL(n).all.tags("DT")   '.tags("DT")を探す DTタグを抜く
        If objDT.Length <> 0 Then
            For x = 0 To 3
                If Left(objDT.Item(0).InnerHTML, 1 + Len(BOX(x))) = BOX(x) & "<" Then '[始値<]を探す
                    '次にSTRONG 強調表示の値を探す
                    Set objTagSTRONG = objDL(n).all.tags("STRONG")  '.tags("STRONG")でSTRONGタグを抜く
                    '値の表示
                    If objTagSTRONG.Length <> 0 Then
                        Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerTEXT   'STRONG タグ のテキスト
                    End If
                End If
            Next x
        End If
    Next n

↑、まぁ、こっちも正解ってことで。(こっちのほうがわかり易いかも???)
↓で、また、話しながら修正したのが↓今度は成功したのかなぁ(笑)
[03/15 終わりの挨拶 と 閉店間際に別パターンを提示]

プログラム作りは
^^^^^^^^^^^^^^^^
う〜ん・・・
まぁ、人それぞれ、十人十色、百社百色だけどね。
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

今回も逃げるように失礼します。

おい、待てよ。
えっ、何か?

[何か]じゃねぇだろ、何かじゃ・・・

OS:VistaのIE7 と Excel2007 で サンプル動かないよ・・・

あらら、テスト環境が一昔前の XP + Excel2003 だった。。。

複数環境で動くように記述しないと また怒られるよ。
もうすぐIE8もリリースされるってのに・・・まったく使えないな三流君は。。。

AB型の変わり者、三流プログラマーのKen3でした。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]