使用VBA获取文件夹中的Excel文件列表

我需要获取文件夹中所有Excel文件的名称,然后对每个文件进行更改。 我已经完成了“改变”部分。 有没有办法获得一个文件夹中的.xlsx文件列表,如D:\Personal ,并将其存储在一个string数组中。

然后我需要遍历文件列表,并运行我想要的每个文件上的macros:

 Filepath = "D:\Personal\" For Each i in FileArray Workbooks.Open(Filepath+i) Next 

我看了这个 ,但是,我无法打开这些文件,导致它以Variant格式存储名称。

总之,如何使用VBA获取特定文件夹中的Excel文件名列表?

好吧,这可能适用于你,一个函数,获取一个path,并返回文件夹中的文件名的数组。 循环访问数组时,可以使用if语句来获取excel文件。

 Function listfiles(ByVal sPath As String) Dim vaArray As Variant Dim i As Integer Dim oFile As Object Dim oFSO As Object Dim oFolder As Object Dim oFiles As Object Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(sPath) Set oFiles = oFolder.Files ReDim vaArray(1 To oFiles.Count) i = 1 For Each oFile In oFiles vaArray(i) = oFile.Name i = i + 1 Next listfiles = vaArray End Function 

如果我们可以通过索引号访问文件对象中的文件,但是无论出于何种原因(bug?),这似乎在VBA中被破坏,那将会很好。

您可以使用内置的Dir函数或FileSystemObject。

  • Dirfunction: VBA:Dirfunction

  • FileSystemObject: VBA:FileSystemObject – 文件集合

对于一个简单的文件列表,dir命令相当容易使用。 它也支持通配符,如果你不需要每个文件都是有帮助的。 使用它的诀窍是了解如何用一个参数调用它与调用它没有一个是不同的。

 Public Sub ListFilesDir(ByVal sPath As String, Optional ByVal sFilter As String) Dim sFile As String If Right(sPath, 1) <> "\" Then sPath = sPath & "\" End If If sFilter = "" Then sFilter = "*.*" End If 'call with path "initializes" the dir function and returns the first file sFile = Dir(sPath & sFilter) 'call it again until there are no more files Do Until sFile = "" Debug.Print sFile 'subsequent calls without param return next file sFile = Dir Loop End Sub 

如果你想获得文件名以上的智能感知和更多的function,我会build议FileSystemObject。 您可以添加对“Windows脚本宿主对象模型”(或“Windows脚本运行时”)的引用并声明您的对象,如下所示:

 Public Sub ListFilesFSO(ByVal sPath As String) Dim oFSO As FileSystemObject Dim oFolder As Folder Dim oFile As File Set oFSO = New FileSystemObject Set oFolder = oFSO.GetFolder(sPath) For Each oFile In oFolder.Files Debug.Print oFile.Name Next 'oFile Set oFile = Nothing Set oFolder = Nothing Set oFSO = Nothing End Sub 
 Dim iIndex as Integer Dim ws As Excel.Worksheet Dim wb As Workbook Dim strPath As String Dim strFile As String strPath = "D:\Personal\" strFile = Dir(strPath & "*.xlsx") Do While strFile <> "" Set wb = Workbooks.Open(Filename:=strPath & strFile) For iIndex = 1 To wb.Worksheets.count Set ws = wb.Worksheets(iIndex) 'Do something here. Next iIndex strFile = Dir Loop