【VBA】UIAutomationで業務改善4

Microsoft Edgeの操作

仕事中に読書もブログでけてないjimです。どうも✋

今回は、UIAutomationでMicrosoft Edgeを操作してみようのコーナーです。

InternetexplorerがオワコンでSeleniumbasicも使えない人のために、日曜の朝からせっせとコード書きました

うん、やっつけだよ👍

つか、自分もEdgeのドライバーDLさせてもらってないので、その内の一人なんですけどね😣

Edgeのホームが『Bing』って設定で説明していきます。

【VBA】UIAutomationで業務改善1で紹介しUIAutomationSPYで要素を調べます。

↓のNameを取得したいんだけど、よくわからんのよね。。。

↓Hierarchy見るとTypeIdも見れるのだけど、よくわからんのよねぇ。。。

 

コードを書き散らす

エレメント.FindFirstじゃ取得できないということ?

よくわからないから、一番最初にWin配下の要素を全取得⇒その後、ゴニョゴニョしていきやす。。。

↓参照設定が必要です

↓書き散らした

Option Explicit
Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub UIAutomation()
Dim shellObject As Object
Dim uiAuto As UIAutomationClient.CUIAutomation
Dim edgeElement As IUIAutomationElement
Dim editElement As IUIAutomationElement
Dim valuePattern As IUIAutomationValuePattern
Dim invokePattern As IUIAutomationInvokePattern
    'edge立ち上げる(やっつけ)
    Set shellObject = CreateObject("Shell.Application")
    shellObject.ShellExecute "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge"
    '新しいタブを取得するまで待機(やっつけ)
    Do While GetHwnd("新しいタブ") = 0
        DoEvents
    Loop
    'edgeを取得(やっつけ)
    Set uiAuto = New UIAutomationClient.CUIAutomation
    Set edgeElement = GetEdge(uiAuto)
    '検索editに文言入力(やっつけ)
    Set editElement = GetElement(uiAuto, edgeElement, UIA_NamePropertyId, "検索語句を入力", UIA_EditControlTypeId)
    Set valuePattern = editElement.GetCurrentPattern(UIA_ValuePatternId)
    valuePattern.SetValue "崖っぷち派遣社員"
    '検索button押す(やっつけ)
    Set editElement = GetElement(uiAuto, edgeElement, UIA_NamePropertyId, "検索", UIA_ButtonControlTypeId)
    Set invokePattern = editElement.GetCurrentPattern(UIA_InvokePatternId)
    invokePattern.Invoke
End Sub
Function GetHwnd(ByVal myStr As String)
    GetHwnd = FindWindowA(vbNullString, myStr)
End Function
Function GetEdge(ByVal uiAuto As UIAutomationClient.CUIAutomation)
Dim allElement As IUIAutomationElement
Dim condControls As UIAutomationClient.IUIAutomationCondition
Dim arryControls As UIAutomationClient.IUIAutomationElementArray
Dim i As Long
    Set allElement = uiAuto.GetRootElement
    Set condControls = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_WindowControlTypeId)
    Set arryControls = allElement.FindAll(TreeScope_Subtree, condControls)
    For i = 0 To arryControls.Length - 1
        If LCase(arryControls.GetElement(i).CurrentName) Like "*- microsoft? edge" And _
            arryControls.GetElement(i).CurrentClassName = "Chrome_WidgetWin_1" Then
            Set GetEdge = arryControls.GetElement(i)
            Exit For
        End If
    Next
End Function
Function GetElement(ByVal uiAuto As UIAutomationClient.CUIAutomation, ByVal edgeElement As IUIAutomationElement, _
ByVal propertyId As Long, ByVal propertyString As String, Optional ByVal propertyType As Long = 0)
Dim Cond1 As IUIAutomationCondition
Dim Cond2 As IUIAutomationCondition
    Set Cond1 = uiAuto.CreatePropertyCondition(propertyId, propertyString)
    Set Cond2 = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, propertyType)
    Set Cond1 = uiAuto.CreateAndCondition(Cond1, Cond2)
    Set GetElement = edgeElement.FindFirst(TreeScope_Subtree, Cond1)
End Function

 

やっつけで作ったので、別ウィンドウのことや待機処理のことは無視してます。

あと、Edgeのパス違うかもしれないから注意です。

ここまでやったら、、後は何とかなるでしょ?ならん?

 

 

ってことで、1年ぶり以上の『UIAutomation』ネタでした😉

自分もはよ職場のヤーツなんとかしないと。。。

したら、またね✋

 

next:【VBA】UIAutomationで業務改善5