[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.112 IE 操作 .ExecWB でコマンド実行(検索したかったけど)

IE 操作 .ExecWB でコマンド実行(検索したかったけど)

概要:
IEの機能(ボタン)を使いたかったので、.ExecWBを探りました。
印刷プレビューのコマンドは
Const OLECMDID_PRINTPREVIEW = 7 '参照設定している場合は不要です
Const OLECMDEXECOPT_DODEFAULT = 0 'テストなので、
'IEのメニューコマンドを実行する(7番のコマンド)
objIE.ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT
みたいにテストしてみました。

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

<IE 操作 .ExecWB でコマンド実行(検索したかったけど)>

どうも、三流プログラマーのKen3です。 今回は、 掲示板とメールでもらった質問を処理するために、 IEのコマンドボタンを使う.ExecWBをイタズラしたそんな話です。 結局、出来なかったんだけど、途中経過を楽しんでね。 ※事前調査でつまずく、そんな例です。

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi ---- >タイトル:VBAからIEの検索を表示したい > >教えてください。 >環境(EXCEL2000) >EXCELからIEを立ち上げたときに「WEB ページの検索」を >常に表示させたいのですが? >ショートカットキーは、Ctrl + E ですが、 >同処理をVBAでは、どのようなコードになりますか。 >教えてください。 >宜しく、お願いします ---- IEでCtrl + Eを押した状態にする方法 と メールで、 ---- >アクセス2000の環境で、activeXにて、アクロバットリーダ >6 を挿入しました。(アクロバット直接ではなく、Ie6 >からPLUGINです) > >それで、WEBからPDFファイルを引っ張ってきていますが、 >このあと、そのPDFファイルを検索したいのです。 > >アクロバットの検索メニューからデータを入力すればOK >なのですが、これをAccessのフォームをクリックしてアク >ロバットに送り、自動的に検索したいのです。 > >アクロバットではJavaScriptがあると聞いていますが、 >VBAでなんとかいきませんか。 >何かヒントをいただければ幸いです。 ---- こっちは、検索のウインドウを自動ですね。

/* * 2.事前調査、テスト */

どちらも共通しているのは、IEの機能(ボタン)なので、 そのあたりから探ってみます。 IE Command で検索すると、 http://msdn.microsoft.com/workshop/browser/webbrowser/reference/methods/execwb.asp が検索される。 object.ExecWB( _ cmdID As OLECMDID, _ cmdexecopt As OLECMDEXECOPT, _ [pvaIn As Variant,] _ [pvaOut As Variant]) Parameters cmdID Long that represents the identifier of the command to execute. For more information on command identifiers, see MSHTML Command Identifiers. cmdexecopt OLECMDEXECOPT value that specifies the command options. pvaIn Optional. A Variant used for specifying command input arguments. pvaOut Optional. A Variant used for specifying command output arguments. で、ここが使えるコマンドかぁ。 http://msdn.microsoft.com/library/en-us/com/htm/oen_a2z_22sk.asp うわ、いっぱいあるよ・・・ typedef enum { OLECMDID_OPEN = 1, OLECMDID_NEW = 2, OLECMDID_SAVE = 3, OLECMDID_SAVEAS = 4, OLECMDID_SAVECOPYAS = 5, OLECMDID_PRINT = 6, OLECMDID_PRINTPREVIEW = 7, OLECMDID_PAGESETUP = 8, OLECMDID_SPELL = 9, OLECMDID_PROPERTIES = 10, OLECMDID_CUT = 11, OLECMDID_COPY = 12, OLECMDID_PASTE = 13, OLECMDID_PASTESPECIAL = 14, OLECMDID_UNDO = 15, OLECMDID_REDO = 16, OLECMDID_SELECTALL = 17, OLECMDID_CLEARSELECTION = 18, OLECMDID_ZOOM = 19, OLECMDID_GETZOOMRANGE = 20, OLECMDID_UPDATECOMMANDS = 21, OLECMDID_REFRESH = 22, OLECMDID_STOP = 23, OLECMDID_HIDETOOLBARS = 24, OLECMDID_SETPROGRESSMAX = 25, OLECMDID_SETPROGRESSPOS = 26, OLECMDID_SETPROGRESSTEXT = 27, OLECMDID_SETTITLE = 28, OLECMDID_SETDOWNLOADSTATE = 29, OLECMDID_STOPDOWNLOAD = 30, OLECMDID_ONTOOLBARACTIVATED = 31, OLECMDID_FIND = 32, OLECMDID_DELETE = 33, OLECMDID_HTTPEQUIV = 34, OLECMDID_HTTPEQUIV_DONE = 35, OLECMDID_ENABLE_INTERACTION = 36, OLECMDID_ONUNLOAD = 37, OLECMDID_PROPERTYBAG2 = 38, OLECMDID_PREREFRESH = 39, OLECMDID_SHOWSCRIPTERROR = 40, OLECMDID_SHOWMESSAGE = 41, OLECMDID_SHOWFIND = 42, OLECMDID_SHOWPAGESETUP = 43, OLECMDID_SHOWPRINT = 44, OLECMDID_CLOSE = 45, OLECMDID_ALLOWUILESSSAVEAS = 46, OLECMDID_DONTDOWNLOADCSS = 47, OLECMDID_UPDATEPAGESTATUS = 48, OLECMDID_PRINT2 = 49, OLECMDID_PRINTPREVIEW2 = 50, OLECMDID_SETPRINTTEMPLATE = 51, OLECMDID_GETPRINTTEMPLATE = 52 } OLECMDID; OLECMDEXECOPTのパラメータはここ、 http://msdn.microsoft.com/library/en-us/com/htm/oen_a2z_5k38.asp を参照すると typedef enum { OLECMDEXECOPT_DODEFAULT = 0, OLECMDEXECOPT_PROMPTUSER = 1, LECMDEXECOPT_DONTPROMPTUSER = 2, OLECMDEXECOPT_SHOWHELP = 3 } OLECMDEXECOPT; と、書いてある。 ※なんとなくわかりそうな英単語のような、違う意味のような・・・ 危なく無さそうな、印刷プレビューのコマンドで実験してみます。
Sub ie_test()

    Const OLECMDID_PRINTPREVIEW = 7    '参照設定している場合は不要です
    Const OLECMDEXECOPT_DODEFAULT = 0  'テストなので、

    Dim objIE As Object  'IEオブジェクト参照用
    Dim a, b 'ダミー変数

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)
    objIE.GoHome

    '表示終了まで待つ(ビジーの間ループする)
     Do While objIE.Busy = True
         DoEvents '何もしないループ(笑)
     Loop

    'IEのメニューコマンドを実行する(7番のコマンド)
    objIE.ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT

End Sub
使用方法・ポイントは特に無く、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'IEのメニューコマンドを実行する(7番のコマンド) objIE.ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT と、 定数を渡しただけで、初期ページのプレビューが表示されました。 ※頭でConst OLECMDID_PRINTPREVIEW = 7を定義してますが、  MicroSoft Internet Controls を参照設定してあれば、  そんなことしないので、注意してくださいね。 ↑実験結果。

/* * 3.検索関係を探る */

質問は検索の窓だよね、それらしい英単語をコマンド一覧から探すと、 OLECMDID_SHOWFIND = 42, これなんて、あやしいよね、SHOW FIND かぁ あと、 OLECMDID_FIND = 32, なんかは、そのまま、検索コマンドのような気がする。 'IEのメニューコマンドを実行する(42番のコマンド) objIE.ExecWB OLECMDID_SHOWFIND, OLECMDEXECOPT_DODEFAULT と、組み込んでテストしてみました。 テストで実行(心の中では、楽勝ムードだったが・・) あらら、実行時エラー・・ExecWBメソッドは失敗しました・・だってさ・・ ↑デバックメッセージ。 objIE.ExecWB OLECMDID_SHOWFIND, OLECMDEXECOPT_DODEFAULT 何がおかしいのか・・・ よし、ここは、他力本願、OLECMDID_SHOWFINDをキーワードに検索するぞ。 ※エラーになった関数で検索して、人様の成功例を探す、  そんな学習方法もアリですよ。 でも、見つからない・・みなさん、 .ExecWB OLECMDID_SHOWFIND なんて、使わないのか・・・・

/* * 4.SendKeysで逃げた */

印刷プレビューのテストが出来たので、 IEのコマンド操作、簡単だと思ったけど、 何かがおかしく、検索のウインドウを表示できなかった。 しかたがない、いつもの、古典的な手法、SendKeysで逃げます。
Sub ie_test_検索()

    Const OLECMDID_SHOWFIND = 42       '参照設定している場合は不要です
    Const OLECMDEXECOPT_DODEFAULT = 0  'テストなので、

    Dim objIE As Object  'IEオブジェクト参照用
    Dim a, b 'ダミー変数

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)
    objIE.GoHome

    '表示終了まで待つ(ビジーの間ループする)
     Do While objIE.Busy = True
         DoEvents '何もしないループ(笑)
     Loop
    
    'IEをアクティブにする。
    AppActivate "Microsoft Internet Explorer"
    SendKeys "^f", True  'Ctrl+Fをアクティブなアプリへ送る

End Sub
同様に、 'IEをアクティブにする。 AppActivate "Microsoft Internet Explorer" SendKeys "^e", True 'Ctrl+Eをアクティブなアプリへ送る でCTRL+Eを送ると、 左側に、検索のフレームが表示されます。

/* * 5.終わりの挨拶 */

う〜ん、スッキリしないが、 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

フィードバック

読者より、アドバイス/回答をいただく
------- 「OLECMDID_FIND」・「OLECMDID_SHOWFIND」が「効かない」旨の記事を書いていらっしゃいますが、
やっと、根拠を見出しましたのでお知らせいたします。


●ExecWB メソッドを呼び出すとランタイム エラー
http://support.microsoft.com/kb/251133/ja

>現象:Microsoft Web Browser コントロールに ExecWB メソッドを呼び出すと、次のエラー メッセージ・・・
>原因:この動作は仕様です。
>詳細:OLECMDID の値は次の IWebBrowser2::ExecWB() メソッドでは定義されていません。
>・OLECMDID_FIND
>・OLECMDID_SHOWFIND


ページフッター リンクや広告、質問送信など

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

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

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

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

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



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

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]