2017-08-17 48 views
0

Summary:我們需要去一個網站,下載一個Excel文件,並複製&將數據自動粘貼到Excel模板文件中。VBA - Internet Data Scrap&Download File&Copy Paste Data

當前問題:我目前的VBA代碼打開IE,數據報廢並自動下載文件沒有任何問題。但是,只有在分解模式下才會打開下載的工作簿並複製&將數據粘貼到模板中。

什麼都沒有工作:我嘗試了多種想法,如睡眠,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的應用程序擴展」引用並運行下面的代碼:

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 

更新17年8月28日:我想圍繞一個工作僅在打開工作簿時複製/粘貼數據。這個想法是完成我的主要「數據提取」代碼。代碼完成後,工作簿應該打開,因爲它的行爲之前,第二個代碼會觸發,複製/粘貼數據.-> Run VBA macro whenever any workbook is opened

結果:它仍然無法正常工作。它只會打開整個循環的最後一個工作簿,並複製&粘貼它的數據。其他4個以前的文件不會打開。

UPDATE 8.31.17另一個解決方法失敗。我試圖創建一個用戶表單,用戶將不得不點擊5個不同的按鈕。這個想法是檢查我的問題是否是循環。每個按鈕都會提取文件,然後我會觸發粘貼宏。

結果:它沒有工作。我認爲,雖然我有我的「用戶表單」打開excel認識到一個宏正在運行。如果我在中斷模式下運行它,它仍然會打開文件並複製數據。

+0

我會建議你減少你的問題的範圍...重點放在什麼不工作,這樣,你的代碼更容易閱讀和解決 – HelderSepu

+0

謝謝你爲你的建議。我剛剛編輯了我的文章,並試圖讓它更直接。 –

+0

您的代碼仍然是70多行,我相信您可以進一步減少... – HelderSepu

回答

0

我相信這對其他人來說很重要,因爲我知道我找到了解決我自己問題的方法。

的主要問題是,我的原代碼的結構是這樣的:

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

這將重複上述過程5次,每次不同的文件,我需要。

該代碼將在中斷模式下完美運行。但是,當您真正運行它時,它不會從下載的文件中恢復數據。

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).