IE上に表示されたイメージアイコンをクリックすると、図に示す画面が現われます。
これをVBA制御により「名前を付けて保存」ボタンを押したいのですがうまくいかずご教授頂きたいです。
(なお、恐縮ながらSendkeysを利用する方法は求めておりません。また、こちら社内システムででてくる画面であるためリンクを示すことができません、申し訳ございませんがご理解願います。)

質問は↑につきますが、やってみたこと①②について補足で示します。
①SendMessageを利用する場合
https://oshiete.goo.ne.jp/qa/1809850.html

→コピペでやりたいことにかなり近いことができましたが、「開く(O)」ボタンを押してしまっています。若干理解不足ではありますが、このソースでは、「名前を付けて保存」、又は「保存」という記述しかないのに、なぜ「開く」ボタンが押さる挙動となるのかわかっていません。

②UIAutomationを利用する場合
https://oshiete.goo.ne.jp/qa/9622324.html

→エラーがでてしまい、うまくボタンをおすところまで行きませんでした。
わからないなりにUIAutomation関連の知識を入れながらパラメータを変えての試行錯誤しましたがギブアップです。うまくボタンをとらえることができません。(いや、知識不足がかなり大きいです。。)

こちらは、以前「通知バー」制御に関する投稿させて頂いた内容で、うまくいった経緯があること、また、「名前を付けて保存」ボタンが押下が成功したら、後の「名前を付けて保存ダイアログボックス」制御がそのまま利用できそうなので試してみた次第です。

「VBA IE ダウンロード ダイアログ制」の質問画像

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

A 回答 (1件)

こんな感じですかね。


---
Option Explicit
'参照設定 UIAutomationClient
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 hoge()

Dim o As IUIAutomation
Dim e As IUIAutomationElement
Set o = New CUIAutomation
Dim h As LongPtr

h = FindWindowEx(0, 0, "#32770", "Internet Explorer")
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)

Dim iCnd As IUIAutomationCondition
iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "名前を付けて保存(A)")

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

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

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!
大変感謝しています。
下記、Set iCnd ,Set Buttonに修正して完璧でした。
iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "名前を付けて保存(A)")
Button = e.FindFirst(TreeScope_Subtree, iCnd)

別件でもう一つUIAutomation関連で質問をする予定ですのでよろしければお願いします。
通知バーAutomation処理、反応が遅い場合があり改善したいというものです。

お礼日時:2017/03/25 12:14

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

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

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

Qコマンドボタンを押すと・・・

vbの超初心者なのですが、フォームにコマンドボタンを何度か設置したら

Private Sub Button1_Click(sender As System.Object,・・・

というのと

Private Sub Button1_Click_1(sender As System.Object,・・・

というのが出来上がっていて、コマンドボタンをクリックすると
Private Sub Button1_Click_1
のほうのコードが実行されるのですが、
Private Sub Button1_ClickとPrivate Sub Button1_Click_1
の違いはなんでしょうか?

Private Sub Button1_Clickは、どのコマンドボタンを押せば実行されるのでしょうか?

Aベストアンサー

何をどうしたら出来たのか不明ですけど、
それは単なる名前(ボタンを押した際のイベント名)の
違いでしょう。

ボタンが1つ(あるいはButton1が1つ)であるなら

Private Sub Button1_Click_1

の方を削除すれば良いのでは?
⇒どのButtonを押した時に実行するかは
その後ろにある

Handles Button1.Click

で決まってきますから。

Qマウスの左ボタンを押したまま範囲指定

よく、Windowsのアプリケーションで、マウスの左ボタンを押したままマウスを動かすと、細い線で起点から四角形があらわれ範囲指定ができるアプリケーションがあります(Wardで文章に貼り付けた図形を複数選択する時など)が、VB6でもこのようなアプリケーションを作ることは可能でしょうか?可能であればプログラミングの方法を教えていただきたいのですが、ご存知の方いらっしゃいましたらよろしくお願いします。

Aベストアンサー



参考URL:http://www.mitene.or.jp/~sugisita/family/papa/vb/api_gra.html

Qプログラムの中でコマンドボタンを押す動作を記述

プログラム中にコマンドボタンを押す動作はどのように記述すればよいのでしょうか?
コマンドボタン1を押して、その処理をしている途中にコマンドボタン2を押したいです。

Private Sub Command1_Click()

途中にコマンドボタン2を押したい。

End Sub

Aベストアンサー

CommandButton2.Value = True

Q親ウインドウにあるOKボタンを押す方法

非常に基本的なことを質問して申し訳ございません。

●やりたいこと●
ある親ウィンドウに「テキスト」と「OKボタン」があります。
OKボタンはひとつだけです。
このOKボタンを押して、親ウィンドウを閉じるだけです。
OKボタンを押せば、親ウィンドウは勝手に閉じます。


親ウィンドウのハンドルは取得できたのですが、
子ウィンドウ(ボタン"OK")のハンドルが取得できず、
その後の処理もできておりません。

ボタンはひとつだけなので、ボタンのハンドルを検索したりしなくても、
押すことはできるような気がするのですが・・・
初心者の浅知恵で申し訳ございません。

やはり、ボタンのハンドルを取得して、押すコマンドを実行しないといけないのでしょうか?

ボタンのハンドルを取得して、押すコマンドを実行する場合、
その方法を教えていただけると幸いです。

親ウィンドウのハンドルは変数「hWindow」に入っているとして、
コードをお願いいたします。

親ウィンドウのハンドル取得に使ったFindWindow以外に宣言が必要であればご教授お願いいたします。

非常に基本的なことを質問して申し訳ございません。

●やりたいこと●
ある親ウィンドウに「テキスト」と「OKボタン」があります。
OKボタンはひとつだけです。
このOKボタンを押して、親ウィンドウを閉じるだけです。
OKボタンを押せば、親ウィンドウは勝手に閉じます。


親ウィンドウのハンドルは取得できたのですが、
子ウィンドウ(ボタン"OK")のハンドルが取得できず、
その後の処理もできておりません。

ボタンはひとつだけなので、ボタンのハンドルを検索したりしなくても、
押すことはでき...続きを読む

Aベストアンサー

子ウィンドウを探すには、下の2つのAPIの使います。

  EnumChildWindows(hWnd,lpEnumFunc,0&)
  GetClassName(hWnd,lpClassName,nMaxCount)

EnumChildWindows が、親ウィンドウのハンドルと、子ウィンドウを受け取る関数を
与えます。ただし、子ウィンドウを受け取る関数はフォームモジュールではなく、
標準モジュールにないと駄目です。

すると与えた子ウィンドウを受け取る関数に、親ウィンドウに含まれる全ての子ウィンドウの
ハンドルが返ってきます。

返ってきたハンドルを元に GetClassName で、クラス名を取得し、ボタンのウィンドウを
特定します。今回の場合は、ボタンが1個しかないとのことなので、取得したクラス名が
Buttonであればそのハンドルがボタンのハンドルになります。
参考までに、複数個のボタンがあれば、この場合、どのボタンがOKボタンなのかを特定しない
といけません。「スパイ」とか言うソフトがあれば簡単に特定できるのですが、ない場合は、
子ウィンドウに含まれる、上記の手順で得た全てのボタンのハンドルに対して、プログラムで
BM_CLICKのメッセージを送り一つづつ確認していくしかありません。ただこの場合でも、
特性があって、親ウィンドウに複数個のボタンがあっても、子ウィンドウを受け取る関数には
必ず一定の順番にしか、ハンドルが返ってきないので、最初に一度だけ何番目のボタンかを特定
すればよいです。対象のアプリケーションを再度起動してもこの順番は変わりません。

あと、ボタンのクリックは、SendMessageで、BM_CLICK を送ればOKです。

今回は、簡単な他アプリの制御なので、そんなに問題がないですが、複雑な制御だと、
更に、ウエイトの方法だとか、制御するアプリが確実に動作しているか、確認する操作を
1ステップずつ挿入していかないと駄目です。そうすれば、全ての他のアプリケーションを
自由に操る事ができます。

本格的に作るとなると大変なので、フリーのソフトで沢山でていると思います。一度さがされたら
よいと思います。DLLタイプになっているのがよいとは思います。
以前私も使ったことがありますが、憶えていません。あしからず。現在は自作しております。
自作のがよりきめ細かく制御出来るからです。

子ウィンドウを探すには、下の2つのAPIの使います。

  EnumChildWindows(hWnd,lpEnumFunc,0&)
  GetClassName(hWnd,lpClassName,nMaxCount)

EnumChildWindows が、親ウィンドウのハンドルと、子ウィンドウを受け取る関数を
与えます。ただし、子ウィンドウを受け取る関数はフォームモジュールではなく、
標準モジュールにないと駄目です。

すると与えた子ウィンドウを受け取る関数に、親ウィンドウに含まれる全ての子ウィンドウの
ハンドルが返ってきます。

返ってきたハンドルを元に G...続きを読む

Qコマンドボタンを押したときにサウンドを鳴らしたい

VBA初心者です。サウンドを鳴らす方法について教えてください。

CommandButton1のコードです。

If テキストボックス1の数値が正しければある処理
Else テキストボックス1の数値が正しくなければ、MsgBoxを表示しつつ、Cドライブにあるwav.を鳴らす

というコードを考えています。しかし、wavを鳴らすという手順が、いろいろサイトを検索してみましたが良く分かりません。Beepという方法もあるみたいですが、音を指定したいと思います。
なるたけ分かりやすく教えていただければ助かります。どなたか宜しくお願いいたします。

Aベストアンサー

こんな感じじゃだめかな?

http://homepage1.nifty.com/rucio/main/technique/teq_1.htm


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

人気Q&Aランキング

おすすめ情報