如何解决VBA UIAutomation 运行时错误:-“事件无法调用任何订阅者”
代码的目的很简单。 找到发票的“窗口” -> 从 excel 中输入装载数量 -> 点击打印按钮
代码没有错误,但在代码行(下面提到)处,代码在“调用”期间暂停,几秒钟后,它显示错误
如果我自己选择按钮,则客户端应用程序中没有错误或问题。
Set oInvokePattern = MyElement1.GetCurrentPattern(UIAutomationClient.UIA_InvokePatternId)
oInvokePattern.Invoke
能做什么?它将减轻我大量复制粘贴的手动工作。
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,"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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。