VBA - 互联网数据报废&下载文件&复制粘贴数据

时间:2017-08-17 19:07:19

标签: vba internet-explorer download

摘要:我们需要访问网站,下载Excel文件,并自动将数据复制并粘贴到Excel模板文件中。

当前问题:我当前的VBA代码打开IE,数据报废并自动下载文件没有任何问题。但是,仅在中断模式下,它会打开下载的工作簿并将数据复制并粘贴到模板中。

什么没有用?我尝试了多种想法,如Sleep,Application.Wait和DoEvents。不幸的是,它一直停留在同一条线上。代码无法识别工作簿已打开,无法找到要复制和粘贴的数据。只有在我进入休息模式后,文件才会最终打开。

观察:删除了Excel上的安全设置,因此打开文件时不会收到警告消息。

此代码段是循环的一部分,它将为下面的5个不同文件执行相同的过程。下载每个文件后,它会将数据复制并粘贴到我的模板中。

任何想法&解决方案完全受欢迎!

请在下面找到我的代码:

sub test()

'-----------------------------------
'Code to do the Data Scrap in here. It works fine.
'-----------------------------------

Dim o As IUIAutomation
Dim e As IUIAutomationElement
Dim h As Long
Dim wkbook As Workbook
Dim Cwkbook As String, ThisWkbook As String

'Code to Automate IE Download
Set o = New CUIAutomation
h = ieApp.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

'Download Completed and File Should be opened.
    DoEvents
    Application.Wait Now + #12:00:10 AM#
'Even after using DoEvents & Application.Wait, the code won't open the workbook until it goes into Break Mode.

'Code to find Downloaded Workbook which will come named either as X or Y.
ThisWkbook = ThisWorkbook.Name
For Each wkbook In Application.Workbooks
    If Left(wkbook.Name, 9) = "XXXXXXXXX" Or Left(wkbook.Name, 9) = "YYYYYYYYY" Then
        Cwkbook = wkbook.Name
        '-----------------------------------
        'Code to Copy&Paste data in here. It works fine.
        '-----------------------------------
    End If
Next

End Sub

您需要UIAutomationClient引用才能使代码正常工作。如果在包含它时遇到错误(就像我一样),请添加" Microsoft Visual Basic for Applications Extensibility"引用并运行以下代码:

Sub MyUIAutomation()

'----------------------------------------------------
'Add UIAutomation as VBA Reference
'----------------------------------------------------

Dim VBProj As VBIDE.VBProject

Set VBProj = ThisWorkbook.VBProject

VBProj.References.AddFromFile Environ("systemroot") & "/system32\uiautomationcore.dll"

Set VBProj = Nothing

End Sub

更新8.28.17 :我尝试过只在打开工作簿时复制/粘贴数据。我的想法是完成我的主要数据提取"码。代码完成后,工作簿应该按照之前的行为打开,第二个代码将触发,复制/粘贴数据.-> Run VBA macro whenever any workbook is opened

结果:它仍然无效。它只会打开整个循环的最后一个工作簿并复制并粘贴它的数据。其他4个以前的文件不会打开。

更新8.31.17 另一种解决方法失败。我尝试创建一个用户表单,用户必须单击5个不同的按钮。我的想法是检查我的问题是否是循环。每个按钮都会提取文件,之后我的复制和粘贴宏将会触发。

结果:它没有用。我想,虽然我有我的"用户表格" open excel识别出宏正在运行。如果我在中断模式下运行它,它仍然会打开文件并复制数据。

1 个答案:

答案 0 :(得分:0)

我相信其他人知道我找到了解决自己问题的方法很重要。

主要问题是我的原始代码是这样构建的:

'Open IE -> Search for a specific criteria -> Download File -> Open File -> Copy&Paste File.

对于我需要的每个不同文件,它将重复上述过程5次。

代码在break模式下运行完美。但是,当您实际运行它时,它不会从下载的文件中提取数据。

FIX:这是一个解决方法。我将代码分成几部分。第一部分是搜索,下载和打开我想要的文件。当打开具有特定名称的文件时,第二部分将触发。然后它将执行我需要的所有剩余步骤。

我使用Workbook_Open事件来做这件事:

Private Sub Workbook_Open()

第三个也是最后一个,是使用圆形,正方形和文本框等形状创建的表单。它实际上看起来比用户形式更好。每个圆圈都像按钮一样执行,并在点击时触发特定文件的下载。

现在代码结构如下:

'1. Form using Shapes, each circle activates a specific script
'2. 5 Scripts -> Open IE, Search for a specific criteria, Download File, Open File
'3. 1 Script. Only Triggers when Excel Workbooks are opened. It will then only copy the data over if it meets certain criteria (such as filename).