【发布时间】:2014-11-20 04:50:49
【问题描述】:
我正在尝试从网站下载 Excel 表格。到目前为止,我已经实现了自动单击下载按钮(网络抓取)。现在ie9正在弹出另存为屏幕。我如何实现自动化?
【问题讨论】:
标签: vba internet-explorer automation
我正在尝试从网站下载 Excel 表格。到目前为止,我已经实现了自动单击下载按钮(网络抓取)。现在ie9正在弹出另存为屏幕。我如何实现自动化?
【问题讨论】:
标签: vba internet-explorer automation
你可以试试这个,因为它在 IE9 上对我有用:
C:\Windows\System32\UIAutomationCore.dll文件复制到用户文档,即C:\Users\admin\Documents,然后将引用UIAutomationClient添加到您的宏文件中。 将以下代码粘贴到您的模块中:
Option Explicit
Dim ie As InternetExplorer
Dim h As LongPtr
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
Sub Download()
Dim o As IUIAutomation
Dim e As IUIAutomationElement
Set o = New CUIAutomation
h = ie.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)
Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Save")
Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
End Sub
尽你所能。
【讨论】:
UIAutomationCore.dll 复制到您的文件夹中。
PtrSafe 未被识别。它说 Expected: Sub or Function
If h = 0 Then Exit Sub之后如何关闭窗口?
'This is a working code for vba in excel 2007 to open a file
'But you need to add the "UIAutomationCore.dll" to be copied
'from "C:\Windows\System32\UIAutomationCore.dll" into the
'path "C:\Users\admin\Documents"
'The path where to copy may be different and you can find it when you check on
'the box for UIAutomationClient - the location is given under it.
'Tools-references
Option Explicit
Dim ie As InternetExplorer
Dim h As LONG_PTR
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LONG_PTR, ByVal hWnd2 As LONG_PTR, ByVal lpsz1 As String, ByVal lpsz2 As String) As LONG_PTR
Sub click_open()
Dim o As IUIAutomation
Dim e As IUIAutomationElement
Dim sh
Dim eachIE
Do
Set sh = New Shell32.Shell
For Each eachIE In sh.Windows
' Check if this is the desired URL
' Here you can use your condition except .html
' If you want to use your URL , then put the URL below in the code for condition check.
' This code will reassign your IE object with the same reference for navigation and your issue will resolve.
If InStr(1, eachIE.LocationURL, "<enter your page url>") Then
Set ie = eachIE
Exit Do
End If
Next eachIE
Loop
Set o = New CUIAutomation
h = ie.Hwnd
h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
If h = 0 Then Exit Sub
Set e = o.ElementFromHandle(ByVal h)
Dim iCnd As IUIAutomationCondition
Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Open")
Dim Button As IUIAutomationElement
Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
End Sub
【讨论】:
我把快捷键发到IE11了。
注意:如果 IE 不是您机器上的活动窗口,代码将不会按您的预期运行,因此它在调试模式下将无法运行。快捷键和发送方法如下。
Application.SendKeys "%{S}"
【讨论】: