三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ IE操作「Webページからのメッセージ」(Javascriptのalert)を消す方法

IE操作で下記の質問をいただく

>今、壁にぶつかったのが
>「******確認」のボタンをクリックすると
>「Web ページからのメッセージ」
>が出て、その後のプログラムが全く走りません。
>「非同期」等の記事を読ませてもらいましたが、私には難解で先に進めません。
>何卒解決のヒントをご教示していただけないでしょうか。

↓いつもの酔っ払い解説動画・・・
www.youtube.com
【VBA IE操作】Javascriptのalert「Webページからのメッセージ」を消すテスト【三流君】 - YouTube

1.テスト環境、再現環境を作る
表示が
「Web ページからのメッセージ」
なので、
テストページでJavascript alertメッセージを使用している
http://www.ken3.org/vba/test153.html
を使ってみる。

'テスト、IE SELECTタグ 選択後、Javascriptのalertメッセが表示される。
Sub ie_test_20180418_001()

    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

2.OKボタンを押す を メッセージを表示させない に 読み替える

次に、素直な人は、流れ的には、
表示された
「Web ページからのメッセージ」
のOKボタンを押す

f:id:ken3memo:20180418225849j:plain

なんですが、
これを
メッセージを表示させない、
Javascriptのalert関数を無効にする
そんな処理を行ってみます。

昔のサンプルだと、
暗証番号入力 confirm確認メッセージを無効にする JRA入出金メニュー
ken3memo.hatenablog.com

VBA IE操作 ニセのpromptとalert() を 挿入する そんな実験
ken3memo.hatenablog.com

'暗証番号を入れ、実行する

    '確認メッセージで はい を 答えたい ≠≒ 確認を必ず はい(true)にする
    Dim ele 'エレメント(script)を1つ作りたいので。
    Set ele = objIE_I.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    ele.Text = "function confirm() { return true; }"  'コードをセットする
    
    Call objIE_I.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
    '※行儀が悪い方法だが、
    'javascriptの同名関数は標準関数よりも後から追加したユーザー関数がエラーにならないで走ることを利用

↑みたいに、していましたが、
最近流行の言葉使いは、

objIE.navigate "JavaScript:function alert() { return true; }"

みたいに、
魔法の一行じゃなけど、
alert関数で何もしない JavaScriptを追加する書き方が多いかなぁ。

これを使うと、
標準のメッセージ表示動作が何もしない動作になるので、
OKボタンを押させるよりも簡単かなぁ。

'IE SELECTタグ 選択後、Javascriptの標準のalertメッセを回避したかったので
'テスト、ページ読み込み完了後
'.navigate "JavaScript:function alert() { return true; }"
'↑Javascript 関数を追加する
Sub ie_test_20180418_002()

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

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

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

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

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

     'waitを入れたほうがいいかも?

     'ここがポイント 2018/04/18
     '※読み込み完了後、自作のニセalertを追加する
     '.navigate "JavaScript:でスクリプトの実行を利用して追加する
     objIE.navigate "JavaScript:function alert() { return true; }"

     '場名を選択する
     '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

メッセージが
alertなら
objIE.navigate "JavaScript:function alert() { return true; }"

confirmなら
objIE.navigate "JavaScript:function confirm() { return true; }"
を読み込み後に入れてみては?

解決の糸口となれば幸いです。 三流プログラマー Ken3

※冒頭と一緒です。↓いつもの酔っ払い解説動画・・・
www.youtube.com
【VBA IE操作】Javascriptのalert「Webページからのメッセージ」を消すテスト【三流君】 - YouTube

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)