在多个Excel文件上运行宏并将其保存在新目录中

时间:2014-06-23 16:05:06

标签: excel vba excel-vba rename

我知道此问题的一个非常相似的形式之前曾被多次询问过,但我在使用我的宏时遇到了一些问题。

基本上,我需要的是拥有一个宏,它将运行数百个文件,所有文件都位于同一个文件夹中,然后"保存"新文件(不替换旧文件)在单独的文件夹/目录中。显然,无需单独打开每个文件并反复运行宏。

我已经尝试了一些不同的建议但是它们都导致我的功能完全正常的宏发生了彻底不必要的更改,或者已经结束了大量错误。

原始文件的位置是 - > F:\ Reports_Complete \ Reports_201308_2014 \
。 。 。该文件夹仅包含Macro需要运行的文件,它们都是.csv文件(最终文件应为.xls)。 。

宏运行后文件的位置应为 - > F:\ Reports_Complete \

与复制我的几百行Macro的全部内容相反,以下是重要的一行:

在宏的开头:

ActiveWorkbook.SaveAs Filename:="F:\Reports_Complete\EXT872_VTDT_" & Range("B2").Text & ".xls"

........................

在宏的末尾:

With ActiveWorkbook
'MsgBox .FileFormat, , .FullName
Application.DisplayAlerts = False
.SaveAs .FullName, xlNormal
Application.DisplayAlerts = True
'MsgBox .FileFormat, , .FullName
End With

我会非常感谢一些帮助,如果可能的话,不会跳过任何步骤或程序; - )

再次感谢!!!

修改

Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook

Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.csv")
Do While Filename <> ""
    Set wb = Workbooks.Open(Pathname & Filename)
    DoWork wb
    wb.Close SaveChanges:=True
    Filename = Dir()
Loop
End Sub

..........

Sub DoWork(wb As Workbook)
With wb
'Here is where my code is
End With
End Sub

我已尝试使用上述代码,但它并不适用于我。还有另一种方法可以让我的宏在整个文件夹中工作吗?

1 个答案:

答案 0 :(得分:0)

这是循环指定文件夹中文件的简单方法。

这假设您当前的宏作用于ActiveWorkbook并且已经执行:

  1. 格式化范围中的值(&#34; B2&#34;)
  2. 将文件另存为新文件到指定目的地
  3. 尝试:

    Sub LoopFile()
    'Enable reference to Microsoft Scripting Runtime if you want to use early binding
        Dim fso as Object  'Scritping.FileSystemObject
        Dim fldr as Object 'Scripting.Folder
        Dim file as Object 'Scripting.File
        Dim wb as Workbook
    
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set fldr = fso.GetFolder("F:\Reports_Complete\Reports_201308_2014\")
    
        For Each file In fldr.Files
            'Open the file
            Set wb = Workbooks.Open(file.Path)
            '## You will need to modify this line to refer to the correct
            '    module name and macro name:
            Application.Run "Personal.xlsb!Module1.Macro6"
    
            'Close the file (it was saved in Macro6 already)
            wb.Close
        Next
    
        Set file = Nothing
        Set fldr = Nothing
        Set fso = Nothing
    End Sub
    

    NB 我通常不建议您依赖ActiveWorkbook,但我不会筛选数百行代码来优化它。我建议您阅读THIS,了解避免SelectActivate方法的方式(以及原因)。