我知道此问题的一个非常相似的形式之前曾被多次询问过,但我在使用我的宏时遇到了一些问题。
基本上,我需要的是拥有一个宏,它将运行数百个文件,所有文件都位于同一个文件夹中,然后"保存"新文件(不替换旧文件)在单独的文件夹/目录中。显然,无需单独打开每个文件并反复运行宏。
我已经尝试了一些不同的建议但是它们都导致我的功能完全正常的宏发生了彻底不必要的更改,或者已经结束了大量错误。
原始文件的位置是 - > 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
我已尝试使用上述代码,但它并不适用于我。还有另一种方法可以让我的宏在整个文件夹中工作吗?
答案 0 :(得分:0)
这是循环指定文件夹中文件的简单方法。
这假设您当前的宏作用于ActiveWorkbook
并且已经执行:
尝试:
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,了解避免Select
和Activate
方法的方式(以及原因)。