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
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
だったんですね。
いろいろと型を指定して、代入して、遊んでみました。
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
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重のテーブルなのか・・・
うまく行かない・・・ヤバイなぁ。
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ってなんだ?
う〜ん・・・まだまだ、先は長そうな予感・・・
'表示終了まで待つ 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