[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.116 InternetExplorer操作 Frameと遊ぶ Objectを探る方法

InternetExplorer操作 Frameと遊ぶ Objectを探る方法

概要:
F2のオブジェクトブラウザを使って、Frameを探り、
フレーム分割された画面に対して、データをセットしてみました。
objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
とフレーム関係を探ってみました。


また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

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

メルマガ発行内容

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

どうも、三流プログラマーのKen3です。

今回は、
InternetExplorerの操作で、Frame関係を探ってみます。
なかなか、相手は強敵でした・・・

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

掲示板に下記の質問をもらいました。 ----- >別のFARMEにデータを送りたいのですが >こんなのつくりましたがうまくゆきません > URL = "http://******/" > Set objIE = CreateObject("InternetExplorer.Application") > objIE.Visible = True > objIE.Navigate URL > > objIE.Parent.Document.Forms("Logon").PassWord.Value = "123" > > objIE.Parent.Document.Forms("Logon").PassWord.Value = "123" >がエラーになります?対処法を教えてください。 >よろしくお願い致します。 ----- フレームかぁ、避けていたけど、来ましたね質問が。。。

/* * 2.気分を変えて、参照設定から探ってみます */

汚い手で女の子に触れると嫌がられる? じゃなくって、 いつも、私は手抜きで、AS Objectとやっているので、 なぜExcelもIEも同じAs Objectなのか?と質問 いっぱいもらうので、 今日は、皆さんが好きな、型をキチント指定して作ってみます。 その代わり、参照設定のエラー、バージョン問題があるとイヤなので、 サンプルプログラムのlzhは無しで行きます。 自分で打ち込みながらやったほうが、力になるので(手抜きの言い訳ですが) まず、参照設定を行います。 参照設定では、MicroSoft Internet Contorlsを選択します。 ※あまり関係ないけど、shdocvm.dllを参照していることがわかります。 次に、変数を宣言します。 dim objIE as と打ち込むと、リストから選択できます。 ここで、 Dim objIE As InternetExplorer と選択します。 ↑選択イメージ そんな感じで、いつもの型が不明のObject型から、 As InternetExplorer と 型を指定してみました。 あとは、普通にオブジェクトを作って代入します。 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") まぁ、いつも通りですね。 参照設定をしていると、ここからチト違うのが、 objie.と打ち込むと、プロパティ、メソッドが表示されます。 objIE.Visible = True もコーディングするのが比較的楽です。 さてと、だったら、Excelのように簡単にいくかなぁ・・・ と思ってたら、ガイドしてくれるのもここまでで、 objIE.Document. ここまではOKなのに、 Document.と入力しても何も出てこない。 しかたない、F1押しますか、 あらら、いつものヘルプが出ない・・・ う〜ん、どうしましょう・・・

/* * 3.みなさんはF2のオブジェクトブラウザって使ったことある? */

みなさんはF2のオブジェクトブラウザって使ったことありますか? F2を押します(F1の隣って、あたりまえか) すると、オブジェクトブラウザって画面が表示されると思います。 全てのライブラリから、 SHDocVwを選択します。 すると、 InternetExplorerのメンバーまでは見れるけどその先がまだ見れない・・・ ↑InternetExplorerのメンバーまでたどりついた。 まだ何か足りないのね、参照設定でそれらしき物を再度探す。 と、 MicroSoft HTML Object Labrary なんてのがあるじゃないですか。 ※いままで、見逃してた・・読者の皆さんスミマセン。 ↑やっと探し当てた、MicroSoft HTML Object Labrary 中身を確認してみると、(F2のオブジェクトブラウザで) MSHTMLとライブラリを選択、 クラスは、HTMLDocumentを選択すると、 おっ、よく見かけた.Allなんかも出てくるし、 スクロールすると、 framesなんてメンバーが存在する。 ^^^^^^ これをクリックすると、 Property Frames AS FramesCollection 読み取り専用 HTMLDocumentのメンバ なんて感じの説明とリンクが出てくる。 ↑HTMLDocumentのframesを選択した画面 まだまだ不明なので、 次に、リンク先のFramesCollectionをクリックして探ってみると、 Class FramesCollection MSHTML のメンバ だってぇ? オイオイ、頭に戻ったか?(循環参照か?ヘルプのたらいまわし状態?) でも、FramesCollectionは、 Item と length をメンバーとして持っているのがわかった。 ↑FramesCollectionを選択した画面 Itemは、HTMLを表すのかぁ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ ※まぁ、よく考えてみれば、フレームの先は、  HTMLのドキュメントなので、  作りはOKなんでしょうね。 index.html でフレーム分割、 a.html と b.asp を表示してれば、 index.htmlのフレーム要素(ITEM)は2個(length)です。  ITEMの中身はHTMLドキュメントって言ってるよ、  そりゃそうか、フレームで分割されていても、  item(0)はa.html item(1)はb.aspなんだから、 フレームのアイテムは、HTMLドキュメントと言ってるのは。  ↑ゴメンなさい、少し文章変ですよね。

/* * 4.フレーム処理に各Objectの型をキチント指定しながら挑戦 */

日本語、私、うまく書けないので、 みなさんと共通に話せると思う、 VBAって言語を混ぜて説明するので、 聞いてくださいね。 オイオイ(笑)単なるソースを紹介って言えよボケ。 簡単なIE関係の型を使った解説を始めます。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ まず、普通のフレーム無しのHTMLから。 http://www.ken3.org/cgi-bin/test/test068.html がログインの処理画面です。 ユーザー名にKen3 パスワードにaaa と入力してみます。 test068.htmlのHTMLソース(途中まで)は、 <html> <head> <title>けんぞうのへんてこな世界へようこそ</title> </head> <body bgcolor=#ffffff text=#000000> <center> <h2>けんぞうのへんてこな世界へようこそ</h2> <br> <table bolder=1> <FORM ACTION="test068-1.asp" METHOD="POST"> USER ID:<INPUT TYPE="text" NAME="userid" SIZE="12"><br> パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> <INPUT TYPE="submit" NAME="btn01" VALUE="ログイン"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> </table><br> <a Href="test068-2.asp" TARGET="_top">新規ユーザー登録</a><br> </center> <br> ・  ・ と USER ID:<INPUT TYPE="text" NAME="userid" SIZE="12"><br> パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> が、入力エリアです。 これに対して、(このHTML入力フォームに対して) 入力処理で下記のプログラムを作りました。 No.105 VBAからIE操作 .document.forms(0).Submit でフォーム送信処理 http://www.ken3.org/vba/backno/vba105.html では、
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test068.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '項目名を指定して、データをセットする
     objIE.document.all.userid.Value = "Ken3" 'ユーザー名
     objIE.document.all.pass.Value = "aaa"    'パスワード

     'フォームをSubmitする
     objIE.document.forms(0).Submit

End Sub
と、 '項目名を指定して、データをセットする objIE.document.all.userid.Value = "Ken3" 'ユーザー名 objIE.document.all.pass.Value = "aaa" 'パスワード みたいにセットしてました。 これを、 MicroSoft Internet Contorls MicroSoft HTML Object Labrary の 2つ参照設定を行い、 ~~~~~~~~~~~~~~~~~~~~ オブジェクト変数の型をキチント指定して書いてみます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub ie_test()

    Dim objIE    As InternetExplorer   'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test068.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'ドキュメントオブジェクトの代入
    Dim objDOC   As HTMLDocument      'HTMLドキュメント
    Set objDOC = objIE.Document

    '項目名を指定して、データをセットする
    objDOC.all("userid").Value = "Ken3" 'ユーザー名
    objDOC.all("pass").Value = "aaa"    'パスワード

End Sub
ポイントは、 ~~~~~~~~~~~~ Dim objDOC As HTMLDocument 'HTMLドキュメント と、 HTMLのドキュメント型にしてから、 ^^^^^^^^^^^^^^^^^^^^ Set objDOC = objIE.Document で、IEのドキュメントを代入しました。 それから、参照は、 objDOC.all("userid") や objDOC.all("pass") のように、項目名で参照してみました。 フォームのコレクションに番号でアクセスするのと、 名前でアクセスするのに似てますね。 次は、フレームのチェック。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ http://www.ken3.org/vba/test116.html に、フレーム用のHTMLを作りました。 <html> <HEAD> <TITLE>三流君 VBAで楽しくプログラミング</TITLE> </HEAD> <frameset COLS="160,*" FRAMEBORDER=1 BORDER=1 FRAMESPACING=0> <frame SRC="http://www.ken3.org/vba/menu-vba.html" NAME="F_MENU"> <frame SRC="http://www.ken3.org/cgi-bin/test/test068.html" NAME="F_RIGHT"> </frameset> </html> フレームの名称は、F_MENUとF_RIGHTで左右に割ってみました。 さてと、フレームは、 Property Frames AS FramesCollection だったっけ? コイツを使用して、
Sub ie_fream()

    Dim objIE    As InternetExplorer   'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test116.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    Dim objFRAME As FramesCollection
    Set objFRAME = objIE.Document.frames  'フレームの代入

    Debug.Print "フレームの数は" & objFRAME.Length

    'ドキュメントオブジェクトの代入
    Dim objDOC   As HTMLDocument      'HTMLドキュメント
    Set objDOC = objFRAME("F_RIGHT").Document 'フレームのドキュメントをセット
    '↑objFRAME(0).DocumentやDocument(1).Documentもアリです
    'Set objDOC = objFRAME(1).Document 'フレーム(1)をセットでも動きます

    '項目名を指定して、データをセットする
    objDOC.all("userid").Value = "Ken3" 'ユーザー名
    objDOC.all("pass").Value = "aaa"    'パスワード

End Sub
ポイントは、 ~~~~~~~~~~~~ Dim objFRAME As FramesCollection で、 フレーム用のオブジェクト変数を作成して、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Set objFRAME = objIE.Document.frames 'フレームの代入 で、フレームを代入 おまけで、 Debug.Print "フレームの数は" & objFRAME.Length と、.Lengthでフレーム数を表示して、 あとは、 'ドキュメントオブジェクトの代入 Dim objDOC As HTMLDocument 'HTMLドキュメント HTMLのドキュメントに、 Set objDOC = objFRAME("F_RIGHT").Document 'フレームのドキュメントをセット と "F_RIGHT"とフレーム名称を指定したフレームのドキュメントを代入してます。 objFRAME(0).Document objFRAME(1).Document など、番号で参照も可能です。 ※0から始まり、.Lengthでフレーム数がわかります。 こんな感じで、フレームは、 objIE.Document.frames だったんですね。 いろいろと型を指定して、代入して、遊んでみました。

/* * 5.普通に上からオブジェクトにたどりつけるよ */

型を調べて、いろいろ分割・分解代入したけど、 そんなことしなくても、普通にできちゃったりして・・・ なんか、無理やりオブジェクトブラウザ使って、分解したけど Excelなら、 アプリ・ブック・シート・セルを.でセットみたいに、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IE操作も一気にTOPのObjectからたどってみます。
Sub ie_test_2()

    Dim objIE    As Object '型は何でも来い、得意のObject型

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'フレームページを表示する
    objIE.Navigate "http://www.ken3.org/vba/test116.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'TOPのオブジェクトから項目まで.で行く(笑)
    objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3"
    objIE.Document.frames("F_RIGHT").Document.all("pass").Value = "aaa"

End Sub
今までの苦労をくつがえす(笑)解説をするのも、 三流プログラマーらしいよね。 objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3" は、 objIE CreateObject("InternetExplorer.application")で作成したオブジェクト から、 .Document ドキュメントオブジェクト .Navigate で表示した test116.html .frames("F_RIGHT") フレームは、F_RIGHTってフレーム名 .Document そのフレームのドキュメントを取得して .all("userid") 項目は"userid"だよ .Value = "Ken3" と .Valueのプロパティにセット・・・ なんだよ、いつものなんでもOK、参照設定やらない君でもできるじゃん(笑)

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

今回は、 IEの操作で、フレームを探ってみました。 フレーム分割されていても、 1つのフレームはHTML形式のオブジェクトなので、 それを利用して、分解してセットしてみました。 あとは、IEお嬢様の服を一枚一枚脱がす・・・じゃなかった、 調べる方法で、オブジェクトブラウザを使用する方法を少し書いてみました。 不思議なIEお嬢様、まだまだ攻略できそうにないよね。 えっ、Excel姫やAccessお姉さまも攻略して無いダロって? ※う〜ん、実力無くて、なかなか、攻略できなくて。。。。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

百聞は一見に〜、デバック風景

操作動画 http://www.youtube.com/watch?v=P-FC3baJkzo です。

↑こんな感じで、デバック、してます。※わかっててやっているから、で、いきなりこのコードは書けないんだけど、、、
元の質問、[QA20110523 VBA IE操作、フレームの操作をデバック] を見る


補足・フィードバック

投稿時間:2004/07/08(Thu) 20:58
投稿者名:yamabato
URL :
タイトル:
Web上の表をExcel
初めてお世話になります。

気象庁の電子閲覧室の検索結果の降水量をエクセルの表に転記した
いのですがどうもうまくいきません。

Re^2: ホームページのアクセス - yuki 05/21-15:29 No.702 や
IEを使用して、Web上の表をExcelへ などを改良して使いたいので
すがどうもうまくいきません。よろしければご教授お願いします。
フレームには frm_h と frm_m があるということはわかりました。

Sub aaaa()

Dim objIE As Object 'IEオブジェクト参照用

'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)

'気象庁電子閲覧室の検索結果のページに飛ぶ
objIE.navigate "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?frame=0&graph=0&prefecture=47&observation=2&spot=00000&data=2&year=2004&month=06&day=00&mode=0"

'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop

'ここからが色々試しましたがわかりません。
End Sub

投稿時間:2004/07/09(Fri) 13:25
投稿者名:Ken3(管理者)
Eメール:
URL :
タイトル:
パラメータを渡す表示まで、次はフレームかな
何も変えてないけど

Sub aaaa()

    Dim objIE As Object 'IEオブジェクト参照用
    
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)
    
    'クッキーや参照元ミテイルトイヤなのでトップページに飛ぶ
    objIE.navigate "http://www.data.kishou.go.jp/"
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    '気象庁電子閲覧室の検索結果のページに飛ぶ
    Dim strURL As String
    
    'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
    strURL = "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?"
    strURL = strURL & "frame=0&graph=0"
    strURL = strURL & "&prefecture=47"   '47都道府県の47番目?
    strURL = strURL & "&observation=2&spot=00000&data=2"
    strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲か?
    
    'そんなこんなで、組み立てたページへ飛ぶ
    objIE.navigate strURL
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'ここからが色々試しましたがわかりません。

End Sub

ここから、フレームを探ってみますか。
次はフレームの攻略ですね。

投稿時間:2004/07/09(Fri) 13:48
投稿者名:Ken3(管理者)
Eメール:
URL :
タイトル:
ダミーのフレームに騙されないで
IEで表示、ソースとすると、
<FRAMESET ROWS=20%,* FRAMEBORDER=0>
<FRAME SRC="search.cgi?frame=1&graph=0&prefecture=47&observation=2&spot=0&data=2&year=2004&month=6&day=0&mode=0&half=0" NAME="frm_h">
<FRAME SRC="/meteo/dummy.htm" NAME="frm_m">
</FRAMESET>

と表示される。
かかれているように、
<FRAME SRC="search.cgi?f 〜〜〜 NAME="frm_h"
と
<FRAME SRC="/meteo/dummy.htm" NAME="frm_m">
ですね。

これって、嫌がらせのダミーフレームなのか?なんてことは置いといて、
NAME="frm_h"のデータをもらいたいですよね。

と思ったら、このダミーがくせもの、巨人の元木様かオイ?
実際は、OnLOADのJavaで、下のダミーフレームのほうにデータを書いてます。

Sub aaaa()

    Dim objIE As Object 'IEオブジェクト参照用
    
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)
    
    'クッキーや参照元ミテイルトイヤなのでトップページに飛ぶ
    objIE.navigate "http://www.data.kishou.go.jp/"
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    '気象庁電子閲覧室の検索結果のページに飛ぶ
    Dim strURL As String
    
    'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
    strURL = "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?"
    strURL = strURL & "frame=0&graph=0"
    strURL = strURL & "&prefecture=47"   '47都道府県の47番目?
    strURL = strURL & "&observation=2&spot=00000&data=2"
    strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲か?
    
    'そんなこんなで、組み立てたページへ飛ぶ
    objIE.navigate strURL
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    '↑ところが、これだけだと、別のフレーム呼んだだけで、完了になる
    'そこで、ステータスを見ないといけないんですね。
    '.ReadyState = READYSTATE_COMPLETE
    Do While objIE.ReadyState <> 4 '4の完了以外ループ
        '何もしないループ(笑)
        DoEvents
    Loop

    'フレームのデータを取り込む
    Dim objFRAME As Object
    Set objFRAME = objIE.Document.Frames("frm_m")

    'テストでソースをメッセージボックスで表示
    MsgBox objFRAME.Document.all(1).innerHTML

End Sub

私が騙されただけで、元木は関係ないか。

フレームのソースを見ると、
<FRAMESET ROWS=20%,* FRAMEBORDER=0>
これって、上のフレームが20%下は残りの指定なので、
データは、ダミーのフレーム
<FRAME SRC="/meteo/dummy.htm" NAME="frm_m">
に表示されているみたいです。

だまされた・・・のと、
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
これだけだと、違うフレームの読み込みが完了した時点でBusyが解除されるので、
    '.ReadyState = READYSTATE_COMPLETE
    Do While objIE.ReadyState <> 4 '4の完了以外ループ
        '何もしないループ(笑)
        DoEvents
    Loop
こいつも必要です。

あと、読み込み終わってから、ソースを変えているらしいので、
    'テストでソースをメッセージボックスで表示
    MsgBox objFRAME.Document.all(1).innerHTML
と、1に全てのソースが入ってました、なぜだろう?

まぁ、ソース全体が取れたので、次はテーブルを読み込むか。

投稿時間:2004/07/09(Fri) 13:58
投稿者名:Ken3(管理者)
Eメール:
URL :
タイトル:
テーブルを書き出すところが2重のテーブル?
Sub aaaa()

    Dim objIE As Object 'IEオブジェクト参照用
    
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)
    
    'クッキーや参照元ミテイルトイヤなのでトップページに飛ぶ
    objIE.navigate "http://www.data.kishou.go.jp/"
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    '気象庁電子閲覧室の検索結果のページに飛ぶ
    Dim strURL As String
    
    'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
    strURL = "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?"
    strURL = strURL & "frame=0&graph=0"
    strURL = strURL & "&prefecture=47"   '47都道府県の47番目?
    strURL = strURL & "&observation=2&spot=00000&data=2"
    strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲か?
    
    'そんなこんなで、組み立てたページへ飛ぶ
    objIE.navigate strURL
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    '↑ところが、これだけだと、別のフレーム呼んだだけで、完了になる
    'そこで、ステータスを見ないといけないんですね。
    '.ReadyState = READYSTATE_COMPLETE
    Do While objIE.ReadyState <> 4 '4の完了以外ループ
        '何もしないループ(笑)
        DoEvents
    Loop

    'フレームのデータを取り込む
    Dim objFRAME As Object
    Set objFRAME = objIE.document.Frames("frm_m")

    'テーブルのデータをExcelに書き込む
    Dim objTABLE As Object  'テーブルのオブジェクトを入れる
    Dim yline As Integer
    Dim xline As Integer
    
    Rows("10:1000").Delete '行の削除
    yline = 10  '10行目からデータを書く
         
    'TABLEデータをループする
    For Each objTABLE In objFRAME.document.all.tags("table")
        Debug.Print "Rows.Length:" & objTABLE.Rows.Length
        Debug.Print "Cells.Length:" & objTABLE.Cells.Length
        '.Rowのオブジェクトを取り出す
        For n = 0 To objTABLE.Rows.Length - 1
            xline = 1
            'objROWの.Cellsでループさせる
            For Each objCELLS In objTABLE.Rows(n).all
                Cells(yline, xline) = objCELLS.InnerText
                xline = xline + 1
            Next
            yline = yline + 1  '書き込み位置を移動する
        Next n
        yline = yline + 2  '書き込み位置を2行移動する
    Next

    MsgBox "終了、確認してください"

End Sub

ポイントは、
^^^^^^^^^^^^
objIE.document.all.tags("table")
で、テーブルのオブジェクトを取り出し、
そのオブジェクトから、
For n = 0 To objTABLE.Rows.Length - 1 と row(行)数分ループ
さらに、objROWの.Cellsでループさせるため、
   For Each objCELLS In objTABLE.Rows(n).all
と、しています。

これで行くかなぁ・・・と思ったら、
あれれ・・・もしかして、2重のテーブルなのか・・・
うまく行かない・・・ヤバイなぁ。

投稿時間:2004/07/09(Fri) 14:17
投稿者名:Ken3(管理者)
Eメール:
URL :
タイトル:
Rows.Lengthで2重のテーブルをかわすが・・・
Sub aaaa()

    Dim objIE As Object 'IEオブジェクト参照用
    
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)
    
    'クッキーや参照元ミテイルトイヤなのでトップページに飛ぶ
    objIE.navigate "http://www.data.kishou.go.jp/"
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    
    '気象庁電子閲覧室の検索結果のページに飛ぶ
    Dim strURL As String
    
    'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
    strURL = "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?"
    strURL = strURL & "frame=0&graph=0"
    strURL = strURL & "&prefecture=47"   '47都道府県の47番目?
    strURL = strURL & "&observation=2&spot=00000&data=2"
    strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲か?
    
    'そんなこんなで、組み立てたページへ飛ぶ
    objIE.navigate strURL
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    '↑ところが、これだけだと、別のフレーム呼んだだけで、完了になる
    'そこで、ステータスを見ないといけないんですね。
    '.ReadyState = READYSTATE_COMPLETE
    Do While objIE.ReadyState <> 4 '4の完了以外ループ
        '何もしないループ(笑)
        DoEvents
    Loop

    'フレームのデータを取り込む
    Dim objFRAME As Object
    Set objFRAME = objIE.document.Frames("frm_m")

    'テーブルのデータをExcelに書き込む
    Dim objTABLE As Object  'テーブルのオブジェクトを入れる
    Dim yline As Integer
    Dim xline As Integer
    Dim n     As Integer
    
    Rows("10:1000").Delete '行の削除
    yline = 10  '10行目からデータを書く
         
    'TABLEデータをループする
    For Each objTABLE In objFRAME.document.all.tags("table")
        Debug.Print "Rows.Length:" & objTABLE.Rows.Length
        Debug.Print "Cells.Length:" & objTABLE.Cells.Length
        'いつもの小細工・・・日付は30と多いから、
        'Rows.Lengthの行数が5以下はテーブルの親と決め付けてみる。
        If objTABLE.Rows.Length <= 5 Then
            '行数が5以下のテーブルオブジェクトには何もしない
        Else
            '行数が5以上のテーブルオブジェクトを書き出す
            '.Rowのオブジェクトを取り出す
            For n = 0 To objTABLE.Rows.Length - 1
                xline = 1
                'objROWの.Cellsでループさせる
                For Each objCELLS In objTABLE.Rows(n).all
                    Cells(yline, xline) = objCELLS.InnerText
                    xline = xline + 1
                Next
                yline = yline + 1  '書き込み位置を移動する
            Next n
        End If
        yline = yline + 2  '書き込み位置を2行移動する
    Next

    MsgBox "終了、確認してください"

End Sub

2重のテーブルを回避したかったので、
        'Rows.Lengthの行数が5以下はテーブルの親と決め付けてみる。
        If objTABLE.Rows.Length <= 5 Then
            '行数が5以下のテーブルオブジェクトには何もしない
        Else
            '行数が5以上のテーブルオブジェクトを書き出す
            '.Rowのオブジェクトを取り出す
としてみた。
これで、2重のテーブルは回避できたが・・・・
セットされているデータを良く見ると、違うよなこれ・・・・
位置がかなり違うよ。

う〜ん・・・気になるのはデバックに表示されている数、
Cells.Length:1
Rows.Length:32
Cells.Length:800
Rows.Length:1
Cells.Length:1
Rows.Length:32
Cells.Length:800
なんでセルの数が800個もあるの????

テーブルのNOWRAPってなんだ?
う〜ん・・・まだまだ、先は長そうな予感・・・

投稿時間:2004/07/10(Sat) 11:05
投稿者名:yamabato
URL :
タイトル:
Re: Rows.Lengthで2重のテーブルをかわすが・・・
4通にも及ぶ早速の回答ありがとうございます。
すぐに走らせて見ました。
データが取れているのには、ヤター!、
これで少し光が見えてきたようです。

> 'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
> strURL = strURL & "&prefecture=47" '47都道府県の47番目?
> strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲か?

URL中の県名、地点、データ、日付等は最終的には、引数を考えています。

Temporary Internet Files の中に検索結果の URL が少し書き換わった
500KB位の下記の URL ファイルが有りましたのでエクセルのシートに
ドロップしたところ検索結果のデータでした。

http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?frame=2&graph=0&prefecture=47&observation=2

&spot=0&data=2&year=2004&month=6&day=0&mode=0&half=0

書き換わっている所は下記のとおりでした。
frame=0 → Frame=2
spot=00000 → spot=0
month=06 → month=6
day=00 → day=0
最後に half=0 が追加

何か関係が有るのでしょうか?

> う〜ん・・・まだまだ、先は長そうな予感・・・

よろしくお願いします。

投稿時間:2004/07/11(Sun) 12:39
投稿者名:yamabato
URL :
タイトル:
Re: Rows.Lengthで2重のテーブルをかわすが・・・
Ken3(管理者)さん、お世話になっています。
何とか動くだけの物できましたので報告します

Sub aaaa()

Dim objIE As Object 'IEオブジェクト参照用

'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)

'クッキーや参照元ミテイルトイヤなのでトップページに飛ぶ
objIE.navigate "http://www.data.kishou.go.jp/"

'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop

'気象庁電子閲覧室の検索結果のページに飛ぶ
Dim strURL As String

'URLを組み立てる、パラメータ付き、今は直接だけど後日変更しやすいようにする
strURL = "http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi?"
strURL = strURL & "frame=0&graph=0"
strURL = strURL & "&prefecture=13" '13番目の都道府県(東京都)
strURL = strURL & "&observation=2&spot=00000&data=2" '地点(全地点),データ(1ヶ月分の毎日の値)
strURL = strURL & "&year=2004&month=06&day=00&mode=0" '日付範囲(2004年7月分)

'そんなこんなで、組み立てたページへ飛ぶ
objIE.navigate strURL

'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'↑ところが、これだけだと、別のフレーム呼んだだけで、完了になる
'そこで、ステータスを見ないといけないんですね。
'.ReadyState = READYSTATE_COMPLETE
Do While objIE.ReadyState <> 4 '4の完了以外ループ
'何もしないループ(笑)
DoEvents
Loop

'フレームのデータを取り込む
Dim objFRAME As Object
Set objFRAME = objIE.document.Frames("frm_m")

'テーブルのデータをExcelに書き込む
Dim objTABLE As Object 'テーブルのオブジェクトを入れる
Dim y As Integer
Dim x As Integer

Rows("10:1000").Delete '行の削除
y = 10 '10行目からデータを書く

'下記は、[No.119 IEを使用して、Web上の表をExcelへ] を参考にしました。
'TABLEデータをループする
For Each objTABLE In objFRAME.document.all.tags("table")
'テーブルのタグを探す
'行数が5以上のテーブルオブジェクトを書き出す
If objTABLE.Rows.Length > 5 Then
'テーブル内のITEMでループする
For Each objTableItem In objTABLE.all
If objTableItem.tagName = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
If objTableItem.tagName = "TD" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.InnerText
x = x + 1 '列カウンタを+1(次にする)
End If
Next
y = y + 2 '行カウンタ
End If
Next
' objIE.Quit

End Sub

あんなこんなで何とか動きました。有り難う御座いました。
後は、降水量だけとか項目でとれるといいんですが、Excelでできるからいいか

質問があるんですが宜しくお願いします。
> '表示終了まで待つ
> Do While objIE.Busy = True
> '何もしないループ(笑)
> DoEvents
> Loop
> '↑ところが、これだけだと、別のフレーム呼んだだけで、完了になる
> 'そこで、ステータスを見ないといけないんですね。
> '.ReadyState = READYSTATE_COMPLETE
> Do While objIE.ReadyState <> 4 '4の完了以外ループ
> '何もしないループ(笑)
> DoEvents
> Loop

2つも Do While・・・・Loop 文が有りますが下の文だけでは意味をなさないものなのでしょうか?

投稿時間:2004/07/14(Wed) 20:25
投稿者名:Ken3(管理者)
Eメール:
URL :
タイトル:
上の.Busyは無くてもOK
> 何とか動くだけの物できましたので報告します

よかったですね。あれからバタバタしていたもので、
私のほうは、手付かずでした。

> > 'そこで、ステータスを見ないといけないんですね。
> > '.ReadyState = READYSTATE_COMPLETE
> > Do While objIE.ReadyState <> 4 '4の完了以外ループ
> > '何もしないループ(笑)
> > DoEvents
> > Loop
>
> 2つも Do While・・・・Loop 文が有りますが下の文だけでは意味をなさないものなのでしょうか?

下の文だけで動けば、上の文は必要ないですね。
本来は、どっちものANDでみないといけないのかも知れません。

下の条件だけでいいのかもしれません。

よくある、実害は無いけど無駄なプログラムかもしれないので、
実験して外してください。

とっかかりのダミーのフレームを攻略すれば、なんとかなった、
そんな感じだと思うので、あとはアレンジ・調整・テストでお願いします。


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

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

[三流君 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へ]