在多个文件上运行excel宏

时间:2012-05-22 19:04:02

标签: excel excel-vba powershell vbscript vba

我在一个空白工作簿和多个数据工作簿中保存了一个excel宏。

我目前单独打开宏文件和每个数据文件,使用键盘快捷键在每个文件上运行宏。

有没有办法在所有数据工作簿上运行宏而无需打开它们,或者使用

  • 批处理文件,
  • VBA / VBScript,
  • 的powershell,
  • 或类似的东西?

5 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是将宏添加到文件PERSONAL.XLSB中。每次启动Excel时,此文件都将在后台加载。最初,PERSONAL.XLSB文件不会存在。 要自动创建此文件,只需开始录制“虚拟”宏(使用电子表格左下方的录制按钮)并选择“个人宏工作簿”将其存储。录制宏后,可以打开VBA使用[Alt] + [F10]编辑器,您将看到带有“虚拟”宏的PERSONAL.XLSB文件。 我使用此文件来存储始终可用的一般宏的负载。我已将这些宏添加到我自己的菜单功能区中。 此常见宏文件的一个缺点是,如果启动多个Excel实例,您将收到一条错误消息,表明PERSONAL.XLSB文件已被Excel实例Nr使用。 1.只要你现在不添加新的宏,这就不成问题了。

答案 1 :(得分:2)

以下两种可能的解决方案,

  1. 可以直接作为vbs文件运行
  2. 从Excel中运行的解决方案(根据Tim Williams建议)
  3. 解决方案

    Dim objFSO
    Dim objFolder
    Dim objFil
    Dim objXl
    Dim objWb
    Dim objExcel
    Set objExcel = CreateObject("Excel.Application")
    Set objFSO = CreateObject("scripting.filesystemobject")
    Set objFolder = objFSO.getfolder("c:\temp")
    For Each objFil In objFolder.Files
        If InStr(objFil.Type, "Excel") > 0 Then
            Set Wb = objExcel.Workbooks.Open(objFil.Path)
            wscript.echo Wb.name
            Wb.Close False
        End If
    Next
    

    解决方案

    Sub OpenFilesVBA()
        Dim Wb As Workbook
        Dim strFolder As String
        Dim strFil As String
    
        strFolder = "c:\Temp"
        strFil = Dir(strFolder & "\*.xls*")
        Do While strFil <> vbNullString
            Set Wb = Workbooks.Open(strFolder & "\" & strFil)
            Wb.Close False
            strFil = Dir
        Loop
    End Sub
    

答案 2 :(得分:1)

我刚刚发现你的帖子,可能很晚,但是对于所有未来的搜索。 可以通过创建.vbs文件来启动宏。 为此,请打开记事本并添加以下内容:

objExcel = CreateObject("Excel.Application")

objExcel.Application.Run <insert macro workbook file path, module and macro name here>
objExcel.DisplayAlerts = False
objExcel.Application.Save
objExcel.Application.Quit

Set objExcel = Nothing

按如下方式保存文件(“您的文件名”.vbs)

通过双击(打开)保存的.vbs文件,它将启动您的宏,而无需打开您的Excel文件。

希望这有帮助。

答案 3 :(得分:0)

您可以将宏保存在personal.xls或masterfile中,并使用vba循环遍历工作簿,并在运行宏之前激活它们。据我所知,你仍然需要用vba打开它们。

您可以使用以下内容:

sub LoopFiles
  Dim sFiles(1 to 10) as string  'You could also read this from a range in a masterfile
      sFiles(1) = "Filename1.xls"
         .
         .
      sFiles(10) = "Filename10.xls"
  Dim wb as Workbook
  Dim iCount as integer
     iCount = ubound(sFiles)
  Dim iCount2 as integer

  For iCount2 = 1 to iCount
     Workbooks(sFiles(iCount2)).open
     Workbooks(sFiles(iCount2)).activate
     Call YourMacro
     Workbooks(sFiles(iCount2)).close
  next iCount2
end sub

答案 4 :(得分:0)

其他方式,

Sub LoopAllWorkbooksOpened()

Dim wb As Workbook

For Each wb In Application.Workbooks
    Call YourMacroWithWorkbookParam(wb)
Next wb

End Sub

Sub YourMacroWithWorkbookParam(wb As Workbook)
    MsgBox wb.FullName
End Sub