いつもお世話になっております。
エクセルVBAでIE制御についてです。
環境はWIN7、IE 9or11とエクセル2010です。

あるページのリンクをクリックすると、
WEBからのメッセージというダイアログボックスが出てきて、
続行しますか? はい いいえ を聞かれます。

その「はい」をVBAで押したいのですが、
sendkeysメソッドで押そうとしてもうまくいきません。

以下に記載したサイトのOKボタンを押すと出てくるものです。
http://kamicha1.web.fc2.com/Excel/Test20090726.h …


以下が書いたコードです。


Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)


Sub test()

Dim ie As Object

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = True
ie.navigate "http://kamicha1.web.fc2.com/Excel/Test20090726.h …
      
Do While ie.Busy Or ie.readyState < 4
DoEvents
Loop

ie.document.getElementsByClassName("bt2")(0).Click '-ここで止まる

Sleep 2000

SendKeys "{Enter}"

End Sub

ステップ実行していくと、ここで止まると書いた所で、
IE上にダイアログは表示されるのですが、
それ以上ステップ実行ができなくなってしまいます。

ダイアログを自分でOKかキャンセルで消すと続きが動くようになります。
その間はVBEはビジー状態となり操作できません。

そのためそれ以降のsendkeysメソッドに
たどり着けない状況かと思われます。

いろいろ調べたところIE8以降はダイアログボックスは
IEから出ているのではなくOS?から出ているとの事でした。

上記のサイトはHTML本体にjavaスクリプトが記載されており、
それをVBAから操作すればどうにかOKボタンが押せるらしいのですが、
自分が操作したいページにはそれらしき記載がありませんでした。

対象のアンカータグは
<a herl=URL 中略 data-comfirm=続行しますか? >
のような感じで記載がありました。

完全に煮詰まっております。
自動でOKをクリックするかEnterキーでOKを押すでも構いません。
どうかご教授お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

この回答への補足

早速の回答ありがとうございます!

ie.Navigato2~を止まる前と、
後にそれぞれ入れてみました。
どっちもエラーは出ませんでしたが
ダイアログボックスは消えませんでした。

恐らく止まってしまうところの後に入れて、そこで止まらなければ動くんじゃないかと思われます…。

なぜダイアログボックスが出ると処理が止まってしまうのでしょうか。

補足日時:2014/11/26 13:20
    • good
    • 0
この回答へのお礼

ありがとうございます!
試行錯誤したらできました!!

Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long

Declare Function FindWindow Lib "User32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Const WM_COMMAND As Long = &H111&


Sub ie_CommandStateChange()

Dim hwnd As Long
Dim ie As InternetExplorer
Dim a As Long, b As Long
Dim objtag As Object
Dim i As Long

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = True
ie.Navigate "http://kamicha1.web.fc2.com/Excel/Test20090726.h …

Do While ie.Busy Or ie.readyState < 4
DoEvents
Loop

Set objtag = ie.document.getElementsByTagName("INPUT")
For i = 0 To objtag.Length - 1
If objtag(i).Value = "OK" Then

ie.document.Script.setTimeout "javascript:document.getElementById('popOK').click()", 200

Sleep 1000

hwnd = FindWindow("#32770", "Web ページからのメッセージ")

If hwnd <> 0 Then

Debug.Print hwnd, ie.hwnd

PostMessage hwnd, WM_COMMAND, vbOK, 0

End If

Exit For

End If
Next i
End Sub

お礼日時:2014/11/27 01:13
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qmixi上で、女子高生に『映画に一緒に行きませんか?』とメッセージを送

mixi上で、女子高生に『映画に一緒に行きませんか?』とメッセージを送るのは犯罪になりますか?

 なるんですか?

Aベストアンサー

相手の年齢にもよると思います。
定時制の高校に通学している70歳の女性も、れっきとした「女子高生」ですから。

QVBAのIE自動制御について

添付写真のように、URLリストがあります。
そのURLにアクセスして、横のセルにアクセスしたURLを入力したいです。

意図としてはそのURLが存在するかを確認したいためです。
ステータスコードでは区別がつかず・・・リストにあるURLとエラーページのURLが異なる為、
二つを比較すればそのURLが存在するか判断できると思いまして。。

教えてください。お願いします!

Aベストアンサー

#4でダメでしたので、まったく別な方法を試みていますが、やはりうまく行っていません。
お急ぎのところ大変に申し訳ありません。こちらは、もう手立てがほとんど見つかりませんので、どうもスルーして下さってかまいません。トライ&エラーにするにしても、時間がかかりすぎました。

もし、信頼できる所というと、「VBレスキュー花ちゃん」なら、良いかもしれません。
私の回答は、一般的な内容で。それ自体はそんなに問題ないはずなのに、中国系サイトでは失敗するようです。

×>Final URL を知る必要なんてないと思いますから、Invalid URL だけでよいかと思います。

これが間違いだったのです。Final URL を知るというプログラムですが、それを待つのに非常に手間が掛かりすぎます。インターネット検索で、この種のものもあるようです。ただ、中国向けではありません。

実際、IE を手で開いたようにマニュアル調で試みても、URLの供給が早すぎて、ぜんぶ同じようにダメになってしまいます。それと、気がついたのは、サーバーから返ってくるコード(ステータスバーに出る文字)が、特殊な文字コードのようで、それでエラーを起こすようでもあります。せめて漢字でも出れば分かりました。

なお、こちらは、開いている限りは、これからもその都度報告を入れさせていただきます。現在は、ObjIE から、イベントを取り、相手サイトからURLをリターンしてきた時に、エラーなどが返っていないか、また、URLが正しく返ってきているか調べるという方法です。

#4でダメでしたので、まったく別な方法を試みていますが、やはりうまく行っていません。
お急ぎのところ大変に申し訳ありません。こちらは、もう手立てがほとんど見つかりませんので、どうもスルーして下さってかまいません。トライ&エラーにするにしても、時間がかかりすぎました。

もし、信頼できる所というと、「VBレスキュー花ちゃん」なら、良いかもしれません。
私の回答は、一般的な内容で。それ自体はそんなに問題ないはずなのに、中国系サイトでは失敗するようです。

×>Final URL を知る必要なんてない...続きを読む

Q映画 バトルロワイヤルのメッセージ性

 わりと古い映画な気がしないでもないですがつい最近この映画を見ました。
 ちなみに他のメディアでは見てません。
 ところで本題ですがこの映画の伝えたかったものとはなんなのか皆さんの意見を聞きたいです。
 僕は現代の教育に対する批判に見えました。教師が生徒に手を出せない、暴力であると言ってクビになる、そんな状況を批判するものに見えました。
 調べて考察などを見ればただの殺し合いだとか戦争の悲惨さという意見がありました。
 果たしてどう捉えるのがいいか、はたまたどれでもないのかとても気になっています。
 よろしくお願いします。

Aベストアンサー

映画はみてませんが、ずいぶん前に原作の本を読みました。
原作を読んだ時に何かしら強いメッセージがあるとは私には思えなかったです。さらっとエンターテイメントとして読んで終わったという感じです。もしかしたら映画の方は、監督が原作から得たアイディアに自分のメッセージをこめて作ったのかもしれないですが。のちにアメリカの作家が設定をかえて同じコンセプトで本を書いて、映画にもなってヒットしていたので、このコンセプトは何かしら人を惹きつけるんでしょうね。

QIEのダウンロード通知バーVBA制御

下記URLを参考にUIAutomationClientを利用して通知バーを制御していますが、通知バーはでているのにボタン取得に失敗しやすいです。
また、分割の名前を付けて保存
http://okwave.jp/qa/q8121989.html
基本的にSetの箇所にDo while オブジェクト is nothingを入れて確実に取得できるようにしました。しかし、そうすると取得までに時間がかかる場合があります。時間短縮の方法をアドバイス頂きたいのがこの度の趣旨になります。

具体的にはダウンロード時に名前を付けて保存をしたいのですが、例えば保存バーがでているのにドロップボタンを押すまで時間がかかる。また、ドロップボタンは押せているのに名前を付けて保存をなかなかすぐに押してくれないといった感じです。またその後の保存ダイアログでも同様に、表示されているのになかなか押してくれないといった状況です。
やはり、オブジェクトの取得がうまくできていないためWhileでぐるぐると取得するのに時間を費やしているようでした。どのようにすれば時間短縮ができるかアドバイス頂けると助かります。回答でなくても、これやってみたら?みたいな感じでアドバイス頂けると助かります。
宜しくおねがいします。

下記URLを参考にUIAutomationClientを利用して通知バーを制御していますが、通知バーはでているのにボタン取得に失敗しやすいです。
また、分割の名前を付けて保存
http://okwave.jp/qa/q8121989.html
基本的にSetの箇所にDo while オブジェクト is nothingを入れて確実に取得できるようにしました。しかし、そうすると取得までに時間がかかる場合があります。時間短縮の方法をアドバイス頂きたいのがこの度の趣旨になります。

具体的にはダウンロード時に名前を付けて保存をしたいのですが、例えば保存バ...続きを読む

Aベストアンサー

IE制御に於いてループ中のDoEventsは遅延を招くそうで、Sleepに置き換えるとか。

(ネットワークタブでキャプチャすれば)
後は、F12Chooser.exeを制御してダイアログや通知バーが表示されるタイミングで、ファイルへのアドレスが分かるので、
(UI Automation辺りで)

XMLHTTPとADODB.Streamの組み合わせでダウンロードするとか、ぐらいですかね。

Q映画「メッセージ・イン・ア・ボトル」のテーマ曲

98年の夏にイギリスに1ヶ月滞在したときによく流れていました。日本に帰ってきてから映画の予告編か何かで聴いて、「あ、この曲!」と思ったのですが、タイトルもアーティストもわからないので、探すことができません。どなたか御存じの方がいたら教えて下さい。

Aベストアンサー

「メッセージ・イン・ア・ボトル」のサイト↓

http://message-bottle.warnerbros.com/cmp/trailer.html

で予告編(?)を見ることができるのですが、
予告編の後半部分で使われている女性ボーカルの曲は、
ナタリー・インブルーリア(Natalie Imbruglia)
の「トーン(Torn)」です。HoneyHoneyさんが書いておられるように、
この曲は1998年にイギリス(日本でも)でヒットしました。

CDショップのHMVのサイト↓

http://www.hmv.co.jp/product/detail.asp?sku=663954

でこの曲を試聴することができます。

参考URL:http://message-bottle.warnerbros.com/cmp/trailer.html,http://www.hmv.co.jp/product/detail.asp?sku=663954

QExcel VBAによるIEの制御に関して

Excel VBAで以下のようなフレーム構造を持つHTMLページを操作したいと考えています。
(実際はもっと複雑なページですが、簡略化して記載しています)

<HTML>
<HEAD>
<TITLE>ようこそ ○○さん</TITLE>
</HEAD>
<FRAMESET id=frameset1 border=0 name=TotalFrame frameSpacing=0 rows=48,*,0,0 frameBorder=0>
<FRAME name=header src="./Header/Header.aspx" noResize scrolling=no>
<FRAMESET id=frameset2 border=0 frameSpacing=0 frameBorder=0 cols=144,*>
<FRAMESET id=menuFrame border=0 name=menuFrame frameSpacing=0 rows=22,*,0 frameBorder=0>
<FRAME id=option6 name=option6 src="">
<FRAME name=Contents src="./Menu/MenuFrame.aspx" noResize scrolling=no>
<FRAME name=sub2 src="" height="0">
</FRAMESET>
<FRAMESET border=0 name=mainFrame frameSpacing=0 rows=*,0>
<FRAME name=main src="" scrolling=no>
<FRAME name=sub src="" height="0">
</FRAMESET>
</FRAMESET>
<FRAME name=message src="" height="0">
<FRAME name=footer src="" height="0">
</FRAMESET></HTML>

このWebページは、メニューフレームに「番号検索」「高度な書誌検索」などの各種メニューボタンがあり、これらメニューボタンをクリックすると、各メニューに対応した検索画面がメインフレームに表示されるというページ構成になっています。

このWebページを開いた時点(デフォルト)では、メインフレームは「高度な書誌検索」画面になっています。
そこで、
(1)メニューフレームの「番号検索」ボタンをクリックしてメインフレームを「番号検索」画面に変更し、続いて、
(2)メインフレームに表示された「番号検索」画面のテキストボックスに値を入力したいと考えています。

(1)メニューフレームの「番号検索」ボタンをクリックし、メインフレームを「番号検索」画面に変更する操作は以下のプロシージャで上手くいきました。
  
Dim IE As InternetExplorer, htdoc As HTMLDocument, htdoc_frame As HTMLDocument, htdoc_frame_frame As HTMLDocument, anchor As HTMLAnchorElement
  
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible
IE.Navigate "http://www.○○○・・・(省略)・・・"
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop

Set htdoc = IE.Document
Set htdoc_frame = htdoc.frames("Contents").Document
Set htdoc_frame_frame = htdoc_frame.frames("header").Document

For Each anchor In htdoc_frame_frame.getElementsByTagName("DIV")
If anchor.ID = "G04" Then 'G04は「番号検索」ボタンに相当するID
anchor.Click
Exit For
End If
Next

しかし、続く、(2)メインフレームに表示された番号検索画面のテキストボックスに値を入力する操作が、以下のプロシージャでは上手く行きません。

Set htdoc = IE.Document
Set htdoc_frame = htdoc.frames("main").Document
Set htdoc_frame_frame = htdoc_frame.frames("main").Document

Dim txtAreaOutput As HTMLInputElement

Set txtAreaOutput = htdoc_frame_frame.getElementsByName("TextBox1")(0)
txtAreaOutput.Value = "VBAからの書き込み"

上記プロシージャを実行してもエラーは発生しないのですが、テキストボックスに"VBAからの書き込み"という値が入力されません。
自分でいろいろ調べてみたところ、どうも、(1)の操作で、見た目はメインフレームが「番号照会」画面に変化しているものの、内部的に?はメインフレームが「高度な書誌検索」画面のままであるのが原因のようです。
内部的にも、メインフレームを「高度な書誌検索」画面から「番号検索」画面に変化させるにはどうすれば良いのでしょうか?

非常に判り難い質問かと思いますが、何か判る方がいらっしゃいましたら、教えて頂けると幸いです。

Excel VBAで以下のようなフレーム構造を持つHTMLページを操作したいと考えています。
(実際はもっと複雑なページですが、簡略化して記載しています)

<HTML>
<HEAD>
<TITLE>ようこそ ○○さん</TITLE>
</HEAD>
<FRAMESET id=frameset1 border=0 name=TotalFrame frameSpacing=0 rows=48,*,0,0 frameBorder=0>
<FRAME name=header src="./Header/Header.aspx" noResize scrolling=no>
<FRAMESET id=frameset2 border=0 frameSpacing=0 frameBorder=0 cols=144,*>
<FRAMESET id=menuFrame border=0 name=menuFrame f...続きを読む

Aベストアンサー

簡略化でも断片的でも実際に確認出来ない以上、何とも言いようがないかと。
取り合えず、マウスカーソル直下の要素を取得して、一番上の親のdocumentから列挙して比較するサンプル。
再帰処理のフレーム部分は環境が無かったので未確認。
(想像で書いてます)

参考URL:https://gist.github.com/kumatti1/46ccb4fda7be7b8e8b10

Q深夜TVで見た映画のタイトルを知りたい!

数年前、深夜にやっていた映画ですがもう記憶も薄れストーリーもよく覚えてません。とにかく印象に残っているのが映画の最後は部屋にカップルが居て電話が鳴りその電話が留守電のメッセージに変わるのですがその留守電のメッセージがすごくしゃれたメッセージだったのがすごく印象に残ってます。映画はたしかそのシーンで終了したと思います。たしか映画は字幕だったと思います。多分アメリカ映画だと思います。とにかくこれしかわかりません。どうしてももう一度見たいのでお分かりの方教えて下さい。

Aベストアンサー

リアリティ・バイツではないでしょうか。
1994年アメリカ
出演ウィノナ・ライダー、イーサン・ホーク

大学卒業、就職、そして現実の厳しさ。その中で見つけた本当の恋人。アメリカン青春ラブストーリーといったところでしょうか。
問題の留守電のメッセージは「あなたの名前と電話番号を 人生にはなぜ矛盾が多いのか その答えも」というものです。

QIEのダウンロード通知バーのVBA制御(保存他)

以前投稿された表題の質問をマネしてVBAから通知バーの制御を試みたらエラーになりました。
原因がわからず困っています。どこに問題があるか教えて頂けないでしょうか?
http://okwave.jp/qa/q8121989.html
■実行エラー91
「オブジェクト変数またはWithブロック変数が設定されていません」
■エラー停止箇所
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
■補足
・参照設定はしています。
・下記2点に示すようにお尻の数字を削除しています。(他のエラーがでてしまうため)
  Dim o As IUIAutomation2→IUIAutomation
  Set o = New CUIAutomation8→CUIAutomation

---【http://okwave.jp/qa/q8121989.html】------------------------------------------------------
Option Explicit
'参照設定 UIAutomationClient
'C:\Windows\System32\UIAutomationCore.dll
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub hoge2()

Const url As String = ""
Dim ie As Object
Set ie = CreateObject("Shell.Application").Windows.findwindowSW(url, Empty, 1, 0, 1)
If ie Is Nothing Then Exit Sub

Dim o As IUIAutomation2
Dim e As IUIAutomationElement
Set o = New CUIAutomation8
Dim h As LongPtr

h = ie.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)

Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "保存")

Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)

Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke

DoEvents
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "通知バーのテキスト")
Dim iElemFound As IUIAutomationElement
Set iElemFound = e.FindFirst(TreeScope_Subtree, iCnd)
Dim iValuePattern As IUIAutomationValuePattern
Set iValuePattern = iElemFound.GetCurrentPattern(UIA_ValuePatternId)

Do
DoEvents
If iValuePattern.CurrentValue Like "*のダウンロードが完了しました。*" Then
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "閉じる")
Set iElemFound = e.FindFirst(TreeScope_Subtree, iCnd)
Set InvokePattern = iElemFound.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
Exit Do
End If
Loop

End Sub

以前投稿された表題の質問をマネしてVBAから通知バーの制御を試みたらエラーになりました。
原因がわからず困っています。どこに問題があるか教えて頂けないでしょうか?
http://okwave.jp/qa/q8121989.html
■実行エラー91
「オブジェクト変数またはWithブロック変数が設定されていません」
■エラー停止箇所
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
■補足
・参照設定はしています。
・下記2点に示すようにお尻の数字を削除しています。(他のエラーがでてしまうため)
...続きを読む

Aベストアンサー

そのコードは通知バーが完全に表示されている状態での実行を期待しています。
なので、ループで参照がセット出来るまで、待ち合わせてみるとか。

Dim Button As IUIAutomationElement
Dim InvokePattern As IUIAutomationInvokePattern

While Not InvokePattern Is Nothing
DoEvents
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
Wend
InvokePattern.Invoke

Q映画、海猿について。※ネタバレ注意です(><)

映画、海猿について。※ネタバレ注意です(><)

映画のネタバレがあるので見たいと思っている方はここから下は見ないでください><すみません((汗





映画、海猿「THE LAST MASSAGE」でのワンシーンで

一番最後、
仙崎が環菜に
「あのさ、あのメッセージ・・聞いちゃった?」

みたいなことを聞いて
環菜が「あ~。チェックイーンってやつね?」
仙崎「あ・・いや・・そっちじゃなくて・・」
環菜「ん?なに?」
仙崎「え?あ。うん、いや、聞いてないならいいんだ。...」…


みたいな会話のシーンあるじゃないですか?

結局この、最後に残したメッセージって分からないまま終わったってことですよね?!(?

「環菜!!!君に、チェック。。。イ~~~~~ンぬ!」から始まる録音メッセージしか
シーンにはなかったから、
仙崎が“そっちじゃなくて”ってことは、
もうひとつ別にメッセージを残していたってことになりますよね??・・・。
このことについて、どう思いますか?!
・・・・日本語下手で伝わらなかったら補足します。。すみません。。

気になって仕方ありません(涙

映画、海猿について。※ネタバレ注意です(><)

映画のネタバレがあるので見たいと思っている方はここから下は見ないでください><すみません((汗





映画、海猿「THE LAST MASSAGE」でのワンシーンで

一番最後、
仙崎が環菜に
「あのさ、あのメッセージ・・聞いちゃった?」

みたいなことを聞いて
環菜が「あ~。チェックイーンってやつね?」
仙崎「あ・・いや・・そっちじゃなくて・・」
環菜「ん?なに?」
仙崎「え?あ。うん、いや、聞いてないならいいんだ。...」…


みたいな会話のシーンある...続きを読む

Aベストアンサー

再びすみません。

>チェックイーンってやつは聞いたよ、って環菜が言ったあとに、「そっちじゃなくて」って言ってませんでしたっけ??・

環菜に沢山プレゼントが届いていた中で「チェックイーン」って言葉が入っていたCDがありましたよね。
環菜が「ここから来てたんだ」って苦笑いしていたものですが。

↑で大輔がいう「そっちじゃなくて」はCDの事じゃないですかね?
なんとなくCDの声が大輔っぽかったので、もしかして自分で歌って録音したのかもしれませんが
このあたりは私もハッキリ分りませんでした。

ストーリー的に、ラストメッセージが別にあって最後までわからずっていうのは
ありえない気がするので、
あの感謝の言葉が大輔のメッセージかなと思いました。

私もあいまいな点が多々あり、これはもう1回見に行かないとだめですね。

QVBAのIEの操作でダイアログ表示後制御返らず

Excel 2007のVBAでIEを操作するアプリを作成しています。
そのアプリで、あるページ中の「閉じる」ボタンを押下すると下記のダイアログが表示されます。そのダイアログの「はい(Y)」ボタンを押すようにしたいのですが、制御がそのアプリに来ません。
ExcelおよびVBEがアクティブに出来ない状態になっています。
この解決方法をご教示頂きたくよろしくお願いしたします。

Aベストアンサー

子プロセスでなく、別プロセスで起動してください。言っている事がわからないのなら、そのような仕組みはやめましょう。

なお、添付されている画像は、何が映っているのがさっぱりわかりません。

それと、閉じるときに出るメッセージは、外から起動し、外から閉じようとしている場合セキュリティー上でるものです。

だったら内部から閉じればいいのです。つまり、そこに表示されているdocumentオブジェクトからの閉じる指令ならでません。

ひんとになったかな


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報