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

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

メルマガ発行内容

<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でした。 ~~~~~~~(↑オイオイ)

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.155を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります


ページフッター(リンクや広告など)

[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・