三流君 ken3のmemo置き場

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

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

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

VBA IE操作 javascript の prompt alert で処理が止まってしまうダメパターン を 紹介する

人力検索の質問 http://q.hatena.ne.jp/1272265167 を 確認してみた
(ダメ・不具合を確認しただけで、解決策はまだわからなかったり(ぉぃぉぃ)
セコイ方法 http://d.hatena.ne.jp/ken3memo/20100428/1272467509 でなんとか動かしていたり。)

VBAIE処理で、
ボタンを押したあと(onClickでボタンからjavascript起動が起動)、
HTML内の javascript で prompt alert が 使用されていると、
処理が止まってしまう・・・

問題のテスト用のHTML ( http://ken3-info.blog.ocn.ne.jp/test/2010/04/javascript_prom.html )
HTMLのソースは


テストページ<br>

<FORM ACTION="http://www.ken3.org/cgi-bin/test/test041-1.asp" METHOD="POST">
<font color="blue">TYPE="text" テキストの入力テスト</font><br>
お名前:<INPUT TYPE="text" SIZE="20" NAME="USER-NAME" VALUE="匿名希望"><br>
<INPUT TYPE="submit" value="送信テスト">
</FORM>

ボタンって<br>
<button onclick="submitF3('DDDD')">ダウンロード</button><br>
<button onclick="submitF3('EEEE')">EEEEE</button><br>
とか1つですか?<br>
それとも<br>
フォームだからsubmit の ボタンに割り当ててあるのかなぁ?<br>

<hr>
<SCRIPT language="javaScript"> 
function submitF3(command) {
// コマンドを判断して、コメントの入力など
var comment = prompt("コメントを入力してください。","");

//なんだかんだ処理して、最後にメッセージを表示する
alert("処理を受け付けました。");
}
</SCRIPT>

↑こんな感じ

VBAのソースは↓みたいに最後に時刻表示でテストしました。

Option Explicit

Sub ie_Test_Button()  'ボタンを押した先で javascript の prompt/alert が 走ったら、止まる...

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

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    Dim strURL As String        'テストのHTML置き場
    'strURL = "e:\work\index.html"  'ローカルでテスト
    strURL = "http://ken3-info.blog.ocn.ne.jp/test/2010/04/javascript_prom.html" 'テストページ
    
    objIE.Navigate strURL  'テストページを開く

    '↓デバック用で少し待つ(※これは通常いらないです)
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4 Or objIE.Busy = True 'READYSTATE_COMPLETE = 4
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Wend
    
    '↓デバック用で少し待つ(※これは通常いらないです)
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める
    
    'htmlドキュメント allのから .tagsでButtonタグを抜き
    '.InnerTEXT値(ボタンの名称) が VBA解説 の オブジェクト を クリック(.Click)する
    Dim objButton As Object   'Buttonタグ格納用

    For Each objButton In objIE.Document.all.tags("Button")  'Buttonのタグを.allから抜く
        If objButton.InnerTEXT = "ダウンロード" Then '.InnerTEXT値(ボタンの名称) で判断する
            objButton.Click  '見つけたButtonオブジェクト(ボタン)を.Clickクリックする
            Exit For  '用が済んだので(見つかったので)ループを抜ける
        End If
    Next
    
    '↑上でボタンが見つからなかった時のエラー処理が入っていない手抜きだけど、ご勘弁を
    
    '通常は、ここに処理が来るはず・・・だが、処理が来ないので困った、困った。

    Debug.Print Now & "に処理終了"

End Sub

テスト結果は(動画です)
http://www.youtube.com/watch?v=bQYjvK_y_Ns
www.youtube.com

↑こんな感じで VBAの処理に帰ってきませんでした・・・

さてと、どうしましょうかねぇ・・・

その後、セコイ方法(ニセのjavascriptを読み込み後に挿入してつぶす)
http://d.hatena.ne.jp/ken3memo/20100428/1272467509
↑で、なんとか強引に動かしました。

別の方法

http://q.hatena.ne.jp/1174026115

wBrowser.Document.Script.setTimeout

↑こっちが正解かも。



余談.
押すことにこだわらないで、押させない、押す確認関数をつぶす。
'※読み込み完了後、自作のニセalertを追加する
'.navigate "JavaScript:でスクリプトの実行を利用して追加する
objIE.navigate "JavaScript:function alert() { return true; }"
みたいなことが最近(2018年)は、流行っているみたいですね。

www.youtube.com
【VBA IE操作】Javascriptのalert「Webページからのメッセージ」を消すテスト【三流君】 - YouTube

ken3memo.hatenablog.com


Ken3 ホームページ 目次

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

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



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