Sub ie_test_DATASET() 'データセット後 Submitボタンを押す
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
'フォーム(0番目)を .Submit する
objIE.Document.Forms(0).Submit '送信処理
End Sub
Sub ie_test()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
End Sub
Sub ie_test_Navigate()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/"
End Sub
'表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
Do While objIE.Busy = True
DoEvents '特に何もしないで.Busyの状態が変わるまで待つ
Loop
Do While objIE.ReadyState <> 4
DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
Loop
Sub TEST_SHEET_NAME()
'シートの名前をテストで表示する
Dim i As Integer 'カウンター、添え字
For i = 1 To ActiveWorkbook.Sheets.Count
MsgBox i & " シートの名前 " & ActiveWorkbook.Sheets(i).Name
Next i
End Sub
あまり怒らないでくださいよ、リンクの数(要素の数)は.Countじゃなくて.Lengthです、配列も0から始まるので、
For i = 0 To objIE.Document.Links.Length - 1
Cells(yLINE, "A") = "'" & objIE.Document.Links(i).Href
・
・
Next i
と、i=0から初めて、.Length - 1までのループとしてます
他のIEオブジェクト操作でも 配列の要素数は、パターン的に.Lengthが多いので覚えておいてください・・それが言いたかっただけなんですが、Excelを例にしてた蛇足の解説でしたね(少々反省)
書き方に好みの問題もあるのですが、
objIE.Document.Links(i)
と、配列(i番目)でまわす方法のほかに、
For Each 変数 In オブジェクト
なんて書き方もあります
読者の声:何言ってんだか、よくわからん。いつもの例だせよ
えっ、いいんですか?いつもの蛇足の例を出して。では、お言葉に甘えてExcelのシートを例にして、
Sub TEST_SHEET_NAME_FOR_EACH()
Dim objSHEET As Worksheet 'シートのオブジェクト受け取り用
For Each objSHEET In ActiveWorkbook.Sheets
MsgBox " シートの名前 " & objSHEET.Name
Next
End Sub
みたいに、Dim objSHEET As Worksheetと受け取り用の変数を1つ定義して、
For Each objSHEET In ActiveWorkbook.Sheets
と記述すると、ActiveWorkbook.Sheets分だけ1つ1つ次のオブジェクトを取り出しながらループさせ、objSHEET.Nameみたいに(i)とか添え字や.Countなどの要素数を使わないで処理することができます。
頭から全てのデータをループさせる場合、このほうがスッキリとした記述かなぁ。
※三流君的には、(i)とか(n)、の書き方が好きだけど。
Sub ie_test_LinkDATASET()
'IE ドキュメント リンク オブジェクトのテスト
Dim objIE As Object 'IEオブジェクト参照用
Dim objA As Object 'リンクのAタグ
Dim yLINE As Integer '行カウンタ、Y行目
'15行から9999行を削除する 前回の結果データを消す
Rows("15:9999").Delete
'IEを起動する 初期処理
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定したURLを開く セルB10に入力したアドレスを開く
objIE.Navigate Range("B10").Text '指定されたURL(B10に入力)へ
'表示終了まで待つ
Do While objIE.Busy = True
DoEvents '特に何もしないで.Busyの状態が変わるまで待つ
Loop
Do While objIE.ReadyState <> 4
DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
Loop
'html ドキュメント リンク オブジェクトからデータをセルへ転記(代入)する。
yLINE = 15 'セット開始の行を代入する
For Each objA In objIE.Document.Links
'データをセルへセットする
Cells(yLINE, "A") = "'" & objA.Href
Cells(yLINE, "B") = "'" & objA.OuterText
Cells(yLINE, "C") = "'" & objA.OuterHTML
Cells(yLINE, "D") = "'" & objA.InnerText
Cells(yLINE, "E") = "'" & objA.InnerHTML
Cells(yLINE, "F") = "'" & objA.Target
yLINE = yLINE + 1 'セット位置(行)を+1する
Next
'後始末
If MsgBox("IEを閉じますか?", vbYesNo) = vbYes Then
objIE.Quit '処理が終わったので、IEを終了させる
Set objIE = Nothing
End If
End Sub
↑、こっちのほうが少しはプロっぽい感じになったのかなぁ。
For Each objA In objIE.Document.Links
objA.Href
と、objIE.Document.Links(i).Hrefよりは、スッキリしたかなぁ。
サンプル IETEST004.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST004.zip]をzipを保存後、解凍して、テストしてみてください。
例えば、文章の段落、<P>のタグを取り出す時は、
If objIE.Document.Body.All(n).TagName = "P" Then
'処理
End If
と、頭から1つ1つオブジェクトの.TagName タグの名前を見て判断して処理を行う、なんかヒマだねぇ、いい書き方無いの?
実は、指定したタグだけ取り出す そんな都合のよい書き方があるんですよ。
読者の声:だったら、ハヤク教えろよ、て言うか初めに書けよ
書き方は、簡単で、
For Each objA In objIE.Document.Body.All.Tags("P")
と、
objIE.Document.Body.Allに.Tags("タグの文字")を追加するだけです。
かなり簡単でしょ?
Sub ie_test_Ken3org_BODY_ALL_P()
'ken3.org IE ドキュメント BODY ALL から <P>〜を取り出す
Dim objIE As Object 'IEオブジェクト参照用
Dim objA As Object 'リンクのAタグ
Dim yLINE As Integer '行カウンタ、Y行目
'15行から9999行を削除する 前回の結果データを消す
Rows("15:9999").Delete
'IEを起動する 初期処理
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定したURLを開く
objIE.Navigate "http://www.ken3.org/" '文字列で指定されたURLへ
'表示終了まで待つ
Do While objIE.Busy = True
DoEvents '特に何もしないで.Busyの状態が変わるまで待つ
Loop
Do While objIE.ReadyState <> 4
DoEvents '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
Loop
'html ドキュメント BODY オブジェクトからデータをセルへ転記(代入)する。
'Document.Body.All.Tags("P") で Pタグのデータのみ処理する
yLINE = 15 'セット開始の行を代入する
For Each objA In objIE.Document.Body.All.Tags("P")
'データをセルへセットする
Cells(yLINE, "A") = yLINE - 15 'n番目を計算でセットする
Cells(yLINE, "B") = "'" & TypeName(objA) 'TypeNameでオブジェクトのタイプを表示
Cells(yLINE, "C") = "'" & objA.TagName 'タグの名前
Cells(yLINE, "D") = "'" & Left(objA.OuterHTML, 256) '頭から256文字だけセット
Cells(yLINE, "E") = "'" & Left(objA.InnerText, 256)
Cells(yLINE, "F") = "'" & Left(objA.InnerHTML, 256)
yLINE = yLINE + 1 'セット位置(行)を+1する
Next
objIE.Quit 'IEを閉じる
End Sub
三流作者の補足:※ここまで、いろいろとIE Document.Bodyの解説書きましたが、下記のMSDN Front Pageの記事がかなりいい感じです。せっかく書いたので我流の解説を長々載せましたが、下記の記事がお奨めです。
Officeに入っていて、なかなか、使っていない?Front Page ですが、ホームページ作成のソフトなので、IEドキュメント オブジェクトをラップ(包み込んでいるのか?)、それともそのまんまアクセスしているのか?そこまでは探っていませんが、↓ Front Page 2002 Internet Explorer オブジェクト モデルへのアクセス http://msdn.microsoft.com/library/ja/jpdnfp2k2/htm/odc_accessingie.asp
↑の アクティブ Web ページの HTML の操作 です。ここのサンプル(操作のVBA?)や説明を見るとイメージがつかみ易いと思います。※数少ない?日本語だし(オイオイ)、私の冗長解説よりも短くて、的確です。Front Pageのオブジェクトなので、そのままは使えませんが、Document操作の感覚はかなりつかめると思います