HP:[三流君(TOPへ)]/[VBA系(TOP)] /[VBAでIEを操作(TOP)へ] /[過去のメルマガ記事一覧]
大分類:[Document(タグ付き文章)] /[Document.Forms(入力処理)] /[Document.Links(リンク情報)] /[Document.Images(画像情報)] /[Document.Frames(フレーム処理)]
IE,WebBrowser: [IE プロパティ一覧(各種設定)] /[IE メソッド一覧(イロイロな動作)] /[WebBrowserのイベントに処理を書く]


三流君VBAでIE操作 フレーム操作 Document.Frames

挨拶:VBAで(ExcelやAccessなどから)InternetExplorer WebBrowserを操作してみたいと思います。
ここでは、最近見かけなくなった?フレームページの操作について、少し書いてみます。
※SEOで不利?とかで、最近はフレームを採用したページが減ったけど、SEO気にしないTOPページ以外は、証券会社の発注画面などで多く使われているみたいですね。
※※一画面に(1HTMLファイルに)、同じヘッダー・フッター、ロゴを読み込むよりは、フレーム分けして、内容だけ更新したほうがServerに負荷が少ないから、証券会社の発注ページではFrameを使ったページが多いのかなぁ?と勝手な予想。チリも積もればで、同じ内容をHttpで送信すると莫大な通信量になるし。



まずは、簡単な2分割から

簡単な、基本の2分割から探ってみます

参照設定から探ってみます

汚い手で女の子に触れると嫌がられる?
じゃなくって、
いつも、私は手抜きで、AS Objectとやっているので、
なぜExcelもIEも同じAs Objectなのか?と質問
いっぱいもらうので、
今日は、皆さんが好きな、型をキチント指定して作ってみます。

自分で打ち込みながらやったほうが、力になるので(手抜きの言い訳ですが)

まず、参照設定を行います。


参照設定では、MicroSoft Internet Contorlsを選択します。
(※見つからない場合は Microsoft Browser Helpersがあると思うので設定してください)

次に、変数を宣言します。
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押しますか、
あらら、いつものヘルプが出ない・・・
う〜ん、どうしましょう・・・

みなさんは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ドキュメントと言ってるのは。
 ↑ゴメンなさい、少し文章変ですよね。

フレーム処理に各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やobjFRAME(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 だったんですね。 いろいろと型を指定して、代入して、遊んでみました。

孫フレーム、フレームの中でさらにフレーム

複数フレームの処理を書く
上下や左右の単純な2分割じゃなくて、証券会社のページは分割の分割・・になってます。
基本は、2分割の応用で、

ここからした、サンプルを作って、速めに書き込む
※現在作成中です、少々お待ちを。

逃げるように 終わりの挨拶

入り口を間違えないで、みなさんは参照設定から行ってくださいね。
※まだまだ、確認すること、やることいっぱいだぁ。。。




[#MSDN][ページ内のTOPへ戻る]

WebBrowser Control や DHTML など オブジェクトやプロパティの探り方?

ヘルプはどこにあるの?三流なのにどうやって資料を探しどこで勉強したの?
と、質問をいただきます。(自分で調べていきたい読者様の前向きな問い合わせです)
やはり本家Microsoft.comのよく聞く?MSDNを探ってみるのも・・・(あまり深く見ると楽しむ前に挫折しかかるので、下記はほどほどに・・・)

MSDNから探る

英語だけど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] をクリック
などして、さまよいながら・・・探したりしてます。(三流ガイドの私も迷ってます)

続きは、[IE Web Browser のプロパティ・メソッドを調べる] を 見てください。


[#Search][ページ内のTOPへ戻る]

番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索

検索エンジンやリンクから、せっかく私のサイトに来ていただいたのですが、下記2つの検索結果がかなり参考になったり・・・するのでは???
IE|oIE|WebBrowser|objIE 魔界の 2つをキーワードにしてGoogleで検索する
(↑かなりの確立で有効な回答が得られると思います、先輩方の回答を見ると謎が解けると思います。私もすらっと回答できる、そんな人になりたいですね。。。)
↓あとは、パターン的にoIE,objIEと変数名を定義している人とWebBrowser1.が多いので、
oIE|objIE|WebBrowserをキーワードにしてGoogleで検索する
も有効かなぁ。※短いサンプルなどが見つかり、参考となるのでは?

さらに検索を紹介すると、[InternetExplorer.application]をキーワードにしてマイクロソフト内を検索する
などなど・・・

↑1歩1歩独自で進めたい人はこんな感じで、実際のコード や 掲示板・ML上の自分と似た質問のやりとりを見ながら進めるのがいいと思います。
※また、BBSやMLの空気を読んで(過去ログも読んで)、上級者がいらっしゃる掲示板に質問を投げてみるのもひとつの手です。
検索に迷ったら(IE操作の道に迷ったら)、objIEoIE さらに InternetExplorer.applicationDocument.All などをキーワードにGoogleやYahooで探ってみてください。

脱線すると、google検索のワンダーホイールって面白い
↓私のよく使う変数 objIEで検索すると
objIEの結果をワンダーホイールで表示
↑なかなか、楽しめそうです。※関連項目の全てが線でつながらないけど(全てつながるとかなり面白いのに。)
googleってすげぇなぁ。


不思議なIEお嬢様、まだまだ攻略できそうにないよね。
えっ、Excel姫やAccessお姉さまも攻略して無いダロって?
※う〜ん、実力無くて、なかなか、攻略できなくて。。。。
何かの参考となれば幸いです。


[#BackNoLink][ページ内のTOPへ戻る]

過去のメールマガジンのリンクが長かったので、下記に移動しました。
[IE操作 メルマガ 一覧]
よろしくお願いします。


改版履歴 更新情報:過去のIE操作の解説はこちら↓(IE6+XP,IE7+XP の記事です)
2009-12-01:[過去の解説 vba_ie_20091201.asp]
2009-06-01:[過去の解説 vba_ie_20090601.asp]
2009-02-01:[過去の解説 vba_ie_20090201.asp]
2008-05-01:[過去の解説 vba_ie_20080501.asp]
2007-08-31:[過去の解説 vba_ie_20070831.asp]
2007-05-20:[過去の解説 vba_ie20070520.asp]
もあわせてみてください。
(↑もしかして書き直さない過去の解説の方がよかったかも?(笑))


プログラミングの書籍を紹介します

  1. [4798021180]- ゲームプログラマになる前に覚えておきたい技術
  2. [4798116831]- レガシーコード改善ガイド (Object Oriented SELECTION)
  3. [4798119865]- PHP 逆引きレシピ (PROGRAMMER’S RECiPE)
  4. [479735397X]- Photoshop 10年使える逆引き手帖 【CS4/CS3/CS2/CS/7.0対応】 (ああしたい。こうしたい。)
  5. [4798017973]- Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!Excel2007/2003対応
  6. [489471499X]- Effective Java 第2版 (The Java Series)


[#QA_MESSAGE][ページ内のTOPへ戻る]

ページフッター

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

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

Blog:[サンプルコードのゴミ箱]
動画:[VBA解説・テスト動画]


[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧]