6

我在一个 XLSM 工作簿的模块中有一个宏,它刷新所有外部数据,然后保存并关闭该工作簿。

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。

4

3 回答 3

13

我建议不要重新使用这样的微不足道的宏。而是在 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
于 2013-06-05T09:27:05.983 回答
2

我想你可以做这样的事情。

  1. 查找给定文件夹中的所有excel文件
  2. 选择每个 Excel 文件并激活
  3. 调用刷新数据函数

支持这一点的代码片段

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

希望这会有所帮助

于 2013-06-05T07:31:18.733 回答
1

如果您根本不更改宏,则必须继续重新加载excel,然后打开宏工作簿,然后打开目标工作簿,然后运行宏。如果可以删除:

Application.quit

那么您至少可以保持 excel 打开,并在每次运行宏之前保持打开目标工作簿。在我看来,将宏代码放入 vbs 文件会更简单

于 2013-06-05T06:55:39.113 回答