ken3memo (三流君)

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




[記事一覧、バックナンバーを見る]

2010-04-28

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

人力検索の質問 http://q.hatena.ne.jp/1272265167 の回答作りで、

VBAでIE操作時のじゃまな JavaScriptの promptとalert() を消したかったので、ニセのpromptとalert() を 挿入する。

function prompt() { return ('固定で返したい文字');}

function alert() { return ;}

↑を入れる。そんなセコイ方法・方針で行ってみました。

実験の頭からの流れは http://d.hatena.ne.jp/ken3memo/20100428 の記事を読んでください。

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

動的に JavaScriptを読み込む

http://zombiebook.seesaa.net/article/22810383.html

■ 外部スクリプトではなく生成したコードを突っ込む場合

var ele = document.createElement("script");

ele.type = "text/javascript";

ele.text = "突っ込むコード";

document.body.appendChild(ele);

を参考にして、

VBAから読み込んだページに

ニセのpromptとalert()をぶち込んでみます。

ページ読み込み後に、

'04/28 ページが読み込まれたので、ニセのjavascriptを挿入、毒を喰わせる?
'>動的に JavaScriptを読み込む http://zombiebook.seesaa.net/article/22810383.html を参考にしました
    Dim ele As Object  'エレメント(script)を1つ作りたいので。
    Set ele = objIE.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    Dim strJCODE As String   '挿入するコード(文字列)
    strJCODE = "function prompt() { return ('123固定で返したい文字');}"
    strJCODE = strJCODE & vbCrLf & "function alert() {  return ;}"
    ele.Text = strJCODE  'コードをセットする
    
    Call objIE.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
'↑ここまでで、ニセjavascriptの関数作成終了、あとはいつものように処理すると

↑みたいな感じで、ニセのjavascriptを組み込む(毒を喰わせられるので)

これを応用すれば、

javascript prompt alert で VBAに処理が返らない(帰ってみない)

を回避できるのでは?

strJCODE = "function prompt() { return ('123固定で返したい文字');}"

ここの固定文字を OK固定やYES固定にすれば、自動操作時にうまくユーザープロンプト入力をかわせるのかなぁ....

無駄に迷っているテスト動画

http://www.youtube.com/watch?v=k6XIeMITqDg

D

を見て笑ってください。

ソース全体

全体のソースは下記のような感じです。

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 = "http://ken3-info.blog.ocn.ne.jp/objie/2010/04/0428_javascript.html" 'テストページ
    
    objIE.Navigate strURL  'テストページを開く

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

    'ページが表示される 完了を待つ
    While objIE.ReadyState <> 4 Or objIE.Busy = True 'READYSTATE_COMPLETE = 4
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Wend

'04/28 ページが読み込まれたので、ニセのjavascriptを挿入、毒を喰わせる?
'>動的に JavaScriptを読み込む http://zombiebook.seesaa.net/article/22810383.html を参考にしました
    Dim ele As Object  'エレメント(script)を1つ作りたいので。
    Set ele = objIE.document.createElement("SCRIPT")
    
    ele.Type = "text/javascript"
    Dim strJCODE As String   '挿入するコード(文字列)
    strJCODE = "function prompt() { return ('123固定で返したい文字');}"
    strJCODE = strJCODE & vbCrLf & "function alert() {  return ;}"
    ele.Text = strJCODE  'コードをセットする
    
    Call objIE.document.body.appendChild(ele)  '上↑で作った要素・エレメントをドキュメントに挿入する
'↑ここまでで、ニセjavascriptの関数作成終了、あとはいつものように処理すると
    
    '↓デバック用で少し待つ(※これは通常いらないです)
    Application.Wait Time:=Now + TimeValue("00:00:02")  '画面遷移がはやいので2秒間止める
    
    '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

かなり 三流な逃げ手 ですが、応用して使えたらいいなぁと思いつつ、失礼します。

2010-05-03追加 別の方法

いろいろとセコイ方法を行ったけど、別のタイミングで起動する方法、

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

wBrowser.Document.Script.setTimeout

↑こっちが正解かも。

Document.Script.setTimeoutかぁ、あとで探ってみよう(あとでと書くとやらないパターンが多いけど(ぉぃぉぃ))

VBA初心者VBA初心者 2016/04/30 18:00 Document.Script.setTimeoutからsendkeysのEnterが効かないconfirmでずっと迷っていたのですが、この方法なら問題なく動きました。ありがとうございます。
Call objIE.document.body.appendChild(ele)で何を呼び出しているのかは分からず呪文のままですが・・・

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証





[記事一覧、バックナンバーを見る]








ブログトップ 記事一覧 ログイン 無料ブログ開設