Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3877 / 13646 ツリー ←次へ | 前へ→

【59038】IE操作中のポップアップの処理 あつし 08/11/24(月) 15:26 質問[未読]
【59039】Re:IE操作中のポップアップの処理 かみちゃん 08/11/24(月) 15:39 発言[未読]
【59053】Re:IE操作中のポップアップの処理 あつし 08/11/25(火) 0:05 発言[未読]
【59054】Re:IE操作中のポップアップの処理 ichinose 08/11/25(火) 5:51 発言[未読]
【59055】Re:IE操作中のポップアップの処理 あつし 08/11/25(火) 9:51 発言[未読]
【59062】Re:IE操作中のポップアップの処理 ichinose 08/11/25(火) 20:46 発言[未読]
【59069】Re:IE操作中のポップアップの処理 あつし 08/11/26(水) 13:49 発言[未読]
【59199】Re:IE操作中のポップアップの処理 あつし 08/12/2(火) 10:30 発言[未読]
【59243】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/3(水) 12:06 発言[未読]
【59258】Re:IE操作中のポップアップの処理 あつし 08/12/3(水) 21:55 発言[未読]
【59276】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/4(木) 12:02 発言[未読]
【59298】Re:IE操作中のポップアップの処理 あつし 08/12/5(金) 11:43 発言[未読]
【59307】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/5(金) 15:37 発言[未読]
【59308】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/5(金) 17:08 発言[未読]
【59323】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/6(土) 12:29 発言[未読]
【59326】Re:IE操作中のポップアップの処理 熊谷隆史 08/12/6(土) 13:25 発言[未読]
【59379】Re:IE操作中のポップアップの処理 あつし 08/12/9(火) 10:33 発言[未読]
【59646】Re:IE操作中のポップアップの処理 あつし 08/12/28(日) 1:25 お礼[未読]
【59724】Re:IE操作中のポップアップの処理 熊谷隆史 09/1/4(日) 10:48 発言[未読]
【59732】Re:IE操作中のポップアップの処理 あつし 09/1/5(月) 10:45 お礼[未読]
【59741】Re:IE操作中のポップアップの処理 熊谷隆史 09/1/6(火) 12:06 発言[未読]
【59057】Re:IE操作中のポップアップの処理 かみちゃん 08/11/25(火) 12:56 発言[未読]
【59067】Re:IE操作中のポップアップの処理 あつし 08/11/26(水) 13:04 発言[未読]
【59076】Re:IE操作中のポップアップの処理 かみちゃん 08/11/26(水) 21:14 発言[未読]
【59096】Re:IE操作中のポップアップの処理 あつし 08/11/28(金) 12:16 発言[未読]
【59251】Re:IE操作中のポップアップの処理 Raiku 08/12/3(水) 19:43 発言[未読]

【59038】IE操作中のポップアップの処理
質問  あつし  - 08/11/24(月) 15:26 -

引用なし
パスワード
   InternetExplorer6(以降IE)をVBAで操作するプログラムを組んでいるのですが、IE上のボタンをクリックさせると自動でポップアップ(メッセージボックス?)が表示され、"OK"か"キャンセル"の選択を促してきます。
このポップアップの"OK"ボタンを自動でクリックさせるにはどうすれば良いのでしょうか?
過去ログを調べたところ〔25400〕に同じような問いを見つけたのですが、自分には理解できず、とりあえず形だけ真似てみましたが、うまく動作できませんでした。
何か他に良い方法は無いでしょうか?
または、上記の解決の手法を解説しているようなHPなどありましたら、紹介していただきたいのですが、宜しくお願いいたします。

【59039】Re:IE操作中のポップアップの処理
発言  かみちゃん E-MAIL  - 08/11/24(月) 15:39 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> InternetExplorer6(以降IE)をVBAで操作するプログラムを組んでいるのですが、> IE上のボタンをクリックさせると自動でポップアップ(メッセージボックス?)> が表示され、"OK"か"キャンセル"の選択を促してきます。
>このポップアップの"OK"ボタンを自動でクリックさせるにはどうすれば良いのでしょうか?

私は詳しくないので、よくわかりませんが、
具体的なURLを出されたほうが回答が付きやすいと思います。
また、URLを出しにくいのであれば、そのような動作をするページを探してきて
示してみるというのもひとつの方法かと思います。

なお、参考にされた過去ログは、以下のものですね。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=25400;id=excel
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=25368;id=excel

【59053】Re:IE操作中のポップアップの処理
発言  あつし  - 08/11/25(火) 0:05 -

引用なし
パスワード
   こんばんは、あつしです。
早速の応答ありがとうございます。

>私は詳しくないので、よくわかりませんが、
>具体的なURLを出されたほうが回答が付きやすいと思います。

操作したいページは、中央競馬のIPATの投票ページです。
全体的な流れは、IPATのオッズ情報をDLし、そのオッズ情報から買い目を計算して、投票するという作業を全て自動化するプログラムを作っています。

基本的には、吉田章太郎著〔DIY競馬プログラミングIPAT DLL編〕を参考にし、ところどころでこちらの質問箱などを利用させてもらいプログラムしてきました。
先日までは特に問題が無かったのですが、この間IPATが少し変更を受けたようで、今まで、前書に付属のIPAT DLLを利用していた部分(主に投票の部分)が作動しなくなってしまいました。

ちなみに肝心の投票ボタンは次のように記述されていて、
 <TD><INPUT class=wide120 type=submit value="投  票"></TD>

次のようにプログラムを組みました。
 Dim objIE As Object
 Dim objItem As Object

 For Each objItem In objIE.Document.all
  If objItem.tagname = "INPUT" Then
   If objItem.Value = "投  票" Then
     objItem.Click
     Exit For
   End If
  End If
 Next

おそらくもっと簡単な記述があると思いますが、submitを使ったりして書いたソースが上手くいかなかったので、ちょっとくどいような上記のソースになりました。

自分なりに考えるに、過去ログ〔25400〕にあった解決方法が上手くいかなかったのは、
Public WithEvents objDOC As HTMLDocument 
と、先方は、HTMLDcument を使っているのに対し、自分は
Object を使っていてこの部分が一致しないからなのかな?なんて思っています。

しかし、As HTMLDocumentの部分はAs Objectに変更出来ないようですし、
今までAs Object としていた部分を変えるにも、他に何を変えればいいのか皆目検討も付きません。ためしに As 〜の部分だけ変えてもやはり駄目でした。

今まで、学校などでVBやVBAを基礎から勉強したことも無く、先に出た本や、この質問箱などで、必要に迫られて必要な部分だけを勉強してきたので、ネットで WithEvents を調べても、やれクラスモジュールがどうだの、訳のわからないことばかりで、全く調べ切れませんでした。

完全な解決策でなくても、過去ログ〔25400〕にあった解決方法が理解するのに手助けになるようなHPなどありましたら、ぜひ教えてください。宜しくお願いします。

>なお、参考にされた過去ログは、以下のものですね。
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=25400;id=excel
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=25368;id=excel
〔25368〕のほうは見ていませんでした。

【59054】Re:IE操作中のポップアップの処理
発言  ichinose  - 08/11/25(火) 5:51 -

引用なし
パスワード
   おはようございます。

この手のコードは、参照するURLが提示されないと
こちら側で確認ができないのではっきりしたことは 言えませんが・・・。


>自分なりに考えるに、過去ログ〔25400〕にあった解決方法が上手くいかなかったのは、
>Public WithEvents objDOC As HTMLDocument 
>と、先方は、HTMLDcument を使っているのに対し、自分は
>Object を使っていてこの部分が一致しないからなのかな?なんて思っています。
>
>しかし、As HTMLDocumentの部分はAs Objectに変更出来ないようですし、

リンク先にも投稿はしてありますが、

>参照設定で
>「Microsoft HTML Object Library」をチェックしてください
 
これをしないと

HTMLDocumentの参照はできませんし、イベントプロシジャーの記述も
意味を持ちません。

まずは、「参照設定」することを実現してみてください

 
以前にもどっかで投稿しましたが、


対象となるサイトがご自分の管理下のサイトなら、良いですが、

そうでない場合は、この手のコードはメンテが大変ですよ!!

最近は、公共的なサイトは定期的に内容を変えている場合もありますから・・・。

【59055】Re:IE操作中のポップアップの処理
発言  あつし  - 08/11/25(火) 9:51 -

引用なし
パスワード
   こんにちは、あつしです。

>リンク先にも投稿はしてありますが、
>>参照設定で
>>「Microsoft HTML Object Library」をチェックしてください

はい、こちらのチェックも、もちろん入れました。

>最近は、公共的なサイトは定期的に内容を変えている場合もありますら・・・。

何で定期的に内容を変えるんですかね?追っかけるのが大変です。

ところで、このようなところで いろいろとアドバイスをして頂ける人たちは、皆さんどうやって勉強してるんですか?非常に興味があります。

【59057】Re:IE操作中のポップアップの処理
発言  かみちゃん E-MAIL  - 08/11/25(火) 12:56 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>私は詳しくないので、よくわかりませんが、
>>具体的なURLを出されたほうが回答が付きやすいと思います。
>
>操作したいページは、中央競馬のIPATの投票ページです。
>全体的な流れは、IPATのオッズ情報をDLし、そのオッズ情報から買い目を計算して、
>投票するという作業を全て自動化するプログラムを作っています。

JRAのIPAT投票関連であれば、過去ログとしては、以下のような感じですね。
(ご覧になっているかもしれませんが)
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=36113;id=excel
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=50744;id=excel
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=50752;id=excel

私は、オッズ情報の取り込みはしていますが、買い目の算出などは、算定ロジックが
思いつかないので、取り組めていません。
また、投票に関しては、誤投票の危険もあるので、完全自動化は、取り組むつもりは
今のところないような状態です。

ただ、IPATページの構成は、ある程度わかっているつもりではありますが、
先日のIPAT投票ページのリニューアルで確かに、変わっている部分もあるようですね。
吉田章太郎さんのHP
http://www.yannies.com/
にもいろいろと情報が出ていると思います。

独自の買い目算定をするためフリーソフトなどでは物足りないなら、私なら、
必要なデータ収集をして、買い目算定の基礎データとして、買い目が算定できれば
投票部分は、フリーソフトを使うようにします。
(まぁ、ここは、投票に関するロジックの知識がないのと、誤投票を恐れていると
いう点があるからなのですが・・・)

なお、IPAT投票のページは、中央競馬開催日(原則として、土曜日・日曜日)しか
内容が見れません。

【59062】Re:IE操作中のポップアップの処理
発言  ichinose  - 08/11/25(火) 20:46 -

引用なし
パスワード
   こんばんは。

>>リンク先にも投稿はしてありますが、
>>>参照設定で
>>>「Microsoft HTML Object Library」をチェックしてください
>
>はい、こちらのチェックも、もちろん入れました。

ならば・・・、

Thisworkbookのモジュールに

'==============================================
Option Explicit
Public WithEvents docu As HTMLDocument
Private Sub docu_ondeactivate()
   CreateObject("WScript.Shell").SendKeys "{ENTER}"
End Sub


標準モジュールにあつしさんが投稿されたコードを変更して・・・、


Sub sample()
  Dim objIE As Object
  Dim objItem As Object
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
    .Visible = true
    .navigate "HTTP://ここに本来のurl"
    Do While .Busy = True Or .readyState <> 4
     Loop
' ↑ここは、想像です
    Set ThisWorkbook.docu = .document
    For Each objItem In ThisWorkbook.docu.all
     If objItem.tagName = "INPUT" Then
       If objItem.Value = "投  票" Then
        objItem.Click
        Exit For
        End If
       End If
     Next
    End With
End Sub


これでHtmldocumentのエラーが発生しますか?


>>最近は、公共的なサイトは定期的に内容を変えている場合もありますら・・・。
>
>何で定期的に内容を変えるんですかね?追っかけるのが大変です。
そりゃあ、自動化出来れば、悪用も出来ますからねえ!!
それを防ぐためではないですか??

【59067】Re:IE操作中のポップアップの処理
発言  あつし  - 08/11/26(水) 13:04 -

引用なし
パスワード
   こんにちは、あつしです。

>吉田章太郎さんのHP
>http://www.yannies.com/
>にもいろいろと情報が出ていると思います。

今までは、上記HPで、変更に対してサポートがあったのですが、本の出版元の倒産に伴い サポート終了のようです。


>投票部分は、フリーソフトを使うようにします。

なるほど、そうゆう手もありますか。
でも、今度はEXCELで算出した買目を そのソフトに渡すところでつまづきそうですね。
また、この先自動で立ち上がるポップアップの処理が必要になることもあると思うので、出来れば今ここで解決したいです。


>なお、IPAT投票のページは、中央競馬開催日(原則として、土曜日・日曜日)しか
>内容が見れません。

そうなんですよね。だから、土日の開催時間中しか、実験できないのが厳しいです。

【59069】Re:IE操作中のポップアップの処理
発言  あつし  - 08/11/26(水) 13:49 -

引用なし
パスワード
   こんにちは、あつしです。

丁寧なアドバイスありがとうございます。

>Set ThisWorkbook.docu = .document

の部分、実は一度試してみたのですが、そのときは確かエラーになったような気がします。
ただし、そのときはクリックに当たる部分がサブルーチンになっていて、そのサブルーチンに入る前に記述していたので、今度はサブルーチンの中に記述して見ます。
それでもだめなら、サブルーチンを展開して、アドバイスいただいたように記述して試して見ます。


余談ですが、

>>何で定期的に内容を変えるんですかね?追っかけるのが大変です。
> そりゃあ、自動化出来れば、悪用も出来ますからねえ!!
> それを防ぐためではないですか??

自分にはその悪用のアイデアすら思いつきません。
世の中、色々なことを考える人がいるのですね。

【59076】Re:IE操作中のポップアップの処理
発言  かみちゃん E-MAIL  - 08/11/26(水) 21:14 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>吉田章太郎さんのHP
>>http://www.yannies.com/
>>にもいろいろと情報が出ていると思います。
>
>今までは、上記HPで、変更に対してサポートがあったのですが、本の出版元の倒産に伴い サポート終了のようです。

言葉尻の問題かもしれませんし、確認したわけでもないのですが、
サポート終了は、「書籍のサポート」ということではないのでしょうか?
http://www.yannies.com/book/

以下のような掲示板などで、一度サポート状況を問い合わせされてはいかがでしょうか?
http://www.simplepat.com/support/index.php?bbs

>>投票部分は、フリーソフトを使うようにします。
>
>なるほど、そうゆう手もありますか。
>でも、今度はEXCELで算出した買目を そのソフトに渡すところでつまづきそうですね。
>また、この先自動で立ち上がるポップアップの処理が必要になることもあると思うので、出来れば今ここで解決したいです。

中央競馬のIPAT投票という観点で、私はコメントを書かせていただいています。
投票を除いては、情報の取得くらいであれば、11/8に実施されたIPAT仕様変更後
も問題なく動作しています。

なお、Excelで算出した買い目を、外部ソフトに渡す方法は私は知りません。
あくまで、手作業で投票をしています。
このあたりは、安全性と投票の楽しみといったところだと考えています。

IPAT-IDも持っていて、普段、オッズを取得し、資金に余裕があれば、たまに投票
をするので、何かお役に立てるかな?と思ったのですが、あくまで自動投票に関し
ての解決を望まれているようですので、私はお役に立てそうにありませんね。

また、ここで解決をしたいということですが、サイト側の立場からすると対応策を
公開しにくい場合もあるかもしれませんね。

【59096】Re:IE操作中のポップアップの処理
発言  あつし  - 08/11/28(金) 12:16 -

引用なし
パスワード
   こんにちは、あつしです。


>言葉尻の問題かもしれませんし、確認したわけでもないのですが、
>サポート終了は、「書籍のサポート」ということではないのでしょうか?
>http://www.yannies.com/book/

はい、確かにその通りです。


>以下のような掲示板などで、一度サポート状況を問い合わせされてはいかがでしょうか?
>http://www.simplepat.com/support/index.php?bbs

なるほど、そう言うことですね。
で、ちょっと時間が無いのできちんと見ていないのですが、こちらのソフトはヴァージョンアップで対応しているので、ユーザーサイドに対応のアドバイスは受けられそうに無い気がします。既にニューヴァージョンが出ているようです。

とは言え、こちらのソフトを利用すればEXCELで自作したソフトと連携させて自動投票させることは出来そうですね。(有料ですけど)


>あくまで、手作業で投票をしています。
>このあたりは、安全性と投票の楽しみといったところだと考えています。

心情的には自分も安全の面から手作業が好みなのですが、土日には競馬のための時間をほとんど取ることが出来ません。今まで、IPAT上での実験も、合間を使っての実験しか出来ないので、今回のようにいったん利用が出来なくなるとじっくり変更を検討する時間が取れずに、本当に困ってしまいます。


>IPAT-IDも持っていて、普段、オッズを取得し、資金に余裕があれば、たまに投票
>をするので、何かお役に立てるかな?と思ったのですが、あくまで自動投票に関し
>ての解決を望まれているようですので、私はお役に立てそうにありませんね。

いろいろと助言いただきありがとうございました。


>また、ここで解決をしたいということですが、サイト側の立場からすると対応策を
>公開しにくい場合もあるかもしれませんね。

そうですね。悪用を防止するための定期的な変更だとすると、確かに不適切なのかも知れませんね。
しかし、IEを操作する際、自動で立ち上がるポップアップの処理というのは、それほど特殊なものではないと思いますので、解決できるとうれしいです。

とりあえずichinoseさんの手法を今週末試してみます。

【59199】Re:IE操作中のポップアップの処理
発言  あつし  - 08/12/2(火) 10:30 -

引用なし
パスワード
   こんにちは、あつしです。

週末教わったコードを早速試してみました。
結論から言うと、上手く作動しませんでした。

なぜか、動作が安定せず、
そのまま、何もなかったようにただポップアップが立ち上がったところで止まり、
手動で OK か キャンセル ボタンを押すと、またそのまま動作が進む場合と、

Set ThisWorkbook.docu = .document
のところで、エラーが出て止まる場合がありました。

ちなみにエラーは、
 実行時エラー '462':
 リモートサーバーがないか、使用できる状態ではありません。
でした。

またごくたまにですが
 実行時エラー '-2147417848 (80010108)':
 オートメーション エラーです。
 起動されたオブジェクトはクライアントから切断されました。
のようなエラーも出ることがありました。

前に質問されていた方は、この方法で上手く作動したとのことなので、
何か、特別な処理が施されているのでしょうか??

とりあえず、結果報告でした。

【59243】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/3(水) 12:06 -

引用なし
パスワード
   ▼あつし さん:
基本的にはメッセージダイアログを出さない方向で
考えるのですが、ご自身が示されてるように
閉じる方法も幾つか存在します。

お手軽なのはベクター辺りで「Auto Clicker」等のツールを
使うことでしょうか。
(他言語で自分で作ってもいいでしょうけど)

ただ、ダイアログのウィンドウタイトルとボタンのキャプションしか、
判別しないと思うので常駐させておくなら、勝手に閉じられない様に注意が必要ですね。
http://www.vector.co.jp/soft/win95/util/se365870.html

参考)
http://q.hatena.ne.jp/1174026115
http://scripting.cocolog-nifty.com/blog/2008/01/excel_9346.html
VBAだと、フックはやや難あり。
http://msdn.microsoft.com/en-us/library/ms696160(VS.85).aspx

【59251】Re:IE操作中のポップアップの処理
発言  Raiku  - 08/12/3(水) 19:43 -

引用なし
パスワード
   これって、あ

【59258】Re:IE操作中のポップアップの処理
発言  あつし  - 08/12/3(水) 21:55 -

引用なし
パスワード
   熊谷隆史 さん こんばんは、あつしです。

>基本的にはメッセージダイアログを出さない方向で
>考えるのですが、ご自身が示されてるように
>閉じる方法も幾つか存在します。

最初から、メッセージを出さなくてすむ方法があれば、そちらの方が良いのですが、
たまたま、過去に閉じる方法のレスがあったもので、そうするのが正攻法と思っていただけです。


>お手軽なのはベクター辺りで「Auto Clicker」等のツールを
>使うことでしょうか。

おーっ!こんなソフトもあるのですね。

>ただ、ダイアログのウィンドウタイトルとボタンのキャプションしか、
>判別しないと思うので常駐させておくなら、勝手に閉じられない様に注意が必要ですね。

確かに、思わぬ動作をしたら怖いですね。
でも、最後の逃げ道として、チェックさせていただきます。


他にもいろいろと参考になりそうなHPをご紹介いただきありがとうございます。
ちょっと見てみましたが、今の自分には 敷居が高く???でした。
これからじっくり時間をかけて、解読してみたいと思います。

【59276】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/4(木) 12:02 -

引用なし
パスワード
   ▼あつし さん:
' ページの表示待ちの後。
'これでクリックされるかは分かりませんが。
objIE.Document.Script.setTimeout "javascript:document.all.item("投  票").click()",1000
SendKeys "{Enter}"


↑ので上手く行かなければ。
ーーー
  Dim i As Long
  For Each objItem In objIE.document.all
    If objItem.tagName = "INPUT" Then
      If objItem.Value = "投  票" Then
        'objItem.Click
        Debug.Print i
      End If
    End If
    i = i + 1
  Next
ーーー


objIE.Document.Script.setTimeout "javascript:document.all.item(↑のコードで得られたiの数を指定).click()",1000
SendKeys "{Enter}"


後はページの表示の待ち方が足りないです。
参考)
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200503/05030028.txt


> SendKeys "{Enter}"

確実に行いたいなら、SendKeysでなくて
GetLastActivePopup API、PostMessage APIで。

Option Explicit
'モジュールレベルで宣言。
Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hWnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

--- 中略 ---
  Dim hDlg As Long
  'ダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup( objIE.hwnd )
  Loop Until hDlg <> objIE.hwnd

  'ダイアログのはいボタン押下
  PostMessage hDlg, WM_COMMAND, vbYes, 0

【59298】Re:IE操作中のポップアップの処理
発言  あつし  - 08/12/5(金) 11:43 -

引用なし
パスワード
   熊谷隆史 さん、こんにちは。あつしです。

詳細なアドバイスありがとうございます。


>objIE.Document.Script.setTimeout "javascript:document.all.item("投  票").click()",1000
>SendKeys "{Enter}"

この命令の意味は、
「1秒後に投票ボタンを押す。」
「Enterキーをアクティヴなウィンドウに送る。」
といった意味ですか?
だとすると、このようにする意味が良くわからないのですが?
それとも、
「投票ボタンを押した一秒後に Enterキーをアクティヴなウィンドウに送る。」
という意味ですか?
setTimeoutを調べてみたけどなんだかよくわかりませんでした。

でも、百聞は一見にしかず。
とりあえず、週末試してみます。


>> SendKeys "{Enter}"
>
>確実に行いたいなら、SendKeysでなくて
>GetLastActivePopup API、PostMessage APIで。
>
>Option Explicit
>'モジュールレベルで宣言。
>Private Declare Function GetLastActivePopup Lib "user32" _
>    (ByVal hwndOwnder As Long) As Long
>Private Declare Function PostMessage Lib "user32" _
>    Alias "PostMessageA" (ByVal hWnd As Long, _
>    ByVal Msg As Long, ByVal wParam As Long, _
>    ByVal lParam As Long) As Long
>Private Const WM_COMMAND = &H111
>
>--- 中略 ---
>  Dim hDlg As Long
>  'ダイアログのウィンドウハンドルを取得。
>  Do
>    DoEvents
>    hDlg = GetLastActivePopup( objIE.hwnd )
>  Loop Until hDlg <> objIE.hwnd
>
>  'ダイアログのはいボタン押下
>  PostMessage hDlg, WM_COMMAND, vbYes, 0

こちらは、それこそ僕には理解できないのですが、setTimeoutが上手くいかなければ試してみようと思います。
出来れば補足をお願いしたいのですが。

「--- 中略 ---」より上の部分を投票ボタンを押すプロシージャーのあるモジュールの一番上に書き、
「--- 中略 ---」下の部分を投票ボタンをクリックした後に書き込めばいいのですか?

細かいとこまですみませんが、宜しくお願いします。

【59307】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/5(金) 15:37 -

引用なし
パスワード
   > だとすると、このようにする意味が良くわからないのですが?
> http://q.hatena.ne.jp/1174026115
を読んで欲しいのですが。

> こちらは、それこそ僕には理解できないのですが、setTimeoutが上手くいかなければ試してみようと思います。
> 出来れば補足をお願いしたいのですが。
こんな感じです。

Option Explicit
Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hWnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Sub test()
  Dim hDlg As Long
  Dim objIE As Object
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
   .Visible = True
   .navigate ""
  End With

  Do
    DoEvents
  Loop While objIE.Busy

  Do
    DoEvents
  Loop While objIE.Document.ReadyState <> "complete"
  objIE.Document.Script.setTimeout "javascript:document.all.item(""投  票"").click()",1000

  
  'ダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup( objIE.hwnd )
  Loop Until hDlg <> objIE.hwnd

  'ダイアログのはいボタン押下
  PostMessage hDlg, WM_COMMAND, vbOK, 0

End Sub

【59308】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/5(金) 17:08 -

引用なし
パスワード
   ↓こんな感じの適当なhtmlファイル(C:\Temp\test.html)を作って、
<input type="button" name="投  票" value="いい加減、疲れた" onclick="confirm('ボーナスまだ?')">

VistaのIE7(XPのIE6なら無関係)だとアクティブコンテンツブロックとかで
ガードされるので、それを解除して、
http://www.mitsuba.co.uk/javascript.html
保護モードを有効にするのチェックも外す。


取り合えず、メッセージダイアログ(ウィンドウハンドルも取れる)の
OKボタン押下出来たのではないかと。
イベントだと、オブジェクトモジュールからで
ないといけないけど、これならその制限も無いってことで。

---
Option Explicit
Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hwnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111
 
Sub test()
  Dim hDlg As Long
  Dim objIE As Object
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
   .Visible = True
   .navigate "C:\Temp\test.html"
  End With

  Do
    DoEvents
  Loop While objIE.Busy

  Do
    DoEvents
  Loop While objIE.Document.ReadyState <> "complete"
  objIE.Document.Script.setTimeout "javascript:document.all.item(""投  票"").click()", 1000

  'ダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup(objIE.hwnd)
  Loop Until hDlg <> objIE.hwnd

  'ダイアログのOKボタン押下
  PostMessage hDlg, WM_COMMAND, vbOK, 0

End Sub

【59323】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/6(土) 12:29 -

引用なし
パスワード
   > objIE.Document.Script.setTimeout "javascript:document.all.item(""投  票"").click()",1000

name属性とValue属性を勘違いしてました。
これだと、上手く行かないですね。
まあ、後はご自身で試行錯誤されてください。
SendKeysだと、タイミングがシビアなので難しそうです。
当初の案は、こちらでも失敗しますね。
(イベント自体が呼ばれない)
では。

【59326】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 08/12/6(土) 13:25 -

引用なし
パスワード
   と思ったけど、まあ一応、書いておきます。
↑でヒントは書いたけど、誤って伝わっても何なので。

---
Option Explicit
Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hwnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Sub test()
  Dim hDlg As Long
  Dim objIE As Object
  Dim i As Long
  Dim obj As Object
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
   .Visible = True
   .navigate ""
  End With

  Do
    DoEvents
  Loop While objIE.Busy

  Do
    DoEvents
  Loop While objIE.Document.ReadyState <> "complete"

  For Each obj In objIE.Document.all
    If obj.tagName = "INPUT" Then
      If obj.Value = "投  票" Then
        Exit For
      End If
    End If
    i = i + 1
  Next
  objIE.Document.Script.setTimeout "javascript:document.all.item(" & i & ").click()", 1000

  'ダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup(objIE.hwnd)
  Loop Until hDlg <> objIE.hwnd
  
  'ダイアログのOKボタン押下
  PostMessage hDlg, WM_COMMAND, vbOK, 0

End Sub

【59379】Re:IE操作中のポップアップの処理
発言  あつし  - 08/12/9(火) 10:33 -

引用なし
パスワード
   熊谷隆史 さん こんにちは。あつしです。
土曜日にもアドバイスいただいていたのですね。気が付きませんでした。

で、遅くなりましたが、結果報告させていただきます。
結論からいうと、無事動作することが出来ました。ありがとうございました。

ただ、当初金曜までにもらった案そのままでは動作せず、
少し、修正したところ動くようになりました。
でも、動作しなかったときに、消し忘れていたIEのウィンドウがあったので、これが何らかの影響を与えていたのかも知れません。
時間の都合で、改めて確認することが出来なかったので、来週再度確認して報告したいと思います。

それから、OKキーを押した後、投票できたことを知らせるIEのウィンドウが開くのですが、VBAはそれを待たずに、すぐに次の命令を実行し始めてしまうので、これを表示が完了するまでとめる方法があれば教えていただけないでしょうか?
ちなみに、自分が試してみたのは次のようなものです。

  Dim oIE As Object
  Dim oSH As Object
  
  Set oSH = CreateObject("Shell.Application")
  
  For Each oIE In oSH.Windows
    While oIE.Busy Or oIE.readyState <> 4
     DoEvents
    Wend
  Next

では、週末再度確認して、報告いたします。

【59646】Re:IE操作中のポップアップの処理
お礼  あつし  - 08/12/28(日) 1:25 -

引用なし
パスワード
   熊谷隆史 さん,こんばんは。あつしです。
まず、報告が遅くなりましたことをお詫びします。
そして、数々の事細かなアドバイス、本当にありがとうございました。
熊谷さんのアドバイスにより、解決に至ることが出来ました。

で、報告ですが、やはり自分の環境(XP_Home & Excell_2003)では、熊谷さんのソースそのままでは思ったように動作してくれませんでした。
その理由は自分には全くの??なのですが、以下に自分の修正した点を報告させていただきます。
簡単に言えば熊谷さんの二案の組み合わせなのですが、

Option Explicit
Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hwnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Sub test()
  Dim hDlg As Long
  Dim objIE As Object
  Dim obj As Object
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
   .Visible = True
   .navigate ""
  End With

  While objIE.Busy or objIE.Document.ReadyState <> "complete"
    DoEvents
  Wend

  For Each obj In objIE.Document.all
    If obj.tagName = "INPUT" Then
      If obj.Value = "投  票" Then
        objIE.Document.Script.setTimeout "javascript:obj.click", 1000
        Sendkeys "{Enter}"
        Exit For
      End If
    End If
  Next

  'ダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup(objIE.hwnd)
  Loop Until hDlg <> objIE.hwnd
  
  'ダイアログのOKボタン押下
  PostMessage hDlg, WM_COMMAND, vbOK, 0

End Sub

以上のように Sendkeys と APIの併用で予定の動作を行うことが出来ました。
(実際には複数のプロシージャーに分けて書いた物を、ひとつにまとめてみました。)

問題は、[59379]でも書いたように
  Dim oIE As Object
  Dim oSH As Object
  
  Set oSH = CreateObject("Shell.Application")
  
  For Each oIE In oSH.Windows
    While oIE.Busy Or oIE.readyState <> 4
     DoEvents
    Wend
  Next
のようなコードを書いても、投票結果のIEウィンドウが表示される前に、次の命令を実行し始めることです。
ただ、こちらはSleep等の命令を使い、十分な間隔をあけることで何とか対処できるのでしばらくはその手で行こうと思います。
それで不具合が出るようでしたら、またこちらに相談させていただきたく思います。

今回は本当にありがとうございました。

【59724】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 09/1/4(日) 10:48 -

引用なし
パスワード
   ▼あつし さん:
ご報告、どうも。
何かあったらと言う事なので、その時にでもレスすれば
いいかなと思ってましたが。

> While objIE.Busy or objIE.Document.ReadyState <> "complete"
>     DoEvents
>   Wend

IEのBusyプロパティとDocumentプロパティを
合わせて判定しないでください。
定番の処理なのでGoogle検索すれば分かりますが
大抵、2つのループに分けてるはずです。

> objIE.Document.Script.setTimeout "javascript:obj.click", 1000

無効な構文なので、後続のSendKeysでクリックされてるのでしょうね。

【59326】で提示したコードは、こちらの検証不足でした。

【59199】でのエラーは、前者がページの読み込み待ちが
不十分なためで、後者はタイムアウトです。


> 問題は、[59379]でも書いたように

NewWindow2イベントでどうぞ。
では。

参考)
http://moug.net/faq/viewtopic.php?t=36575
http://msdn.microsoft.com/en-us/magazine/cc301671.aspx
http://www.ken3.org/vba/backno/vba163.html

【59732】Re:IE操作中のポップアップの処理
お礼  あつし  - 09/1/5(月) 10:45 -

引用なし
パスワード
   熊谷隆史 さん、こんにちは。あつしです。
年明け早々、アドバイスありがとうございます。

>> While objIE.Busy or objIE.Document.ReadyState <> "complete"
>>     DoEvents
>>   Wend
>
>IEのBusyプロパティとDocumentプロパティを
>合わせて判定しないでください。
>定番の処理なのでGoogle検索すれば分かりますが
>大抵、2つのループに分けてるはずです。

最初に勉強したときに、1つにまとめてあったので、そのまま1つにまとめて使用していました。
確かに、多くのHPでこの処理は二つに分けてありますね。
もう少し、注意を払うべきでした。


>> objIE.Document.Script.setTimeout "javascript:obj.click", 1000
>
>無効な構文なので、後続のSendKeysでクリックされてるのでしょうね。

ここを削除しても、確かにさどうしました。
自分がコードを全く理解せず使っていることがばれてしまいましたね。


>> 問題は、[59379]でも書いたように
>
>NewWindow2イベントでどうぞ。

今少し調べてみたのですが、やはり”イベント”とか出てくるとちんぷんかんぷんで、、、
そこで、少しばかりなぜ動かないのか考えてみました。
他のシュチュエーションでは、問題なく動くのに、なぜ、ここでは上手く作動しないのか?
で、思いついたのは、新しいウインドウが開き始める前に、
For Each oIE In oSH.Windows

Next
を抜けてしまっているのでは無いか?と。(正しいかどうかはわかりませんが。)
そこで、Sleepをこの前に置き、50ミリ秒ほど休ませて見ましたところ、無事動作することが出来ました。

実際にはSleepで休ませるのは的確な処理でないような気がするので。
URLを抜き出して、目的のURLが取得できなければ、最初からループさせるようなコードにしようと思います。


これにて、全ての疑問が解決されました。
熊谷さんをはじめ、アドバイスいただいた皆様に深く感謝いたします。
本当にありがとうございました。

【59741】Re:IE操作中のポップアップの処理
発言  熊谷隆史  - 09/1/6(火) 12:06 -

引用なし
パスワード
   ▼あつし さん:
参照設定の仕方は、調べてください。
乱暴な言い方をすれば標準モジュール以外が、オブジェクトモジュールです。
※ 本来はクラスモジュールを使うのですが、ベタに記述しています。

---
Option Explicit
'参照設定
'Microsoft HTML Object Library
'Microsoft Internet Controls
' オブジェクトモジュール

Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hwndOwnder As Long) As Long
Private Declare Function PostMessage Lib "user32" _
    Alias "PostMessageA" (ByVal hwnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Private WithEvents objIE As InternetExplorer
Private WithEvents objIE2nd As InternetExplorer
Private flgIE As Boolean
Private flgIE2nd As Boolean

Private Sub test()

  Dim hDlg As Long
  Dim i As Long
  Dim obj As MSHTML.HTMLInputElement
  Dim DOM As MSHTML.HTMLDocument
  Dim o As MSHTML.HTMLWindow2
  Dim timerID As Long

  flgIE = False
  flgIE2nd = False
  Set objIE = New InternetExplorer
  objIE.Visible = True
  objIE.Navigate "" ' ←実際のURLを指定。

  '最初のIEのDocumentCompleteイベント待ち
  Do
    DoEvents
  Loop Until flgIE = True
  Set DOM = objIE.Document

  For Each obj In DOM.getElementsByTagName("INPUT")
    If obj.Value = "投  票" Then
      Exit For
    End If
    i = i + 1
  Next
  Set o = DOM.Script
  timerID = o.setTimeout("jscript:document.getElementsByTagName('INPUT').item(" & i & ").click()", 1000, "VBScript")

  'メッセージダイアログのウィンドウハンドルを取得。
  Do
    DoEvents
    hDlg = GetLastActivePopup(objIE.hwnd)
  Loop Until hDlg <> objIE.hwnd
  o.clearTimeout timerID

  'メッセージダイアログのOKボタン押下
  PostMessage hDlg, WM_COMMAND, vbOK, 0

  'もう一つのIEのDocumentCompleteイベント待ち
  Do
    DoEvents
  Loop Until flgIE2nd = True

End Sub

Private Sub objIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  If pDisp Is objIE Then
    flgIE = True
  End If
End Sub

Private Sub objIE_OnQuit()
  Set objIE = Nothing
End Sub

Private Sub objIE_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Set objIE2nd = New InternetExplorer
  Set ppDisp = objIE2nd
End Sub

Private Sub objIE2nd_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  If pDisp Is objIE2nd Then
    flgIE2nd = True
  End If
End Sub

Private Sub objIE2nd_OnQuit()
  Set objIE2nd = Nothing
End Sub

3877 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free