【VBA】UIAutomationで業務改善3
RPAなんて不要
どうも。「やめろよ。やめろよ。」と言っても台風の時に河川覗く人と、ハロウィンパーティでウィルス集団感染する人の脳内は似てる。と思ってるjimです😉
今回の記事で、いよいよ『UIAutomation』を使うわけだけど、ザックリな説明です😣
こゆのとか、他のAPIと組み合わせて使えば、RPAを黙らせることが出来る、、、
に違いないと思ってます。
結局、プログラミングを使った業務改善って、発想の問題なんだよね。
RPA使ったところで、組み立てる人のサービス精神が乏しければ、いいものも作れないわけで。。。
『どんな手を使ってでも成し遂げよう!』っていう、気持ちよ!
気持ち気持ち😄
エレメント取得
今回は、電卓を使って説明します🖥
業務改善1で紹介した『UIAutomationSpy』でエレメントを取得します。
電卓とUIAutomationSpyを開いて、UIAutomationSpyのStartを押すとエレメントの取得が始まります。
ちなみに、Stopで止めないとカーソル部分のエレメントを取得し続けます。
↓UIAutomationSpyの内容(ControlTypeId、Class、Nameの順)
Get-UiaWindow -Class 'ApplicationFrameWindow' -Name '電卓' | ` Get-UiaWindow -Class 'Windows.UI.Core.CoreWindow' -Name '電卓' | ` Get-UiaGroup -Class 'LandmarkTarget' | ` Get-UiaGroup -AutomationId 'NumberPad' -Class 'NamedContainerAutomationPeer' -Name '数字パッド' | ` Get-UiaButton -AutomationId 'num1Button' -Class 'Button' -Name '1'
こんな感じの入れ子になってます。
今回、最初のウィンドウはハンドルから取得して、2行目から順にエレメントを取得し、最終的に『1』のエレメントを取得します。
取得の仕方は、ハンドル操作に似ていて、NameかId(Class)を指定して取得します。
多分、分からないと思うので、実際にコードを記述します😓
UIAutomationで電卓の操作
とりあえず、参照設定から、、
『UIAutomationClient』にチェック入れます。
それから、親のハンドルを取得するために『FindWindowA』のAPIを定義します。(今回は親だけで大丈夫)
定義の仕方は↓
親ハンドルを取得するコードを記述します。
Option Explicit Private Declare Function FindWindowA Lib "user32" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub dentaku() Dim Hwnd As Long Hwnd = FindWindowA(vbNullString, "電卓") End Sub
次に、電卓ウィンドウを取得。
Dim uiAuto As CUIAutomation Dim elmDentaku As IUIAutomationElement Dim iCnd As IUIAutomationCondition Set uiAuto = New CUIAutomation Set elmDentaku = uiAuto.ElementFromHandle(ByVal Hwnd)
んで、下が『UIAutomationSpy』で取得した2行目の処理。
Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "電卓") Set elmDentaku = elmDentaku.FindFirst(TreeScope_Subtree, iCnd)
Nameで取得の場合⇒(UIA_NamePropertyId,"Name")
Classで取得の場合⇒(UIA_ClassNamePropertyId,"Class")
2行目と同じ処理を繰り返して、最終的に『1』を取得します。
そして、取得したエレメントに送信もできると。。。
Dim InvokePattern As IUIAutomationInvokePattern Set InvokePattern = elmDentaku.GetCurrentPattern(UIA_InvokePatternId) InvokePattern.Invoke
因みに、キャプション名の取得も出来るし、文字列も送信できます。
Dim iValuePattern As IUIAutomationValuePattern Set iValuePattern = エレメント.GetCurrentPattern(UIA_ValuePatternId) '文字列送信 iValuePattern.SetValue 文字列 'キャプション名 Debug.Print iValuePattern.CurrentValue
最後に
『1+1=』のコードを記述してみました👍
これなら、分かりやすいんじゃないかな?
Option Explicit Private Declare Function FindWindowA Lib "user32" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub dentaku() Dim Hwnd As Long Hwnd = FindWindowA(vbNullString, "電卓") Call potipoti(Hwnd, "1") Call potipoti(Hwnd, "+") Call potipoti(Hwnd, "1") Call potipoti(Hwnd, "=") End Sub Private Sub potipoti(ByVal Hwnd As Long, P As String) Dim uiAuto As CUIAutomation Dim elmDentaku As IUIAutomationElement Dim iCnd As IUIAutomationCondition Dim InvokePattern As IUIAutomationInvokePattern Set uiAuto = New CUIAutomation Set elmDentaku = uiAuto.ElementFromHandle(ByVal Hwnd) Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "電卓") Set elmDentaku = elmDentaku.FindFirst(TreeScope_Subtree, iCnd) Set iCnd = uiAuto.CreatePropertyCondition(UIA_ClassNamePropertyId, "LandmarkTarget") Set elmDentaku = elmDentaku.FindFirst(TreeScope_Subtree, iCnd) Select Case StrConv(P, vbNarrow) Case "+" P = "プラス" Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "標準演算子") Case "-" P = "マイナス" Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "標準演算子") Case "/" P = "除算" Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "標準演算子") Case "*" P = "乗算" Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "標準演算子") Case "=" P = "等号" Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "標準演算子") Case Else P = StrConv(P, vbNarrow) Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, "数字パッド") End Select Set elmDentaku = elmDentaku.FindFirst(TreeScope_Subtree, iCnd) Set iCnd = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, P) Set elmDentaku = elmDentaku.FindFirst(TreeScope_Subtree, iCnd) Set InvokePattern = elmDentaku.GetCurrentPattern(UIA_InvokePatternId) InvokePattern.Invoke End Sub
ってことで、全部で3記事にもなってしまったけれど、「APIを使えばoffice以外のことも色々出来ちゃうよ。」って話、、、
長いか😅
あ〜い、とぅいまてぇ〜ん🖐
ディスカッション
コメント一覧
まだ、コメントがありません