VBAで(ExcelやAccessなどから)IEを操作してみたいと思います。
操作方法の入り口として何かの参考・お役に立てれば幸いです。
※時の流れはハヤク、あと少ししたら(まだまだ先だけどオオゲサに書いてみました)IE8がリリースされるのに、Vista IE7に苦戦しています。(IE7を攻略する前にIE8になり、取り残されたりして・・・)
さて、IEのオブジェクトの森・Webブラウザーの山を頼りないガイドの三流君と一緒にさまよってみましょうか!!!
三流ガイドなんか必要ない 自分でプロパティやメソッド、コレクションを調べたい場合は↓
[MSDN で InternetExplorer の 資料を探す]
↑ここにショートカット(へんな説明見るよりも こちらの方が近道かも)
初めてご来店の読者様は、自分の環境でサンプル↓を実行してみてください。
[IE起動とデータセットのサンプル 20080213Book2003.zip]
↑Excel2003の.xlsファイルです、解凍後実行してみてください(百聞は一見に〜)
動作イメージがつかめたらたたき台とて改良したり遊んでみてください
IE7への移行で困ってサイトに来た読者様へ : すでにXP+IE6で作成したシステムが稼働・運用中で、新規のVista PC端末に移行・機能追加しないとダメ、IE7でテストしたらCreateObject("InternetExplorer.application")でコケタ急いで修正しないと・・・そんな急ぎの時は、とてもお勧めできないけど一番手軽なのが↓
[Vista IE7 信頼済みのサイトにしてVBAからコントロールしてみた]
↑操作対象のURLが固定のサイトだからって、セキュリティを変更するとマズイし気分が悪いよね(本格的な対策のつなぎで)
※いくら急ぎだからって、手を抜くと後で倍になって返ってきたりします(経験談?)
で、2つ目の案は、三流的ないつもの発想ですが、ExcelのUserFormにIEを貼り操作する(代入する)そんな方法の応用で、
[ExcelのUserFormにIEを貼り操作]
ExcelのフォームにIEを閉じ込めて、フォームをモードレス で 開いたまま使う と Excel2007+IE7でも比較的修正が少なく動きます。なんか小細工だけど・・・
下記↓、私のASP解説のテストページなのですが、ここの表からデータを抜いてみたいと思います
[http://www.ken3.org/cgi-bin/test/test028-2.asp]
↑test028-2.asp 感想データをORDER BY ID DESC で IDの降順で表示↓
| ID | F_TITLE | F_MEMO | WriteTime |
|---|---|---|---|
| 6026 | 説明が下手 | 理解が難しい・・・ | 2008/05/04 4:57:50 |
| 6025 | 解らん | 使えないサイトだな | 2008/05/03 5:23:24 |
| 5968 | ok | test | 2008/03/02 13:30:49 |
| 5696 | a | a | 2007/09/19 19:04:19 |
| 5675 | IE操作 | UWSC使用が正解 変な記事書き続けるなボケ | 2007/09/09 23:31:41 |
| 5505 | てすと | できるかな? | 2007/05/30 18:02:13 |
処理の流れ・仕様は
1.IEを起動する CreateObject("InternetExplorer.application")
2.目的のURL(test28-2.asp)を開く .Navigate
3.テーブルからデータを抜く(Excelのシートにセットする)
なんて感じの3行おまかせ仕様で(笑)
OS XP で IE6(IE7)の起動 CreateObject で 起動させる
料理の使い回しは怒られますが、昔のXP+IE6の説明を使い回します(上でUserFormに貼ったほうが楽とか言ってたのにね)
※Vista や IE7 の人も、そのままでは動きませんが、できれば処理の流れだけは ざっと 見て下さい
CreateObject("InternetExplorer.application")
で、IEを起動しています。まずは、ここからかな。
読者の心の声:イマイチ何?言ってんだか?わからないのですが・・・
三流君の説明聞くより、コード見たほうがハヤイって?
CreateObjectで起動する方法(XPやIE6の場合)は簡単で、
Sub ie_test()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
End Sub
↑とにかくコレを貼り付けて実行してみてください。CreateObject("InternetExplorer.application")なんて感じで、無事にIEのオブジェクトを作成できたら、次は指定したURL(目的のサイト)を開きたいですよね。
まぁ、文章でもなんでもたいていは開く処理が必要ですよね。
Workbooks.Open Filename みたいに.Open?
それとも、.URLOpen?
ハヤク、IEでURLを開くメソッドを教えろコラ!!
アナタ、先走りますねぇ、想像力豊かでガマン汁出てるよ(オイオイ)じゃなくって、メソッドの名前を勝手に.URLOpenとか創造するなんて先走り過ぎ。※まぁ、予測・予想する能力もプログラマーとしてはとても大切で必要なんですが・・・([愚痴系 No.181 TimeAddって関数を予想する力? ]を暇な時にでも読んでみてください)
感覚は文章やブックを開く感覚でURLを開くOpenなのですが、URLを開く命令は.Navigateです。
今回作成して代入したオブジェクトがobjIEなので、
objIE.Navigate "http://〜(URLを文字列で)" って感じです。
データ表示のURL[http://www.ken3.org/cgi-bin/test/test028-2.asp]を開く(飛ばす)には、
下記のような命令を1行書きます(.Navigateメソッドを実行します)。
Sub ie_test_Navigate()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate "http://www.ken3.org/cgi-bin/test/test028-2.asp"
End Sub
ねっ、簡単に目的のURLを開くことができたでしょ。無事にページを開くことができたので、データを抜き出したいと思います。
イロイロな方法があるので(わざと回り道をしますが)自分に合った方法で取り出してみてください。
.Navigateメソッドで"http://www.ken3.org/cgi-bin/test/test028-2.asp"の文章を開くことができました。文章じゃねぇだろ?といったアナタへ
test028-2.aspへアクセスするとIIS WebServer が HTML から 始まる タグで囲われた文章(Document)を返してくれるので、まぁ広い意味でタグ付きの文章を開くって感じなんですよ。
タグ付きの文章?HTMLの文法に詳しくないのですが
<html><head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis"> <META NAME="keyword" content="三流君,三流プログラマー,IE操作,objIE"> <title>三流君VBAでIE操作 InternetExplorer.Applicationを操作する</title> </head> <body bgcolor=#ffffff text=#000000><A NAME="TOP"></A> <h1>三流君VBAでIE操作 InternetExplorer.Applicationを操作する</h1> <p>文章など・・・</p> <h2>データはDocumentの山からイロイロな方法で抜く</h2> <p>文章など・・・</p> <h3>テーブルは・・・</h3> <TABLE Border='1'> <TR><TH>ID</TH><TH>F_TITLE</TH><TH>F_MEMO</TH><TH>WriteTime</TH></TR> <TR><TD>6026</TD><TD>説明が下手</TD><TD>理解が難しい・・・</TD><TD>2008/05/04 4:57:50</TD></TR> <TR><TD>6025</TD><TD>解らん</TD><TD>使えないサイトだな</TD><TD>2008/05/03 5:23:24</TD></TR> <TR><TD>5968</TD><TD>ok</TD><TD>test</TD><TD>2008/03/02 13:30:49</TD></TR><TR> <TR><TD>5505</TD><TD>てすと</TD><TD>できるかな?</TD><TD>2007/05/30 18:02:13</TD></TR> </TABLE> ・ ・ ・ </body></html>など <html>〜</html>を受け取って IE(ブラウザ)さんが解析して表示をしてくれる。そんなイメージです。
先走らないでここで深呼吸、一呼吸おいて、
VBAでExcelのブック・シート・セルへデータをセットする場合、下記のように
シート--範囲
Sheets("Sheet2").Range("B3").Value = "値 B列3行目です"
や
シート--セル(y,x)
Sheets("Sheet3").Cells(5, 4).Value = 1234
Sheets(シート名).Rangeや.Cellsでオブジェクトへアクセスして、.Valueなどプロパティに値をセットしていると思います。
HTMLの文章データを取り出す場合、オブジェクトの構造が
IEアプリの下 -- .Document(文章/ドキュメント) -- .all(n番目 or 項目名)
と.All.プロパティ で たどり着くことができるので(ほかにも表現方法はあるのですが今回はこれで)
objIE.Document.All(0).イロイロなプロパティ で 値を取り出してみます
(htmlドキュメント の ALL(0番目)頭 を 探って見たいと思います)
実際に文章 Documentオブジェクトに.InnerTEXTプロパティ と .InnerHTMLプロパティを使ってアクセスしてみたいと思います。
アクセス方法は簡単で、
objIE.Document.All(0).InnerTEXT
objIE.Document.All(0).InnerHTML
.InnerHTMLプロパティや.InnerTextプロパティから値を取り出して使用することができます。(テストで画面に表示してみたいと思います。)
※MsgboxでDocument.All(0).InnerHTML と Document.All(0).InnerTextを表示させて違いを確認しました。
Sub ie_test_Document_All_innerTEXT()
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate "http://www.ken3.org/cgi-bin/test/test028-2.asp"
'手抜きで2秒待つ(オブジェクトの展開時間を待つ)
Application.Wait Time:=Now + TimeValue("00:00:02") '2秒間 ボーっとする
'文章をMsgboxで表示する
MsgBox objIE.Document.All(0).InnerTEXT
MsgBox objIE.Document.All(0).InnerHTML
End Sub
.InnerTEXT プロパティでテキスト文章が.InnerHTMLプロパティで<タグ></タグ>付きのデータが表示されたと思います。手抜きで2秒待つ(オブジェクトの展開時間を待つ)
↑何だコレ、手抜きって?、そもそも、なぜ2秒?
なぜ、待つかと言うと、いきなりさわるとビックリするでしょ?(オイオイ、何言ってんだおっさん)
表示待ちを入れないで いきなりオブジェクトに触りに行くと(ドキュメントなどのオブジェクトにアクセスすると) 相手の心の準備ができていないみたいで(オブジェクトの展開処理が間に合わないみたいで)、どこ見てんのよ(古)と怒られるじゃなかった、 実行時エラー Document メソッドは失敗しました ・・・など、エラーで怒られるんですよ。
エラーの画像→[http://ken3-info.blog.ocn.ne.jp/screen/2007/05/ie__debe.html]
なので、objIE.Navigate 後に相手の準備ができるが確認します。
手抜きの2秒はじゃなくてもっとチャントシタ行儀作法があるので後ほど。
えっ、今説明しないの?はい、アトで・・・
今度は始めの0番目を表示だけじゃなくて、データを新しいシートに書き出してみます。
バカの一つ覚えのExcelとの比較を一つ、ブック内のシート名を表示するテストプログラムを書きます。
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読者の声:だから何?、ドキュメント内のオブジェクト数は、objIE.Document.All.Countと言いたいの?感覚的にExcel VBAに慣れた人は.Countを使うと決め付けたいの??でも、要素の数は.Lengthなんでしょ?
あまり怒らないでくださいよ、タグ(Item)の数(要素の数)は.Countじゃなくて.Lengthです、配列も0から始まるので、
For i = 0 To objIE.Document.All.Length - 1
XXXX = "'" & objIE.Document.All(i).InnerTEXT
XXXX = "'" & objIE.Document.All(i).InnerHTML
Next i
と、i=0から初めて、.Length - 1までのループとしてます
Sub ie_test_Document_All_Length()
Dim i As Integer 'カウンター
Dim objIE As Object 'IEオブジェクト参照用
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate "http://www.ken3.org/cgi-bin/test/test028-2.asp"
'手抜きで2秒待つ(オブジェクトの展開時間を待つ)
Application.Wait Time:=Now + TimeValue("00:00:02") '2秒間 ボーっとする
'新規のブックを追加して、.InnerTEXTと.InnerHTMLを吐き出す
Workbooks.Add '新規ブックを追加
Range("A1") = "NO.i番目" '見出しのセット
Range("B1") = "TypeName関数の結果"
Range("C1") = ".TagName タグの名前"
Range("D1") = ".OuterHTML 外側含むHTML"
Range("E1") = ".InnerText 内側のTEXT"
Range("F1") = ".InnerHTML 内側のHTML"
Columns("A:G").ColumnWidth = 20 '列幅を20に変更
'ループさせDocumentを書き出す
For i = 0 To objIE.Document.All.Length - 1
'データをセルへセットする
Cells(i + 2, "A") = i 'i番目
Cells(i + 2, "B") = "'" & TypeName(objIE.Document.All(i)) 'TypeNameでオブジェクトのタイプを表示
Cells(i + 2, "C") = "'" & objIE.Document.All(i).TagName 'タグの名前
Cells(i + 2, "D") = "'" & Left(objIE.Document.All(i).OuterHTML, 256) '頭から256文字だけセット
Cells(i + 2, "E") = "'" & Left(objIE.Document.All(i).InnerText, 256)
Cells(i + 2, "F") = "'" & Left(objIE.Document.All(i).InnerHTML, 256)
Next i
'IEを閉じる
objIE.Quit
Set objIE = Nothing
End SubTypeName関数 を 使うと変数の中身のタイプを知ることができます。知ってどうする?の?
たとえば、HTMLTable や HTMLTableRow , HTMLTableCell を検索して例題を探すとか
.OuterHTMLは自分自身、外側を表示してくれるので解析時はこっちを使うと良かったり。
<TR><TD>DATA</TD><TD>DATA2</TD></TR>
↑オブジェクトにTRのデータが入っている時、
.OuterHTMLはそのまま <TR><TD>DATA</TD><TD>DATA2</TD></TR> を返し
.InnerHTMLは内側の <TD>DATA</TD><TD>DATA2</TD> を返します。
用途に応じて使い分けてください。
.TagName は そのままタグの名前を返すので、<TR>はTR <TD>はTDが返ってきます。泥臭い処理の時によく使うのかなぁ。
.Quit は 処理が終わり IEを閉じたいときに使います。 デバッグ中などはコメントアウトして そのままIEが開きっぱなしの方が確認しやすかったりしますが・・・
以上、簡単な説明でした。ぇっ、もう終わりカヨ・・・
※.Length - 1までのループでエラーが発生する場合、指定したURLで広告などを表示していると(私のページも広告あるので)、途中で動的に要素の数が変わってしまい Document.All(i)にアクセスしに行くとエラーになったりします注意してね
よし、簡単なオブジェクトの説明終了、、、ここまで長かった。酔っぱらいの独り言に付き合っていただきどうもです。朝までにもう一軒飲み屋じゃなかった、オブジェクトをハシゴするぞと行きたい所ですが、あと一杯、少しだけお時間をとらせてください。
読者の声:だから、余計な会話はいいから、はやくシロ。(※←この読者の心の声もかなりの蛇足なんですが(笑)説明に必要ないでしょと思いつつ)
書き方に好みの問題もあるのですが、
objIE.Document.All(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この書き方が Document.All でも 当然使えます。だってオブジェクト単位のループだしね。
For Each objTAG In objIE.Document.allで順番にobjTAGに入るので、
objTAG.OuterHTML や objTAG.InnerTEXT と書けるのでスッキリするのかなぁ。
処理によって使い分けてください。
Sub ie_test_Document_All_For_Each()
Dim i As Integer 'カウンター
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object '1つ1つ タグのオブジェクトを入れる
Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
objIE.Visible = True '見えるようにする(お約束)
'.Navigate で 指定した文字列のURLを開く
objIE.Navigate "http://www.ken3.org/cgi-bin/test/test028-2.asp"
'手抜きで2秒待つ(オブジェクトの展開時間を待つ)
Application.Wait Time:=Now + TimeValue("00:00:02") '2秒間 ボーっとする
'新規のブックを追加して、.InnerTEXTと.InnerHTMLを吐き出す
Workbooks.Add '新規ブックを追加
Range("A1") = "NO.i番目" '見出しのセット
Range("B1") = "TypeName関数の結果"
Range("C1") = ".TagName タグの名前"
Range("D1") = ".OuterHTML 外側含むHTML"
Range("E1") = ".InnerText 内側のTEXT"
Range("F1") = ".InnerHTML 内側のHTML"
Columns("A:G").ColumnWidth = 20 '列幅を20に変更
'ループさせDocumentを書き出す
i = 0
For Each objTAG In objIE.Document.all
'データをセルへセットする
Cells(i + 2, "A") = i 'i番目 結局iは使うのかよ(笑)
Cells(i + 2, "B") = "'" & TypeName(objTAG) 'TypeNameでオブジェクトのタイプを表示
Cells(i + 2, "C") = "'" & objTAG.TagName 'タグの名前
Cells(i + 2, "D") = "'" & Left(objTAG.OuterHTML, 256) '頭から256文字だけセット
Cells(i + 2, "E") = "'" & Left(objTAG.InnerText, 256)
Cells(i + 2, "F") = "'" & Left(objTAG.InnerHTML, 256)
i = i + 1 'インクリメント
Next
'IEを閉じる
objIE.Quit
Set objIE = Nothing
End Sub
読者の声:なんとなくわかってきたけど、こんなのF1を押したヘルプに無いし、どこで調べるんだよ??
読者の声:テメエの(三流プログラマーの) くどい説明 や 声がうわずってる 恥ずかしい動画を見るよりも、正式な資料やヘルプのURLを書いてくれれば自分で見て調べるからさ、さっさと教えな。
あっ、これですか・・
英語だけどMSDNの下記の項目を見るとオブジェクトの階層構造がわかりやすいと思います。
MSDN Library - http://msdn.microsoft.com/en-us/library/ms123401.aspx
□□□|--- Internet Explorer Development http://msdn.microsoft.com/en-us/library/aa155133.aspx
深いので省略(オイオイ、意味無いだろTOPからたどらせないと)
□□□□□□□|--- WebBrowser Control http://msdn.microsoft.com/en-us/library/aa752040.aspx
の
IE Reference for Visual Basic Developers ↓に深く埋まってます(英語ですが)
[http://msdn2.microsoft.com/en-us/library/aa752043.aspx] が 一覧で、その 下に、
InternetExplorer Object [http://msdn.microsoft.com/en-us/library/aa752084.aspx] をクリック
document Object [http://msdn.microsoft.com/en-us/library/ms531073.aspx] をクリック
Collections の 中の all [http://msdn.microsoft.com/en-us/library/ms537434.aspx] をクリック
などして、さまよいながら・・・探したりしてます。(三流ガイドの私も迷ってます)
デバックで止める、ウォッチで中身を見る
あんまり好きじゃないけど、
ブレークポイントを設定し、デバックで止めて、変数の中身・オブジェクトを見てみます。
~~~~~~~~~~~~~~~~
Sub xxxxx()
Dim objIE As Object 'IEオブジェクト参照用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://xxxx.xxxx.xxx/yyy.html"
'デバックで止める
MsgBox "OK?"
End Sub
右クリック、設定・解除 -- ブレークポイントを選択し、設定します。
←参考画面次にobjIE変数のオブジェクトの中身を見たいのでウォッチ式を追加します。
追加方法は、どこでもいいので、ソースの画面で
objIEをドラックして反転表示の選択後、右クリックしてウォッチ式の追加を選択します。
←参考画面
実行して、オブジェクトの中身を探る
ブレークポイントの設定
変数objIEをウォッチする準備が整ったので、
実行して、変数の中身を探ってみます。
実行すると、ブレークポイントの場所で止まります。
当たり前だろ、そのために設定したんでしょアナタが。
そうでしたね。
ブレークポイントで止まってからは、
飲み会に誘った女の子みたいに逃げないので
落ち着いて中身をチェックしましょう。
(飲み会で女性陣に逃げられてるみたいだなぁ、この書き方だと(笑))
ウォッチウインドウの変数名の横+をクリックして中身を探って行きます。
←参考画面
それにしても、階層が深いです。
テーブル系のオブジェクトを探すが、なかなか見つからない(笑)
(女の子じゃなくって、IEの心の中は複雑なのね、、、)
中身を確認するために、となりのイミディエイトウインドウで、
←参考画面
? objIE.document.body.innerText
とか、中身を聞いてみた(アクセスすることもできます)
ここだけは静止画よりも動画操作イメージの方がいいのかなぁ?
と思ったが、↑動画解説もダラダラ長い・・・静止画を大量に貼る方が見やすいのかも(静止画だと上に戻るのも簡単だしね、動画は説明の少し前に戻るのが不器用だと大変)
※説明で、左側を右側とか言ってるし、イミディエイトウインドウで変数の中身を見る時 空白連発でいつものグダグダ(笑)
※10番目とか本人言ってたけど、Item10番目なら 10-1でDocument.All(9)と9を指定しないとね(意外と読者様も間違えるかも?)。ツリーで見ていたデータが9と気がつかないで11・12と実行して気まずくなったからOuterHTMLに変えようとするがスペルを間違える最悪ですね。女性とデートなら中ならたぶん逃げられてるなキット
↑再生が途切れる場合、再生を一時停止ボタンで少し止めて 赤いバーより先に読み込みバッファが貯まってから 再生するとスムーズに再生されます(私の動画作りが悪いのかも・・う〜ん・・)ダブルクリックして個別ページに飛ぶのも手かなぁ・・・
いつもの私が好きな Set objIE = CreateObject("InternetExplorer.application") だと、Vista + IE7で失敗したり(オイオイ、いきなり失敗談かよ)
なので、これから新規に始める人は、素直にUserFormにIEを貼ると . を押すとプロパティやメソッドが出てくるので、そちらのほうがお勧めかなぁ。始めは手間だけど、Excel持ってれば、こっちから入るのがいいかも。ってことで
初回だけですが、UserFormを作り、IEのコントロールを貼ります
手順は→[フォームにIEのコントロールを貼る]こんな感じです
や
動画版↓Vista で IE を Excel2007 の フォームに貼ってテストしたYouTube動画です
[Excel2007 の UserForm に IEを貼る]
↑再生が途切れる場合、再生を一時停止ボタンで少し止めて 赤いバーより先に読み込みバッファが貯まってから 再生するとスムーズに再生されます(私の動画作りが悪いのかも・・う〜ん・・)ダブルクリックして個別ページに飛ぶのも手かなぁ・・・
<FORM ACTION="http://www.ken3.org/cgi-bin/test/test029-3.asp" METHOD="POST">
<b>感想:</b>
<INPUT TYPE="TEXT" NAME="MEMO" SIZE=20><br>
<b>メルマガ区分選択:</b><br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP">三流君ASPで遊ぶ<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" CHECKED>三流君VBAで楽しく<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI">プログラマー愚痴<br>
<INPUT TYPE="HIDDEN" NAME="NO" VALUE="0">
<INPUT TYPE="SUBMIT" VALUE="書 込">
<INPUT TYPE="RESET" VALUE="クリア">
</FORM>
<hr>
初めは、サンプルを走らせながらが一番いいのかなぁ?
マニュアルや調査することも非常に大切なのですが、入り口で挫折しないためには、楽しくなくっちゃ???
サンプルを見ながら動かしていけば、なんとなく感覚がつかめてくるので、あとはエラー処理を含めた丁寧なプログラムを組んでいく、そんな感じがいいのでは???
|
CreateObjectは簡単で、
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
ねっ、簡単に目的のURLを開くことができたでしょ。
'表示終了まで待つ .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 SubSub TEST_SHEET_NAME_FOR_EACH()
Dim objSHEET As Worksheet 'シートのオブジェクト受け取り用
For Each objSHEET In ActiveWorkbook.Sheets
MsgBox " シートの名前 " & objSHEET.Name
Next
End SubSub 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 |
|
Item(n) 番目 TypeName .TagName .OuterHTML
0 HTMLHeaderElement H1 "
<H1>AB型の変わり者 三流プログラマー Ken3のHP</H1>"
1 HTMLParaElement P "
<P>AB型の変わり者、三流プログラマーKen3がいろいろと書いてます。<BR>反面教師としたり、部分的に抜き取るなり、ご自由に料理してください<BR>※リンクはフリーです、連絡も不要です。TOPでも途中でもお好きなところに・・(リンクしていただけたらありがたいです)</P>"
2 HTMLBRElement BR <BR>
3 HTMLBRElement BR <BR>
4 HTMLParaElement P "
<P>今は、一人でできる小さなシステムの受託開発作業 や 資金がきれたら派遣で食いつないでます。今年(2007年)に35歳になりました、、、プログラマー35歳定年説?もあるし、うまく転機をみつけないとなぁ・・・</P>"
5 HTMLBRElement BR <BR>
6 HTMLTable TABLE
・
・
出力結果の続きは→[http://ken3-info.blog.ocn.ne.jp/test/2007/09/for_n_0_to_obji_44ca.html]を見てください。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オブジェクトの山で遭難しそうだよ。改版履歴:過去の解説はこちら↓(IE6+XP 時代の記事です)
2008-05-01:[過去の解説 vba_ie_20080501.asp]
2007-08-31:[過去の解説 vba_ie_20070831.asp]
2007-05-20:[過去の解説 vba_ie20070520.asp]
もあわせてみてください。
(↑もしかして書き直さない過去の解説の方がよかったかも?(笑))
ken3.org 掲示板の過去LOG→:[保存された過去ログを見る]
Ken3の連絡先:[連絡先@メールアドレス]です。何か相談事があれば気軽に連絡してね(頼りないけど)
WebBrowser Control -- Reference for Visual Basic Developers
http://msdn2.microsoft.com/en-us/library/Aa752043.aspx
WebBrowser Object
http://msdn2.microsoft.com/en-us/library/Aa752085.aspx
アクセス可能な HTML 要素
http://www.microsoft.com/japan/msdn/workshop/author/access/accessibility.aspx#acc_elements
この辺りから1つ1つ探っていくのもアリかなぁ・・・
Internet Explorer (Programming)
http://support.microsoft.com/iep
上記は英語だから・・・ツライけど。
読者の心の声:だったらテメエがわかりやすく翻訳したり説明しろよボケ
[後輩に追い越される三流な先輩]←こんな感じで後から来た皆さんに追い越されまくり(笑)
検索エンジンやリンクから、せっかく私のサイトに来ていただいたのですが、下記2つの検索結果がかなり参考になったり・・・するのでは???
[IE 魔界の]2つをキーワードにしてGoogleで検索する
(↑かなりの確立で有効な回答が得られると思います、先輩方の回答を見ると謎が解けると思います。私もすらっと回答できる、そんな人になりたいですね。。。)
↓あとは、パターン的にobjIEと変数名を定義している人が多いので、
[objIE]をキーワードにしてGoogleで検索する
も有効かなぁ。※短いサンプルなどが見つかり、参考となるのでは?
あとは、[InternetExplorer.application]をキーワードにしてマイクロソフト内検索する
などなど・・・
↑1歩1歩独自で進めたい人はこんな感じで、実際のプログラムを見ながら進めるのがいいと思います。
※また、BBSやMLの空気を読んで(過去ログも読んで)、上級者がいらっしゃる掲示板に質問を投げてみるのもひとつの手です。
検索に迷ったら(IE操作の道に迷ったら)、objIE や InternetExplorer.application をキーワードにGoogleやYahooで探ってみてください。
[No.71 IE操作 リンク先を取出す .Document.links(i).href] .Documentオブジェクトのリンクを探り、 .href .outertext .outerHTML を使ってみました。関連リンク 2008/02/04: [三流君CODEのゴミ箱: VBA IE操作 リンクの取り出し と ダウンロード IE6+Excel2003] ←ダウンロードとの組み合わせとサンプルファイルです。サンプルにキレがないけど こちらも合わせてみてください
[No.97 InternetExplorer.application操作 .Clickでクリック] データをフォームに objIE.document.all.userid.Value = "Ken3" 'ユーザー名 objIE.document.all.pass.Value = "aaa" 'パスワード でセットして、その後、 objIE.document.all.btn01.Click 'クリックメソッドを実行 単純にクリックメソッドを実行して、自動ログイン処理を作成しました。 [No.105 VBAからIE操作 .document.forms(0).Submit でフォーム送信処理] ボタンに名前が付けられていないと、.Clickが使いにくかったので、 .document.forms(0).Submit を使用して、ファームの送信ボタンを押しました。 [No.108 IE アプリケーションのイベントを横取りする] Dim WithEvents IE As InternetExplorer と WithEventsキーワードを使って、 IE_NewWindow2(ppDisp As Object, Cancel As Boolean) と書き、IEのイベントに対して、処理を書いてみました。 テストで下記のようなダウンロード終了時に発生するイベントを書いてみました。 Private Sub WebBrowser0_DocumentComplete(ByVal pDisp As Object, URL As Variant) 'タイトルの代入 Me![txtTITLE] = Me.WebBrowser0.Document.Title 'HTMLの代入 Me![txtHTML] = Me.WebBrowser0.Document.body.innerhtml End Sub [No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True] .Document.all(n).Selected=Trueを使用して、 フォーム内のSELECT タグのOPTIONを選択してみました。 [No.112 IE 操作 .ExecWB でコマンド実行(検索したかったけど)] IEの機能(ボタン)を使いたかったので、.ExecWBを探りました。 検索コマンドがうまく行かなかったので、SendKeysで逃げました・・・・ [No.116 InternetExplorer操作 Frameと遊ぶ Objectを探る方法] F2のオブジェクトブラウザを使って、Frameを探り、 フレーム分割された画面に対して、データをセットしてみました。 objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3" とフレーム関係を探ってみました。 [No.117 InternetExplorer操作 .Silentを使用したけど....] JavaScriptのalert警告メッセージを表示したくなかったので、 .Silent=Trueを使用したが、うまく行かなかった話です。 ※逃げ手(代替案)も成果も無いメルマガでした。(笑) [No.118 Microsoft Web Browser コントロールをフォームに貼る] Microsoft Web Browser コントロールをフォームに貼る手順の解説です。 たんに挿入、ActiveXコントロール、と順に選ぶだけです(簡単です) [No.119 IEを使用して、Web上の表をExcelへ] TABLEのタグから階層的にTR,TDのタグを取り出し、 Web上の表データをExcelに転記しました。 タグはタグの集合体、そんな階層イメージがわかればOKです。 [No.120 URLDownloadToFile APIを使用してダウンロードしてみた] URLDownloadToFile APIを使用して、 Web上のリンク先のデータをダウンロードしてみました。 (右クリック、保存の自動化にチャレンジしてみました) [No.124 IE _BeforeNavigate2イベントでPostデータを覗き見する] _BeforeNavigate2、次のURLへ移る前のイベントで、 PostDataをチェックしてみました。 [No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い] INPUT Type=RADIO(ラジオボタン)のオブジェクトに対して、 .Checkedだとイベントが起動しないが、 .ClickだとonClickのイベントが起動する、 そんな違いの話を少し書いてます。 [No.154 IE SELECTタグの選択 .SelectedIndex=nで選択] objIE.Document.all.Ken.SelectedIndex = 5 objIE.Document.all.kansou.SelectedIndex = 2 など、.SelectedIndexでSELECTタグの項目を選択してみた。 [No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動] fireEvent --- Fires a specified event on the object. (オブジェクトに指定された出来事を発砲します。) なんてのがあって、 '選択後にonchangeのイベントを発生させる objIE.Document.all.JYO.fireEvent ("onchange") として、JavaScriptのonchangeイベントを発生させました。 [No.156 TypeNameとShell.Applicationを使い起動済みのIEを探す] 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") ここから、ウインドウの数だけまわし、起動中のIEを探してみました。 For Each objWindow In objShell.Windows Debug.Print "タイプは:" & TypeName(objWindow.document) 'HTMLDocumentだったら If TypeName(objWindow.document) = "HTMLDocument" Then 'オブジェクトを代入する Set objIE = objWindow nFLG = True '見つけたよ Exit For '初めに見つけたオブジェクトを代入 End If Next [No.157 IE Element の 我流な探し方(AS Objectはキライ)] TypeNameを使い、 'データをループする For Each objTAG In objIE.document.all Debug.Print objTAG.tagName & ":" & TypeName(objTAG) Cells(yline, "A") = objTAG.tagName Cells(yline, "B") = TypeName(objTAG) Cells(yline, "C") = objTAG.innerHTML yline = yline + 1 Next ループさせて、オブジェクトのタイプを探ってみました。 B:HTMLPhraseElement BR:HTMLBRElement A:HTMLAnchorElement とかいろいろとあるみたいです。 [No.159 IE 認証ページへのアクセス、basci認証ページって?] ヘッダーに "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q=" と基本認証のコードを埋め込み、Basic認証のページをIEで開いてみました。 'テスト用の認証ページに飛ぶ Const strURL = "http://www.kurokiya.sake-ten.jp/zzz/" Const strHEAD = "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q= " & vbCrLf objIE.navigate2 strURL, , , , strHEAD たんにヘッダーで送っているだけです。 [No.162 IE データセット後、JavaScriptを起動する] IEのJavaScriptの起動方法ですが、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Me.WebBrowser1.Document.scripts(n) とか、scriptsがスクリプトオブジェクトだから、 これを.RUNとかないかなぁと探ってみましたが、 目的の処理が見つかりませんでした。 <a href = "JavaScript:parts('B')">〜 とリンクになっているから、それだったら、 .Navigate2 "JavaScript:parts('B')" でOKなのか?って発想でテスト実行してみました。 [No.163 IE _NewWindow2 別窓で開いたオブジェクトの管理] Dim WithEvents objNEW_IE As InternetExplorer でオブジェクト変数を定義して_NewWindow2で新規IEを作成、 Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean) Set objNEW_IE = CreateObject("InternetExplorer.Application") Set ppDisp = objNEW_IE '作ったオブジェクトを代入 objNEW_IE.Visible = True End Sub 下記のように、作成したIEのイベント(ここでは読み込み完了)で処理したサンプルです Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant) MsgBox "あたらしく開かれたURLは" & URL End Sub [No.164 IE .getElementsByTagNameでタグ指定 .Quitで閉じる] .getElementsByTagName("タグの名前") で指定したオブジェクトを取得できます。 新規ウインドウに表示された広告コードなどTEXTAREAのタグを .getElementsByTagName("TEXTAREA") で取り出し処理を行い、その後、.Quitで新規に開いたIEを閉じました。 [No.167 amazonの広告コード UTF-8を探る(keywordを作る) ] IE操作にはあまり関係ないのですが、 amazonの広告コード UTF-8でkeywordを作ってみました。 ※SJISをUTF-8に変換してみました。 [No.170 IE Aタグのリンク先を.Click(クリック)してみた] フレームの先のJavaScriptの起動ができなくて、 苦肉の策で Dim objFDOC As Object 'フレームのドキュメントを保存する Set objFDOC = objIE.Document.frames("F_RIGHT").Document '代入 'リンク情報からオブジェクトを探し.Clickする For n = 0 To objFDOC.links.Length - 1 'リンク数分まわす Debug.Print objFDOC.links(n).href 'デバックで表示する 'リンク先(.href)をチェックする(文字列比較する) If objFDOC.links(n).href = "javascript:gonumber();" Then objFDOC.links(n).Click '.Clickでクリックしてみた Exit For '見つかったので強制的にループを抜ける End If Next n と、フレームの先のリンク先オブジェクトを探して.Click(クリック)して逃げました。 [No.175 IE .Navigate about:blankで空白ページ表示 禁断の制御文GOTO文] objIE.Navigate "about:blank" で空白のページを表示してから、 正常に移動されなかったら、禁断の制御文?GoTo文を使って再度読み込みに行く、 そんなサンプルです。(あまりキレがないけど) [No.176 VBAからIE操作 NAMEが同じフォームの項目へデータをセットする] 同じ名前が存在する時、.allで探すとエラーになるので、 objIE.document.all.q(0).Value = "golf" 'document.all.q(0)をテスト や objIE.document.all("q")(1).Value = "auto" 'document.all("q")(1)をテスト でセットして遊んでみました。 ラジオボタンの操作の時、 '上から3番目のGUCHIをチェック(2)の.CheckedをTrueにする objIE.document.Forms(0).kubun(2).Checked = True 'セレクト状態をtrueにする や '下記でもOKです.all("kubun")(2)を操作する 'objIE.document.all("kubun")(2).Checked = True 'セレクト状態をtrueにする が使えたので、場面によっては楽かなぁ??? [No.177 VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか] サンプルは株価の表で、TABLEが2重になってました。 そのテーブルを、 '.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す For Each objTAG In objIE.document.getElementsByTagName("TABLE") 'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック If InStr(objTAG.InnerText, "終値") > 0 _ なんて感じで識別して、取り込んでみました。
| ※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。 お奨め本の目次を見るだけでも勉強になったり |