Ошибка времени выполнения UIAutomation VBA :- «Событие не смогло вызвать ни одного из подписчиков»

#excel #vba #automation #ui-automation

Вопрос:

цель кода проста. найдите «окно» счета -фактуры — > введите номер загрузки из excel ->> нажмите кнопку печать

Код безошибочен, но в строке (упомянутой ниже) код останавливается во время «вызова», и через несколько секунд он показывает ошибку

Событие не смогло вызвать ни одного из подписчиков

если я сам нажму кнопку, в клиентском приложении не будет ошибок или проблем.

 Set oInvokePattern = MyElement1.GetCurrentPattern(UIAutomationClient.UIA_InvokePatternId)
 

oInvokePattern.Взывать

что можно сделать? это облегчит мою ручную работу по копипастированию тоннами.

 Dim MyElement As UIAutomationClient.IUIAutomationElement
Dim MyElement1 As UIAutomationClient.IUIAutomationElement

Public Enum oConditions
   eUIA_NamePropertyId
   eUIA_AutomationIdPropertyId
   eUIA_ClassNamePropertyId
   eUIA_LocalizedControlTypePropertyId
End Enum

Sub From22_printing()

Dim AppObj As UIAutomationClient.IUIAutomationElement
Dim oInvokePattern As UIAutomationClient.IUIAutomationInvokePattern
Dim oAutomation As New CUIAutomation ' the UI Automation API
Dim oPattern As UIAutomationClient.IUIAutomationLegacyIAccessiblePattern

Dim FormPrint As Worksheet
Dim Pcount As Long

Set FormPrint = ThisWorkbook.Sheets("Form22 Print")
Pcount = Application.WorksheetFunction.CountA(FormPrint.Columns(1))

Set AppObj = WalkEnabledElements("Invoice Printing")
If AppObj Is Nothing Then
    
    MsgBox "Form22 Not Open"
End
End If

For NOP = 2 To Pcount

'Find Load Number
Set MyElement = AppObj.FindFirst(TreeScope_Children, PropCondition(oAutomation, eUIA_AutomationIdPropertyId, "txtloadno"))
Set oPattern = MyElement.GetCurrentPattern(UIA_LegacyIAccessiblePatternId)
oPattern.SetValue (FormPrint.Cells(NOP, 1).Value)

Application.Wait (Now   TimeValue("0:00:02"))

'select Print
Set MyElement1 = AppObj.FindFirst(TreeScope_Children, PropCondition(oAutomation, eUIA_AutomationIdPropertyId, "btnprint"))
Set oInvokePattern = MyElement1.GetCurrentPattern(UIAutomationClient.UIA_InvokePatternId)
oInvokePattern.Invoke
    
Application.Wait (Now   TimeValue("0:00:10"))
  
Next NOP
  
End Sub


Function PropCondition(UiAutomation As CUIAutomation, Prop As oConditions, Requirement As String) As UIAutomationClient.IUIAutomationCondition
Select Case Prop
    Case 0
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_NamePropertyId, Requirement)
    Case 1
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_AutomationIdPropertyId, Requirement)
    Case 2
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_ClassNamePropertyId, Requirement)
    Case 3
        Set PropCondition = UiAutomation.CreatePropertyCondition(UIAutomationClient.UIA_LocalizedControlTypePropertyId, Requirement)
End Select
End Function

Function WalkEnabledElements(strWindowName As String) As UIAutomationClient.IUIAutomationElement
    Dim oAutomation As New CUIAutomation
    Dim condition1 As UIAutomationClient.IUIAutomationCondition
    Dim condition2 As UIAutomationClient.IUIAutomationCondition
    Dim walker As UIAutomationClient.IUIAutomationTreeWalker
    Dim element As UIAutomationClient.IUIAutomationElement

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

    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

 

Комментарии:

1. для будущего пользователя : просто добавление сна решило проблему для меня. но много раз я все еще получаю эту ошибку.

Ответ №1:

Как насчет этого кода?

 MyElement1.SetFocus

SendKeys "{Enter}"