ジメジメする梅雨のお悩み、一挙解決! >>

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

QVBS作動中のブラウザのmsgboxについて

現在VBSについて勉強中の者です。

VBSにてIEを作動させ、該当ページに進み、入力フォームなどに情報を入力し、
次へ進むボタンを押したときにmsgbox(Yes/No)がでてきてしまい、
そこでVBSが止まってしまいます。

そこで、3つほど質問なのですが

1.ブラウザの設定でmsgbox自体をださないようにする方法はあるか

2.PC自体の設定でmsgboxをださないようにする方法はあるか

3.他のスクリプトなんかを動かし、20秒ほどの間隔でキーボードのEnterを押す方法はあるか。
もしあれば、それはVBSとセットで使えるものか

こちら3つの質問で以上となります。
ご回答のほどよろしくお願いいたします。

Aベストアンサー

>それともVBSからjavascriptに飛んでこれやっといて的なことを
>頼んでいる形なのでしょうか?

はい。
標準関数と同名のニセ関数を追加するスクリプトコードをブラウザに送っています。

//ニセ関数
function confirm()
{
   return true;
}


http://d.hatena.ne.jp/ken3memo/20110828/1314527073

QvbaでIEの名前を付けて保存(A)をしたい

VBA で IEの通知バー を操作したいです。
SendKeys で 通知バーの 保存(S) はできたのですが、
保存(s)の右隣の ▼ をクリックするとでてくる、 名前を付けて保存(A) の方法がわかりません。

どのようなキーをおくればよいのでしょうか。


他の質問をみると、SendKeysではなく ○○がよいですよ みたいな内容しか見つからず、
回答をみつけることができなくて困っておりますのでよろしくお願いいたします。

Aベストアンサー

VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。 | 初心者備忘録
http://www.ka-net.org/blog/?p=4855
とか。

QメッセージボックスのOKボタンをVBAでクリックさせたい

EXCELの1つのブックに2つのマクロを組んでいます。

普段は1つ目のマクロを実行したあと、処理結果を確認してから
2つ目のマクロを動かしています。

※1つ目のマクロ終了時に、完了のメッセージボックスが出ます。



この2つのマクロを、自動で処理するためのマクロを
作ろうとしていて、

1.1つ目のマクロを実行
2.処理完了のメッセージボックスのOKをクリック
3.2つ目のマクロを実行

という流れで処理しようと思っています。


今、メッセージボックスのOKボタンをVBAでクリックする方法がわからなくて
調べているのですが、お分かりになる方いらっしゃいましたら
教えていただけませんでしょうか。



例えば、1つフラグを作って、そのフラグが立っている時は
メッセージボックスを出さないような制御は出来るのですが、
今回は、メッセージボックスをクリックする方法が
知りたいと思っています。


よろしくお願いいたします。

Aベストアンサー

無理です
MsgBox自体がモーダルで表示されるので MsgBoxからExcelへ処理が戻ってこない限りExcelからの制御が不能になります

フラグを作って MsgBoxの表示、非表示を切り替えるほうが現実的です

QWebページ中の javascript をVBAから実行するには

VBAで objIE を使用して Webページ中の javascript を実行したいのですが、
onclick="~~" の記述がないケースがあり困っております。
例えば以下のような記述です。

<a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>

onclick の記述がない上記のようなケースでは、javascript の呼び出しはどのようにすればよいのでしょうか?
不可能でしょうか?

Aベストアンサー

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますから、まず最初に、ダメ元で、
id名.Click を一度試してみます。もしくは、この行の上部のコードのオブジェクトのClass名のオブジェクトのひとつから、ヒットさせようとします。

そこでダメなら、ということで、ken3の内容に入るのですが、この著者の結論(正解)は、

ご質問に沿って書くと
For i =0 To objIE.Document.links.Length -1
If objIE.Document.links(i).href ="javascript:;" Then '文字の比較は、大文字・小文字がある
   objIE.Document.Links(i).Click
End if
Next i

ということになっています。私は、このコードは少し古臭く感じます。

ここで、ken3 の所では、Testサイトを用意してくれているので、試してみましたが、ダイレクトでサイトがとれている限りは、やはり、

Testサイト:http://www.ken3.org/vba/test170f.html

 objIE.Navigate "javascript:xxxxx;"

が利くことが分かりました。ただし、実際は、ここで時間待ちをしなくてはならないでしょう。
解説は、フレームからですので、うまく行かなかったようです。

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますか...続きを読む

QVBAでIEの操作→サブウインドウを操作するには

以下の「oya.html」「ko.html」があります。
それを、VBAで「oya.html」を開き、「子ウインドウを開く」リンクをクリックさせて、開いた「ko.html」の「子ウィンドウを閉じる」リンクをクリックさせたいのだがどうすればよろしいでしょうか?
---------VBA ↓---------------------------------------------
Private Sub CommandButton1_Click()
Dim objIE As Object 'Object型
'IEのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.Navigate "file:///C:/oya.html"'「oya.html」を開く
'----表示待ち↓--------
Do While objIE.Busy
 DoEvents
Loop
Do While objIE.document.ReadyState <> "complete"
DoEvents
Loop
'----表示待ち↑----------
For Each linkitem In objIE.document.all.tags("A") 'Aタグ
If linkitem.innerText = "子ウインドウを開く" Then
linkitem.Click
End If
Next
'----表示待ち↓--------
Do While objIE.Busy
DoEvents
Loop
Do While objIE.document.ReadyState <> "complete"
DoEvents
Loop
'----表示待ち↑----------
  For Each linkitem In objIE.document.all.tags("A") 'Aタグ
If linkitem.innerText = "子ウィンドウを閉じる" Then
linkitem.Click
End If
Next
End Sub
---------------↑-------------------------------------------
--------oya.html ↓-----------------------------------------
<html>
<head><script>
function showModal(){
var value = showModalDialog('ko.html');
}
</script></head>
<TITLE>親ウィンドウ</TITLE>
<body>
<a href="javascript://" onclick="showModal()">子ウインドウを開く</a><br>
</body>
</html>
-----------------↑-----------------------------------------
--------ko.html ↓--------------------------------------------
<html>
<TITLE>子ウィンドウ</TITLE>
<body>
<a href="#" onClick="window.close(); return false;">子ウィンドウを閉じる</a><br>
</body>
</html>
------------------↑-----------------------------------------

以下の「oya.html」「ko.html」があります。
それを、VBAで「oya.html」を開き、「子ウインドウを開く」リンクをクリックさせて、開いた「ko.html」の「子ウィンドウを閉じる」リンクをクリックさせたいのだがどうすればよろしいでしょうか?
---------VBA ↓---------------------------------------------
Private Sub CommandButton1_Click()
Dim objIE As Object 'Object型
'IEのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = Tru...続きを読む

Aベストアンサー

状況を理解しました。
子ウィンドウを、showModalDialog で開いている為に、子ウィンドウを閉じるまで Excel に制御が返ってこないワケですね。
VBA で制御できるレベルではなさそうです。一応参考 URL を添付しておきますが。。。

http://www.usefullcode.net/2006/12/ieihtmldocument2.html
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200509/05090016.txt

Q(UWSC) 「#32770」の意味わかりますか?

(UWSC)で、他人が作ったプログラムを見ています。

その中で、
GETID("タイトルの名前","#32770")
となっている箇所があります。
この"#32770"の意味がわかる方いらっしゃいますか?

教えてください。

Aベストアンサー

> この"#32770"の意味

ダイアログのクラス名

QVBAからIEを操作する時のウィンドウの選択の仕方がわかりません

VBAで、webページを操作するマクロを組んでいます。
具体的な手順としては、セルの商品番号をweb上の検索ボックスに入力して、別ウィンドウで開いた情報を「すべて選択」「コピー」してexcellの別シートに「貼り付け」までを行うものなのですが、
別ウィンドウで開いたページに対して、Sendkeysを行うにはどうやったらいいのでしょうか。
仮に、入力ページをA、結果ページをBとしたとき、Aに対しての入力とBページの表示までは出来ているのですが、Bページに対しての操作が出来ません。

ちなみに、事情があってwebクエリはあえて使っていません。
どなたか、いい解決方法・プロシージャをご存知でしたらよろしくお願いします。

Aベストアンサー

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kotaeru.php3?q=" & Range("A1").Value

みたいなコードで検索結果ページを開くことができると思います。同様に、商品番号
を渡すパラメータがあるはずですから、探して見て下さい。CGI にパラメータを渡す
方法が Get でも Post の場合でも検索フォームの HTML ソースを見れば分かります。

取り合えず、一度検索フォームの HTML ソースを見てみましょう。

これが可能なら、コードで IE オブジェクトを作り、直接検索結果のページを開くこ
とができますので、IE のウインドウハンドルやウインドウタイトルは簡単に取得
できます。

簡単な例です。A1 セルの値を Google で検索し、結果を A5 セルに貼り付けます。


Option Explicit

Private Declare Function SetForegroundWindow Lib "user32.dll" ( _
  ByVal hWnd As Long _
) As Long
  
Sub Sample()

  Dim IE   As Object
  Dim strURL As String
  Dim lngRet As Long
  
  Const READYSTATE_COMPLETE = &H4
  
  strURL = "http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q="
  strURL = strURL & Range("A1").Value
   
  Set IE = CreateObject("InternetExplorer.application")
  IE.Visible = True
  IE.navigate strURL
  Do
    DoEvents
  Loop Until Not IE.Busy And IE.readyState = READYSTATE_COMPLETE
  
  ' IE のウインドウをアクティブにする
  lngRet = SetForegroundWindow(IE.hWnd)
  If lngRet <> 0 Then
    ' アクティブにできたらキー送信して結果をコピー
    SendKeys "^a", True
    SendKeys "^c", True
    ' 貼り付け
    Range("A5").Select
    ActiveSheet.Paste
  End If
  Set IE = Nothing

End Sub

どうしても検索フォームを経由し、新しい IE を開く必要がある場合は、
参考 URL 先の記事が参考になると思います。

参考 URL: http://www.ken3.org/cgi-bin/group/vba_ie.asp

ちなみに、SendKeys を使わない方法としては、IE.Document.body.innerHTML
で HTML ソースは取得し、クリップボードに転送してからペースト、、

というのでも良いかもしれません。

では。

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kot...続きを読む

QvbscriptでIE自動入力(途中で出てくるポップアップをクリックしたい)

IEで自動化入力をvbscriptで作っております。
次々に問題というか知識の無さでつまづいています。お知恵を貸してください。

IE自動入力をしていくと、途中のクリックで次画面に
進むところでポップアップが浮き上がりスクリプトが止まってしまいます。

ポップアップの内容は、
タイトルが「セキュリティの警告」
内容が「このサイトと取り交わす情報は、ほかの人から読み取られたり変更されることは
ありません。しかし、このサイトのセキュリティ証明書には問題があります。、、、」
と出まして、
「はい(Y)」「いいえ(N)」「証明書の表示(V)」と選択肢があります。
手動で「はい」をクリックするか、Yキーを押すとまたスクリプトが進み始めます。

これを自動でクリックするためにはどうしたらいいんでしょうか。
いろいろ調べてこうして見ました。

Set wshshell=wscirpt.createobject("wscript.shell")
wshshell.AppActivate("セキュリティの警告")
wshshell.sendkeys "y"

これでは、全く動きません。おそらくこのウィンドウにコントロールが行ってないと思います。
他の手立てを教えてください。よろしくお願いします。

IEで自動化入力をvbscriptで作っております。
次々に問題というか知識の無さでつまづいています。お知恵を貸してください。

IE自動入力をしていくと、途中のクリックで次画面に
進むところでポップアップが浮き上がりスクリプトが止まってしまいます。

ポップアップの内容は、
タイトルが「セキュリティの警告」
内容が「このサイトと取り交わす情報は、ほかの人から読み取られたり変更されることは
ありません。しかし、このサイトのセキュリティ証明書には問題があります。、、、」
と出まして、
...続きを読む

Aベストアンサー

ポップアップが表示されるより早く、yが送られてしまってるんでしょう。
ポップアップが表示されるのを待たないとね。

Set wshshell=wscirpt.createobject("wscript.shell")

'セキュリティの警告が表示されるまで待つ
Do Until wshshell.AppActivate("セキュリティの警告")
WScript.Sleep 100
Loop

'セキュリティの警告が消えるまでyを送る
Do While wshshell.AppActivate("セキュリティの警告")
wshshell.sendkeys "y"
WScript.Sleep 100
Loop

永久ループに陥らないように、適度にループ抜けを入れておけばいいでしょう。

QEXCEL VBA でIEを制御して、INPUT type=file で出るダイアログに入力できませんか?

EXCEL VBA から、objIEオブジェクトを使って、IEを制御して、WEBページを制御するプログラムを作っています。
※通販サイトのモール内管理の自動化プログラムです。

その際、操作対象のページに、INPUT type=file でファイルを入力するブロックがあります。
ここに自動でファイルを入れたいのですが、INPUT type=file を表示するボタンに対し .clickを入れるとそこでVBAが停止してしまいます。

そのモールそのものは、色々な制約があるので、公開できませんが、抜き出したのが

http://royal-e.heteml.jp/js_test/input_test.htm

になります。

objIEオブジェクトで INPUT type=file に希望のファイル名を入力することは出来るでしょうか?

方法をご存知の方がいらしたら、教えてください。

Aベストアンサー

何度もすみません、下記コードをVBAで実行した所正常にアップロード出来ました
ファイル名のテキストボックスにフォーカスが移り、sendkeysでファイル名が自動入力されて
アップロードボタンが自動押下されました
ファイル選択ダイアログは表示させずに済みました
但し当方の環境はXP+IE6+EXCEL2002ですのでIE7の場合動くかは不明ですが。

Private Sub input_txt()
 Dim objIE As Object
 Const READYSTATE_COMPLETE As Long = 4 'IEオブジェクト状態(4=読み込み完了)

 Set objIE = CreateObject("InternetExplorer.application")
 objIE.Visible = True
 objIE.Navigate "http://*****"

 While objIE.ReadyState <> READYSTATE_COMPLETE
  While objIE.Busy = True
   DoEvents
  Wend
 Wend

 objIE.Document.Forms("****").Item("****").Select
 Application.SendKeys "C:\Documents and Settings\****.ext", True
 objIE.Document.Forms("****").Item("****").Click 'アップロードボタン押下
End Sub

何度もすみません、下記コードをVBAで実行した所正常にアップロード出来ました
ファイル名のテキストボックスにフォーカスが移り、sendkeysでファイル名が自動入力されて
アップロードボタンが自動押下されました
ファイル選択ダイアログは表示させずに済みました
但し当方の環境はXP+IE6+EXCEL2002ですのでIE7の場合動くかは不明ですが。

Private Sub input_txt()
 Dim objIE As Object
 Const READYSTATE_COMPLETE As Long = 4 'IEオブジェクト状態(4=読み込み完了)
...続きを読む

QIE操作時、ファイルのダウンロードボタンの押下

IEをvb.netから操作しています。
webからファイルのダウンロードを自動で行いたいのですが、どのようにすればいいのかわからず悩んでいます。

画像の赤枠で括ってあるボタンの押下を、vb.netからの操作で行いたいのですが、どのようにすれば良いでしょうか。
InternetExplorer.Applicationに何らかのメンバ関数のようなものがあるのか、sendkeysを使うしかないのか、sendkeysを使うなら、具体的にどのキー操作を送れば良いのかなど、お教えいただけないでしょうか。

よろしくお願いします!

Aベストアンサー

Windows7 IE9ですが、↓で動きました

Private Delegate Function D_EnumChildWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As IntPtr

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr

Private Const WM_ACTIVATE = &H6
Private Const BM_CLICK = &HF5
Private Const WM_GETTEXT = &HD
Private Const WM_QUIT = &H10

Private Const NAVDIR_NEXT = &H5
Private Const NAVDIR_FIRSTCHILD = &H7
Private Const CHILDID_SELF = &H0
Private Const OBJID_CLIENT = &HFFFFFFFC

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hWnd As IntPtr, ByVal dwId As IntPtr, _
ByRef riid As Guid, <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObject As Object) As IntPtr
Declare Function AccessibleChildren Lib "oleacc" _
(ByVal paccContainer As IAccessible, ByVal iChildStart As IntPtr,
ByVal cChildren As IntPtr, <[Out]()> ByVal rgvarChildren() As Object, ByRef pcObtained As IntPtr) As IntPtr

Private IID_IAccessible As Guid = New Guid(&H20400, 0, 0, {&HC0, 0, 0, 0, 0, 0, 0, &H46})

Sub FileDownLoad_Proc()
Dim strCaption As String
Dim PWnd As IntPtr
Dim cWnd As IntPtr

' 親ウィンドウ取得
strCaption = "○○○○ - Windows Internet Explorer"
While PWnd = 0
PWnd = FindWindowEx(0, 0, "IEFrame", strCaption)
System.Threading.Thread.Sleep(50)
End While

' 通知バーのハンドル
While cWnd = 0
cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
System.Threading.Thread.Sleep(50)
End While

' 通知バーボタン群のハンドル
Dim hChild As IntPtr = FindWindowEx(cWnd, 0&, "DirectUIHWND", vbNullString)
Dim objAcc As IAccessible = Nothing

AccessibleObjectFromWindow(hChild, OBJID_CLIENT, IID_IAccessible, objAcc)

If Not IsNothing(objAcc) Then
ClickPreserve(objAcc)
While cWnd = 0
cWnd = FindWindowEx(PWnd, 0&, "Frame Notification Bar", vbNullString)
System.Threading.Thread.Sleep(50)
End While
SendMessage(cWnd, WM_QUIT, 0, 0&)

End If

End Sub
Private Sub ClickPreserve(ByVal acc As IAccessible)

Dim i As Long
Dim count = acc.accChildCount
Dim lst(count - 1) As Object

If count > 0 Then
AccessibleChildren(acc, 0, count, lst, 0)
If Not IsNothing(lst) Then
For i = LBound(lst) To UBound(lst)
With lst(i)
'On Error Resume Next
'Debug.Print("ChildCount: " & .accChildCount)
'Debug.Print("Value: " & .accValue(CHILDID_SELF))
'Debug.Print("Name: " & .accName(CHILDID_SELF))
'Debug.Print("Description: " & .accDescription(CHILDID_SELF))
'On Error GoTo 0
'保存ボタンを見つけたらクリック(デフォルトアクション)する
If .accName(CHILDID_SELF) = "保存" Then

System.Threading.Thread.Sleep(500)
.accDoDefaultAction(CHILDID_SELF)
System.Threading.Thread.Sleep(500)
End If
End With
ClickPreserve(lst(i)) '再帰
Next
End If
End If
End Sub

Windows7 IE9ですが、↓で動きました

Private Delegate Function D_EnumChildWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As IntPtr

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As IntPtr, ByVal wParam As IntPtr, ByVal lP...続きを読む


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

人気Q&Aランキング

おすすめ情報