[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動

IE SELECT後 .fireEventでJavaScriptのイベントを起動

概要:
fireEvent --- Fires a specified event on the object.
(オブジェクトに指定された出来事を発砲します。)
なんてのがあって、
'選択後にonchangeのイベントを発生させる
objIE.Document.all.JYO.fireEvent ("onchange")
として、JavaScriptのonchangeイベントを発生させました。

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

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

メルマガ発行内容

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

<IE SELECT後 .fireEventでJavaScriptのイベントを起動>

どうも、三流プログラマーのKen3です。 今回は、前回の続きで、 IEでSELECT タグの操作を探ってみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba155.lzh にvba155.xls(Excel2000版)が保存されています。 ※自分でテストページを作ったりして、遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

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

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、SELECTタグOPTIONの選択でJavaScriptが起動しない、 そんな問題にぶちあたりました。 もらった質問に対して、いつものように、違う方向に進んでいるんだけど。 下記がもらった質問です。 ---- <FORM name=form1 onsubmit="mai('s');return false;"> <TBODY> <TR> <TD><B>場名</B><BR> <DIV align=right><SELECT onchange=Rdp(); name=JYO> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> <TD><B>レース</B><BR> <DIV align=right><SELECT onchange=Hdp(); name=Race> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> あるサイトの一部ぬきだしました。 ここで、おそわったのを、まねして WB1.Document.form1.jyo.selectedIndex = 1 WB1.Document.form1.jyo.Options(1).selected = "selected" WB1.Document.form1.jyo.Options(1).selected = True と、やると、コンボに選択された文字がでました。成功!と おもいきや、つぎのレースの選択項目が、からっぽです。 ためしに、マウスでクリックすると、選択項目が、 ふくまれます。documentも、かわるようです。 どうやら、onchangeが、おきてないためらしい。 これについて、いろいろ、しらべたけど、わかりません。 疑問1:rdp()という関数は、どこにあるんでしょうか。      このhtmlの、最後に、なにか、      scriptが、あるのですが、(よめない)      どうも、それではないみたいです。 疑問2: onchangeを、vbから、起こしてやることは      できないでしょうか。 ---- それに対して、 http://www.ken3.org/vba/test153.html で、 テストで、下記のjavaScriptを書いてみました。 場名を選択すると、レース内容を変更する<br> <br> <FORM name=form1 onsubmit="mai('s');return false;"> <TABLE BORDER="1"> <TR> <TD><B>場名</B><BR> <DIV align=right> <SELECT onchange=Rdp(); name=JYO> <OPTION value=0 selected>選択項目 </OPTION> </SELECT></DIV></TD> </TR> <TR> <TD><B>レース</B><BR> <DIV align=right><SELECT onchange=Hdp(); name=Race> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD> </TR> <TR><TD><INPUT TYPE="submit" VALUE="送信"></TD></TR> </TABLE> </FORM> <script type="text/javascript"> //場名を初期化する document.form1.JYO.length = 5; //強引にオブジェクトを増やす(オイオイ) document.form1.JYO.options[1].text = "東京"; document.form1.JYO.options[2].text = "京都"; document.form1.JYO.options[3].text = "中山"; document.form1.JYO.options[4].text = "阪神"; //↑強引に選択肢を増やしてみた(笑) </script> <script type="text/javascript"> <!-- //ここからJavaの関数を書いてみる function Rdp(){ // Rdp 場所が選択されたらレース内容を変更する //レース内容を場所に合わせて変更 document.form1.Race.length = 3; //強引にオブジェクトを3にする(ホントは12R) var n = document.form1.JYO.selectedIndex //場名選択位置を代入 alert("開催選択後、Rdp呼ばれたよn="+n); switch (n) { case 1: //東京なら document.form1.Race.options[0].text = "9R 昇仙峡特別"; document.form1.Race.options[1].text = "10R 奥多摩ステークス"; document.form1.Race.options[2].text = "11R 霜月ステークス"; break; case 2: //京都なら document.form1.Race.options[0].text = "9R もみじステークス"; document.form1.Race.options[1].text = "10R古都ステークス"; document.form1.Race.options[2].text = "11Rマイルチャンピオンシップ(GI)"; break; case 3: //中山なら alert("開催してないよ"); break; case 4: //阪神なら alert("開催してないよ"); break; } } function Hdp(){ // Hdp レースが選択されたら次は?(今回は省略) alert("Hdp呼ばれたよ(レース選択後)"); } function mai(parapara){ // maiイベントのテスト // Submitボタンが押されると、ここが走るのでテストする alert("受け取ったのは"+parapara); } // --> </script> これで、テスト用のHTMLは完成したけど、 本題は、IEからの操作でした。

/* * 2..SelectedIndexを使って普通に選択してみる */

.SelectedIndex なんて方法を知ったので、 下記のように組んでみました。
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")

    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ(テストのHTMLを表示する)
    objIE.Navigate "http://www.ken3.org/vba/test155.html"

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

     '場名を選択する
     'SELECTタグに付いた名前(Name)がJYOの上から2番目(1)をテストでセット
     '.SelectedIndexに1をセット(012345で2番目となる)
     objIE.Document.all.JYO.SelectedIndex = 1
     
     'レースを選択する
     'Raceの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
     objIE.Document.all.Race.SelectedIndex = 2

     '0からインデックスが始まるのがポイントです↑

End Sub
プログラムはエラーで止まらずに動作するが、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <SELECT onchange=Rdp(); name=JYO> や <SELECT onchange=Hdp(); name=Race> が走らない。 Rdp()で、レース場単位でレース名を動的に切り替えているので、 これが起動しないと、データがセットできない。

/* * 3.JavaScriptの起動を調べてみる。発砲? */

SELECTタグかぁ・・・あまり気が進まないが、少しみてみる。 下記が、DHTMLのSELECTの説明ページです。 http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/select.asp ここみると、 Attributes/Properties Behaviors Collections Events Methods Objects Styles なんてあって、とても一発じゃ探せないんだけど(かなり時間かかったけど) Methods の中に、(Methodsを翻訳ソフトで調べると 方法/方式?だよね) fireEvent --- Fires a specified event on the object. (オブジェクトに指定された出来事を発砲します。) なんてのがあります。 おっ、これで指定したイベントを発生させることができそうですね。 ※発砲って表現を、発行に置き換えるとイベントらしいよね。 fireEvent http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/fireevent.asp をみてみると、使い方は、 Fires a specified event on the object. bFired = object.fireEvent(sEvent [, oEventObject]) Parameters sEvent Required. String that specifies the name of the event to fire. oEventObject Optional. Object that specifies the event object from which to obtain event object properties. よくわかんないけど、ストリングの文字列でイベントの名前渡せって? イベントの名前を渡すだけでいいのかぁ。 Return Value Boolean. Returns one of the following values: true Event fired successfully. false Event was cancelled. リターン値も返って来るんだね。※いつも手抜きで見てないけど。 コイツを組み込むと、しますか。(ここまでに何時間かかったんだよ・・・)
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")

    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ(テストのHTMLを表示する)
    objIE.Navigate "http://www.ken3.org/vba/test155.html"

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

     '場名を選択する
     'SELECTタグに付いた名前(Name)がJYOの上から3番目(2)をテストでセット
     '.SelectedIndexに2をセット(012345で2番目となる)
     objIE.Document.all.JYO.SelectedIndex = 2
     
     '選択後にonchangeのイベントを発生させる
     objIE.Document.all.JYO.fireEvent ("onchange")
     
     'レースを選択する
     'Raceの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
     objIE.Document.all.Race.SelectedIndex = 2
     objIE.Document.all.Race.fireEvent ("onchange")  '変更時のイベントを発生させる

End Sub
あれ、こんな簡単に出来てしまった・・・

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

今回は、 プログラムから値をセット後、 操作じゃないのでイベント発生しない、、 そんな時は、 .fireEventでJavaScriptのイベントを起動。そんな話でした。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

フィードバック

いろいろと別な切り口の方法もあるみたいなので...

Document.Script.setTimeoutもあるので試してみては?

objIE.Document.Script.setTimeout "javascript:コード", 200
みたいな感じで、Document.Script.setTimeoutでコードが実行可能でした。
Document.Script.setTimeoutを一度試してみてください
下記、実際のテスト動画です。よろしくお願いします。

ソースコードと簡単な解説は [蛇足 脱線 横道 VBScript IE操作 で javaScriptを実行 Document.Script.setTimeoutをテスト] をみてください。

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

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

[三流君 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へ]