2013-06-05 21 views
3

我有一個宏在一個XLSM工作簿的模塊中刷新所有外部數據,然後保存並關閉該工作簿。如何使用VBScript有效刷新多個Excel電子表格的外部數據?

ActiveWorkbook.RefreshAll 
ActiveWorkbook.Save 
ActiveWorkbook.Close 
Application.Quit 

我用VBScript文件來運行宏作爲計劃任務的一部分

objExcel.Workbooks.Open(fname) 
objExcel.Visible = True 
On error resume next 
objExcel.Run "RefreshAllData" 

問:我怎樣才能重新使用現有的工作簿中的現有宏刷新多個其他的所有數據工作簿? (即,我正在尋找對VBScript文件的必要修改,我想最大限度地減少對宏本身的更改。文件名將包含在VBScript文件中)TIA。

回答

5

我建議不要重新使用這樣一個微不足道的宏。而是將刷新功能併入VBScript中:

Set fso = CreateObject("Scripting.FileSystemObject") 
Set xl = CreateObject("Excel.Application") 
xl.Visible = True 

For Each f In fso.GetFolder("C:\some\folder").Files 
    If LCase(fso.GetExtensionName(f.Name)) = "xlsx" Then 
    Set wb = xl.Workbooks.Open(f.Path) 
    wb.RefreshAll 
    wb.Save 
    wb.Close 
    End If 
Next 

xl.Quit 
+0

我會按照你的建議。非常簡潔的答案。謝謝Ansgar。 – Sam

+0

這是黃金!對此我只有一個問題。當我運行它時,出現一個彈出框:「這將取消未完成的數據刷新。」[OK] [Cancel]「 我假設它是因爲數據刷新沒有足夠的時間運行,有沒有辦法讓它在保存和關閉之前等待刷新完成? @Ansgar Wiechers – KhalidN

+1

@KhalidN您似乎在某處有[異步查詢](https://msdn.microsoft.com/en-us/library/office/ff835909.aspx)。將其更改爲同步的,或者在保存/關閉工作簿之前添加延遲('WScript.Sleep')。 –

1

如果你根本不改變宏,你將不得不重新加載excel,然後打開宏工作簿,然後打開目標工作簿,然後運行宏。如果你能刪除:

Application.quit 

,那麼你至少可以保持Excel中打開並只保留每次運行宏之前打開的工作簿的目標。對我來說,將宏代碼放入vbs文件會更簡單,儘管

1

我想你可以做這樣的事情。

  1. 查找所有的Excel文件中的指定文件夾
  2. 選擇每個Excel文件並激活
  3. 通話refreshdata功能

代碼片段支持這

Sub RefreshAllExcelInFolder() 
    Dim fso 
    Dim ObjFolder 
    Dim ObjFiles 
    Dim ObjFile 
    Dim objExcel 

    'Creating File System Object 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    'Getting the Folder Object 
    Set ObjFolder = fso.GetFolder("<<C:folder path>>") 

    'Getting the list of Files 
    Set ObjFiles = ObjFolder.Files 
     'On Error Resume Next 
     For Each ObjFile In ObjFiles 
      If LCase(Right(ObjFile.Name, 5)) = ".xlsx" Or LCase(Right(ObjFile.Name, 4)) = ".xls" Then 
       Workbooks.Open(ObjFile).Activate 
       RefreshAllData 
      End If 
     Next 
End Sub 

Sub RefreshAllData() 
    ActiveWorkbook.RefreshAll 
    ActiveWorkbook.Save 
    ActiveWorkbook.Close 
    MsgBox ("Going back In") 
End Sub 

希望這將幫助

+0

幹得好。我喜歡一個答案,不僅僅是答案本身,而且實際上並沒有讓整個白皮書陷入困境。謝謝Dharmesh。 – Sam

+0

很高興能夠幫助,並看到答案的目的是服務,教。爲簡潔的代碼,我會建議Ansgar的帖子 – MrPandav

+0

我覺得你忘了創建Excel對象! – Sam

相關問題