いつもお世話になっております。
エクセル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と関連する良く見られている質問

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QExcel VBA: private sub 内の変数の値を Sub へ渡すには

VBA初心者です。private sub 内で条件に合致した変数の値をSubへ渡すにはどうしたらよいのでしょう。下記を見ていただければやりたいことの意図は伝わるかと思います。private sub内の変数が多分private sub内のみでしか参照出来ないからだとは思いますが、うまくいきません。グローバル変数化みたいなことが出来るのでしょうか。

Sub Find_OK()
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK
End If
Next
End Sub

Aベストアンサー

Sub Find_OK(var1)
MsgBox "条件に合致したのは" & var1 & "です。"
End Sub

Private Sub Worksheet_Calculate()
Dim var1
 For var1 = 1 to 10
 If var1 > 8 Then Call Find_OK(var1)
End If
Next
End Sub

QThreading.Thread.Sleep()の前後の処理

初めて質問します。(VB2008始めたばかりの初心者です)
昔のBASICでwaitやdelay、sleepなどといったプログラムの実行を一時止めることの出来るコマンドがあったと思いますが、
VB2008上で同じようなことさせてラベルの色を一定時間で変化させたいと思い、色々調べて Threading.Thread.Sleep() 
というものを見つけました。実際使ってみるとThreading.Thread.Sleep()の前に書いた処理がうまく動作しません。
(下記のような簡単なコードですが)

Private Sub Buttonstart_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles Buttonstart.Click
   Label1.BackColor = Color.White
    Threading.Thread.Sleep(2000)
    Label1.BackColor = Color.Blue
End Sub
スタートボタンを押せばlabel1が白色になり2秒後に青にしたいのですが白色にならずに2秒後にいきなり青になってしまいます。
とても初歩的な間違いをしていると思うのですが解決できません。恥ずかしいと思いながらも質問させていただきます。アドバイスをお願いします。

初めて質問します。(VB2008始めたばかりの初心者です)
昔のBASICでwaitやdelay、sleepなどといったプログラムの実行を一時止めることの出来るコマンドがあったと思いますが、
VB2008上で同じようなことさせてラベルの色を一定時間で変化させたいと思い、色々調べて Threading.Thread.Sleep() 
というものを見つけました。実際使ってみるとThreading.Thread.Sleep()の前に書いた処理がうまく動作しません。
(下記のような簡単なコードですが)

Private Sub Buttonstart_Click(ByVal sender As System....続きを読む

Aベストアンサー

はじめまして、通りすがると申します。
Threading.Thread.Sleep(2000)
の前に、Me.Refresh を入れたらどうなりますか?

Q印刷ダイアログの印刷ボタンを押す方法?

VBでChromeを制御して、表示した画面を印刷するアプリを作成しています。[Ctrl]+[Shift]+[P]キー入力で表示されるWindowsの印刷ダイアログ上の[印刷]ボタンを押す方法をご教示して頂きたくお願いします。

環境はつぎのとおりです。
o OS:Windows 7 Pro. 64bit SP1
o VB:VB 2010 Express
o Chrome:Ver.49.0.2623.87 m

ダイアログで設定する内容は、デフォルトのままでよいので[印刷]ボタンを押すだけです。
よろしくお願いします。

Aベストアンサー

sendkeyで操作なさっているのだと想像しましたが、制御するのは同様の方法しかないのではと思います。

手元にChromeが無いので確認できてはいませんが、デフォルトでショートカットが設定されていればそれを、設定がなくても多くのブラウザではダイアログ表示時点でそのまま「印刷」がデフォルトになっていると想像しますので、リターンキーで印刷されませんか?

手元にあるブラウザで試してみたところ
 IEはショートカットAlt+Pでもリターンキーでも印刷される
 Fxはショートカットは無し、リターンキーで印刷される
という状況でした。

ご参考まで。


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

このカテゴリの人気Q&Aランキング

おすすめ情報