プロが教えるわが家の防犯対策術!

以前投稿された表題の質問をマネして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

A 回答 (2件)

こんにちは。



こういうコードは、あくまでも「実情に合わせて」ということでしょうから、こちらがこれが正解という話でもありませんし、実際に、Vector で動かしてみましたが、支障はないようです。
ただし、「実情に合わせて」ですから、それなりに、

Dim o As CUIAutomation8 'IUIAutomation3
Dim e As IUIAutomationElement
Set o = New CUIAutomation8 'New CUIAutomation8

Dim oButton As IUIAutomationElement  'oは、object の'o'
Button 自体は、予約語ではありませんが、VBAの名称には違いないので、それは嫌いました。

それで、起動してみました。ダウンロードまでいけます。
この種の質問は、何度も見ていますが、私自身は、このようなハードなコードは書きませんし、正直なところ、よく分かりません。オブジェクトとして取得しているかどうかぐらいの判定なので、コメントしづらい部分があります。

ちなみに、私の環境
OS Windows 10, Excel 2013, 32bit, IE11+Adblock Plus(環境が変わるらしい)
    • good
    • 0
この回答へのお礼

ありがとうございます。
私もこのコードの詳細はわからないため、学習するには短時間では無理なのでおまじないで機能すればよいというレベルです。
が、機能しないので困っています。。
私の環境は、下記のとおりでした。
■OS Windows 7 Professional, Excel 2010, 64bit, IE11

お礼日時:2017/02/05 21:11

そのコードは通知バーが完全に表示されている状態での実行を期待しています。


なので、ループで参照がセット出来るまで、待ち合わせてみるとか。

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
    • good
    • 1
この回答へのお礼

できました!ありがとうございます。
エラーの原因と対策もよくわかりました。
助かりました。

お礼日時:2017/02/12 02:50

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

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