[三流君]
[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でした。
補足・フィードバック
投稿時間: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でみないといけないのかも知れません。 か 下の条件だけでいいのかもしれません。
よくある、実害は無いけど無駄なプログラムかもしれないので、 実験して外してください。
とっかかりのダミーのフレームを攻略すれば、なんとかなった、 そんな感じだと思うので、あとはアレンジ・調整・テストでお願いします。
|
ページフッター リンクや広告、質問送信など
三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など メッセージを送る(三流君に連絡する)
三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。
[トップページへ 戻る]
/ [VBA TOP]
/ [WebBrowser IEの操作 TOPへ]