使用VBA和UIAutomationClient调用按钮控件时出错

时间:2018-10-17 09:57:46

标签: excel excel-vba

我在UI自动化中是一个非常新的人,并且我正在做一个小项目,以从VBA Exel自动化桌面系统。我要编写,阅读并单击此桌面应用程序的不同按钮。我正在使用DLL UIAutomationClient。读取和写入的选项效果很好,但是当我使用该方法时,在整个方法调用期间单击,会出现以下错误消息:对象变量或块未设置。我正在使用Inspect.exe来跟踪按钮的树。据我了解,此按钮位于窗格内。这是我到目前为止的代码。请原谅我的一些技术错误或知识,但我是编程的初学者。

findTheParentElement
requirementGroup = Array("TFormSeleccionPago1", "TPanel", "TAdvSmoothPanel", "Siguiente")
idTypeGroup = Array("ClsName", "ClsName", "ClsName", "Name")
valueFound = executeOperation("click", requirementGroup, idTypeGroup)

Function findTheParentElement() As UIAutomationClient.IUIAutomationElement

    Set parentElement = WalkEnabledElements(oAutomation.GetRootElement, "softwareNameInDesktop")

End Function

Function executeOperation(ByVal operationType As String, ByVal requirementGroup As Variant, ByVal idTypeGroup As Variant, Optional valueToWrite As String) As String

Dim oInvokePattern As UIAutomationClient.IUIAutomationInvokePattern
Dim oPattern As UIAutomationClient.IUIAutomationLegacyIAccessiblePattern

Dim valueFound As String
Dim odd As Boolean

odd = False

If UBound(requirementGroup) >= 0 Then
    Set MyElement1 = parentElement.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(0), idTypeGroup(0)))
    odd = True
End If

If UBound(requirementGroup) >= 1 Then
    Set MyElement2 = MyElement1.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(1), idTypeGroup(1)))
    odd = False
End If

If UBound(requirementGroup) >= 2 Then
    Set MyElement1 = MyElement2.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(2), idTypeGroup(2)))
    odd = True
End If

If UBound(requirementGroup) >= 3 Then
    Set MyElement2 = MyElement1.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(3), idTypeGroup(3)))
    odd = False
End If

If UBound(requirementGroup) >= 4 Then
    Set MyElement1 = MyElement2.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(4), idTypeGroup(4)))
    odd = True
End If

If UBound(requirementGroup) >= 5 Then
    Set MyElement2 = MyElement1.FindFirst(TreeScope_Children, PropCondition(oAutomation, requirementGroup(5), idTypeGroup(5)))
    odd = False
End If   

Select Case operationType

    Case "write"
        If odd = False Then
            Set oPattern = MyElement2.GetCurrentPattern(UIA_LegacyIAccessiblePatternId)
        Else
            Set oPattern = MyElement1.GetCurrentPattern(UIA_LegacyIAccessiblePatternId)
        End If
            oPattern.SetValue (valueToWrite)
            executeOperation = "write"

    Case "read"
        If odd = False Then
            Set oPattern = MyElement2.GetCurrentPattern(UIA_LegacyIAccessiblePatternId)
        Else
            Set oPattern = MyElement1.GetCurrentPattern(UIA_LegacyIAccessiblePatternId)
        End If
            valueFound = oPattern.CurrentValue   'with this property I can retrieve the information
            executeOperation = valueFound

    Case "click"
        If odd = False Then
            Set oInvokePattern = MyElement2.GetCurrentPattern(UIAutomationClient.UIA_ValuePatternId)
            Debug.Print MyElement2.CurrentAccessKey
        Else
            Set oInvokePattern = MyElement1.GetCurrentPattern(UIAutomationClient.UIA_ValuePatternId)
            Debug.Print MyElement1.CurrentControlType
        End If
            oInvokePattern.Invoke
            executeOperation = "click"

    Case "grid"
        Set oInvokePattern = MyElement1.GetCurrentPattern(UIAutomationClient.UIA_GridPatternId)
        value = oGridPattern.getItem(1, 2)
        executeOperation = "grid"

End Select


End Function

Function PropCondition(UiAutomation As CUIAutomation, ByVal Requirement As String, ByVal idType As String) As UIAutomationClient.IUIAutomationCondition

Select Case idType
    Case "Name"
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_NamePropertyId, Requirement)
    Case "AutoID"
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_AutomationIdPropertyId, Requirement)
    Case "ClsName"
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_ClassNamePropertyId, Requirement)
    Case "LoczCon"
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_LocalizedControlTypePropertyId, Requirement)
End Select
End Function

Function WalkEnabledElements(element As UIAutomationClient.IUIAutomationElement, strWindowName As String) As UIAutomationClient.IUIAutomationElement

    Dim walker As UIAutomationClient.IUIAutomationTreeWalker

    Set walker = oAutomation.ControlViewWalker
    Set element = walker.GetFirstChildElement(element)

    Do While Not element Is Nothing
        Debug.Print element.CurrentName

        If InStr(1, element.CurrentName, strWindowName) > 0 Then
            Set WalkEnabledElements = element
            Exit Function
        End If

        Set element = walker.GetNextSiblingElement(element)
    Loop
End Function

0 个答案:

没有答案