[[20130521114840]] 『VBAでIE操作』(あや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでIE操作』(あや)

 Excel2003 XP IE9

 この掲示板で教えて頂き、進めている操作について質問です
 過去の書き込み [[20130516115449]] 『VBAでIE操作』(あや)

 おかげさまで必要な画面まで進めることができました。
 次に出てきた問題で質問なのですが、よろしくおねがいします。

 必要な画面まで開いて
 その画面にあるボタン(別ウィンドウが開くデータ出力ボタン)を押すと
 IEのメッセージボックスが出てOKかキャンセルを求められます。
 「データを出力しますか?OK キャンセル」という

 OKにフォーカスがあるので
 Sendkeysを試してみましたが、メッセージボックスにフォーカスがあたって
 Sendkeysまで進まず、画面が止まります。

 調べていて、ボタンをJavascriptに押させると回避できるとの書き込みがあり
 試しております。
 ヤフーの知恵袋です。
 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1038318735

 この記述のしていることを理解しようとしているのですが、
 わからないのでお知恵をお貸し下さい。

 10行目の
 Set tagInput(i) … は
 インプットタグをtagInput変数に格納
 インプットタグの文字数が取れている?

 12行目の
 For i=0 To tagInput… は
 インプットタグの文字数分 ループをまわす?

 15行目の
 … ('Input')("&i&").Click … は
 該当のインプットタグになったらクリックする?

 自分がわかってないと思う部分を書き出してみました。
 なんのために、なにをしているのか読み取れないため、
 自分のコードに追加できずにいます。
 ひどい質問ですみませんが
 なにか助言いただけると助かります。

 OKが押せればよいので別の方法でもOKです。
 理解が出来て自分で使いこなせれば…^^;

  文字数ではなく、ページ中にある<INPUT ....> がオブジェクトの配列として
  tagInput に入ります。

 tagInput.Length は見つかったタグの個数で、インデックスが 0 起算なので-1 まで
 ループしています。

 タグの表示文字列は tagInput(i).Value なので、表示文字列が押したいものになるまで
 全体を検索して、見つかったらクリックしているでしょうか。
 15行目の解釈は正しいと思います。
 (Mook)


 Mookさん ありがとうございます。
 デバッグ結果から曖昧な知識で予想したつもりになって
 もやもやしてましたが回答頂いたおかげで少し進めそうです。

 自分のVBAに合わせて(今まで書いてきたルーチンと似たように)書き換えて動かしてみました。
 ☆の部分でクリックさせているつもりなのですが、画面の反応がありません。
 どこを間違えてるのでしょうか?

   s=1
    For Each Obj In ObjIE.Document.getElementsByTagName("input")
        If Obj.Name = "ボタンの名前" Then               
    ☆      ObjIE.Document.Script.setTimeout "javascript:Document.getElementsByTagName('input')(" & s & ").click()", 500
              SendKeys "{ENTER}"

              Exit For
        End If
        s = s + 1
    Next

 (clickしたい時点の s には35が入っています)

 ちなみに以下の記述ですと、問題なくボタンがクリックできています(しかし次のメッセージボックスのOKが押せない)

    For Each Obj In ObjIE.Document.getElementsByTagName("input")
        If Obj.Name = "ボタンの名前" Then

            Obj.Click

            Exit For
        End If
    Next

 (あや)

 > tagInput.Length は見つかったタグの個数で、インデックスが 0 起算なので

   0からですよ。
   ↓
  s=1

 あと元ネタにあった「適当な時間待ちループ」が見当たらないですけど、大丈夫ですか?
 ※すぐSendKeys "{ENTER}"に行っているように見受けられます。
  JavaScriptにクリックさせた後、ダイアログが出てくるまで待つ必要があります。

 (半平太) 2013/05/21(Tue) 15:57

 半平太さん ありがとうございます
 s=0にしてみました。

 しかし、残念ながら画面は変わりませんでした。

 Call sWait(Obj)はつかわさせて頂いております。
 今回は、IEのメッセージボックスが出ていないといったSendkeys以前の問題なので
 書かなくてもよいかな?と、
 動きがついてきていないと判断できたならそのとき追加すればよいかな?と思っておりました次第です。

 アドバイスを頂いたように
 ファイル出力を押した(つもりの)後 待ってみる で確認をしてみました
 しかし、残念ながら画面は変わらず、☆のEndまで走っていました。

         s = 0
         For Each Obj In ObjIE.Document.getElementsByTagName("input")
             If Obj.Name = "ボタンの名前" Then

                 ObjIE.Document.Script.setTimeout "javascript:document.frames(1).Document.getElementsByTagName('input')(" & s & ").click()", 500

                 Call sWait(Obj)

                 Exit For
             End If
             s = s + 1
         Next

 ☆        MsgBox "End"

 押せていたら、「出力しますか?」メッセージボックスが出るはずなのです…
 以下の感じでも、ダメでした。
        s = 0
        For Each Obj In ObjIE.Document.getElementsByTagName("input")
            If Obj.Name = "ボタンの名前" Then

                ObjIE.Document.Script.setTimeout "javascript:document.frames(1).Document.getElementsByTagName('input')(" & s & ").click()", 500

                Call sWait(Obj)
                Call sWait(Obj)

                SendKeys "{ENTER}"

                Exit For
            End If
            s = s + 1
        Next

 また何かありましたら教えてください。
 (あや)

 >ObjIE.Document.Script.setTimeout "javascript:document.frames(1).Document.getElementsByTagName('input')(" & s & ").click()", 500
                                ↑
                               ここは元ネタに書いてあった記述と全く同じですけど、実際のページの作りと合致していますか?

 (半平太) 2013/05/21(Tue) 16:28

 半平太さん ありがとうございます。

 フレーム番号を付けた場合と外した場合での
 確認をしていましたが
 どちらも結果は同じでした…

 すみません、書き込みは統一すべきでした。

 (あや)

 >For Each Obj In ObjIE.Document.getElementsByTagName("input")
      ↑
 あれ? これでいままで操作できていたのですよね?
 でしたら、Framesなんてないから、こうじゃないですか?(そんなに自信はないですけど・・)
                  ↓
 ObjIE.Document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & s & ").click()", 500

 これもやってみたのでしょうか?

 (半平太) 2013/05/21(Tue) 16:38

 半平太さん なんどもありがとうございます。

 >For Each Obj In ObjIE.Document.getElementsByTagName("input")
      ↑
 あれ? これでいままで操作できていたのですよね?

 はい、出来ています。

 ObjIE.Document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & s & ").click()", 500
 で試してだめだったので、

 無意味かもしれませんが、何か動きがあればと思い…
 document.frames(0)としてフレーム番号0で入れてみたり、
 1にしたりして試していました。

 それで、最終1にしていた記述を掲示板に貼り付けていました。

 (結果はだめでしたが…)

 ややこしくてすみません。

 (あや)

 当方で簡単な環境を作ってテストしてみましたところ、

 > ObjIE.Document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & s & ").click()", 500
 > で試してだめだったので、

 そのjavascriptはワークしました。従って、ダイアログは出ました。

 ただ、そのダイアログがアクティブになって来ないので、Sendkeysがワークしませんでした。

 そこで、強制的に(?)にブラウザーを最前面に持って来るようにしたところ、当方環境では「Enter」も問題なく作動しました。

 サンプルコード

 Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
 --------------------
 Sub xx ()
      :
      :
         s = 0

         For Each obj In objIE.Document.getElementsByTagName("input")
           If obj.Name = "ボタンの名前" Then
              SetForegroundWindow (objIE.hwnd)  ’最前面に持って来る
                objIE.Document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & s & ").click()", 500
                  Sleep 1000
                  SendKeys "{Enter}"
         Exit for
           End If
           s = s + 1
        Next
 End Sub

 (半平太) 2013/05/21(Tue) 20:58

 半平太さん ご丁寧にありがとうございます。

 このjavascriptは問題なく動いているのですね。

 javascriptもhtmlも慣れてなくてそこの問題だと思って
 質問させてもらっていましたが…

 javascriptの問題ではなさそうなことを教えてもらって
 次に試したのは

 ボタンだけ作ったページを開いて
 objIE.Document.Script.setTimeout "javascript:document. getElementsByTagName('input')(" & s & ").click()", 500
 を動かしてみたところ

 IEの左下にある ステータスバーにエラーが表示されており、
 詳細を確認すると「'Document'は宣言されていません。」と出ました。
 そのエラー画面にあった
 「今後エラーの表示をさせる」にチェックを付けて

 システムの環境で
 objIE.Document.Script.setTimeout "javascript:document. getElementsByTagName('input')(" & s & ").click()", 500
 を動かしてみたところ

 同じエラーが出ました。
 このエラーでメッセージボックスが出ていないようです。

 システム動作環境のIE9では、
 メニューバーやステータスバーが表示されておらず
 確認が遅れました。

 ひとまず状況は確認できました。
 ありがとうございました。

 さて、どうしようか調べてまた悩みます。
 なにかありましたら教えてください。

 (あや)

         関係ないかも知れませんが、ここのdをDで始めると当方の環境では動きません。(つまり、Document.・・・ではワークしなかった)
                         ↓ 
 > objIE.Document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & s & ").click();", 500

 (半平太) 2013/05/22(Wed) 12:01

 半平太さん ありがとうございます

 小文字 dにて動きました^^;
 javascript特有のものなのでしょうかね…

 お時間頂きありがとうございました。

 進めてみてまた質問が出てきました。
 状況を整理して調べなおして
 新しく質問させてもらいます。

 (あや)

 VBA(VB) は変数、関数名で大文字小文字を識別しませんが、JavaScript では大文字小文字を
 別のものとして扱います。
 これは 言語による仕様なので気をつけたほうがいいですね。
 どちらかというと大文字小文字を同一視するほうが少数派なので、VBA であっても適切に
 表記するようにしておいたほうがよいと思います。

 getElementsByTagName なども VBA では大文字小文字は適当で動きますが、JavaScript だと
 まったくこの通りでなければエラーになります。
 (Mook)

 Mookさん ありがとうございます
 >JavaScript では大文字小文字を
 別のものとして扱います。

 そうでしたか。

 Webの掲示板からコピペが出来ない環境でして、
 手打ち対応かVBAのコマンドをコピーしていたので、
 大文字にしてました。

 ずいぶん前のことなのですが、
 マイナーな言語で古いシステムをさわっていたときは
 記述の後のスペースがあるかないかでエラーが出たりしてたんで
 それを思い出しました^^;

 勉強になります。

 (あや)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.