使用VBA获取文件夹中Excel文件的列表
我需要获得文件夹中所有Excel文件的名称,然后对每个文件进行更改。我已经把“做出改变”的部分整理好了。是否有办法在一个文件夹中获取使用VBA获取文件夹中Excel文件的列表,vba,excel,excel-2010,Vba,Excel,Excel 2010,我需要获得文件夹中所有Excel文件的名称,然后对每个文件进行更改。我已经把“做出改变”的部分整理好了。是否有办法在一个文件夹中获取.xlsx文件列表,比如D:\Personal,并将其存储在字符串数组中 然后,我需要遍历文件列表,并在每个文件上运行宏,我想我可以使用: Filepath = "D:\Personal\" For Each i in FileArray Workbooks.Open(Filepath+i) Next 我看了一下,但是,我无法打开文件,因为它以Varian
.xlsx
文件列表,比如D:\Personal
,并将其存储在字符串数组中
然后,我需要遍历文件列表,并在每个文件上运行宏,我想我可以使用:
Filepath = "D:\Personal\"
For Each i in FileArray
Workbooks.Open(Filepath+i)
Next
我看了一下,但是,我无法打开文件,因为它以Variant
格式存储了名称
简而言之,如何使用VBA获取特定文件夹中Excel文件名的列表?Dim iIndex as Integer
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 'This moves the value of strFile to the next file.
Loop
将ws设置为Excel.Worksheet
将wb设置为工作簿
将strPath设置为字符串
作为字符串的Dim strFile
strPath=“D:\Personal\”
strFile=Dir(strPath&“*.xlsx”)
当strFile“”时执行
设置wb=Workbooks.Open(文件名:=strPath&strFile)
对于iIndex=1到wb.Worksheets.count
设置ws=wb.工作表(iIndex)
“在这里做点什么。
下一个指数
strFile=Dir'这会将strFile的值移动到下一个文件。
环
您可以使用内置的Dir函数或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 name
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 name
sFile = Dir
Loop
End Sub
如果您不想要intellisense,您可以这样做,而无需设置引用:
Public Sub ListFilesFSO(ByVal sPath As String)
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Set oFSO = CreateObject("Scripting.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
好的,这可能对你有用,一个函数,它获取路径并返回文件夹中的文件名数组。在数组中循环时,可以使用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
If oFiles.Count = 0 Then Exit Function
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
如果我们可以通过索引号访问files对象中的文件,那就太好了,但是无论出于什么原因(bug?)VBA中似乎出现了问题。如果您只需要没有文件扩展名的文件名
Dim fileNamesCol As New Collection
Dim MyFile As Variant 'Strings and primitive data types aren't allowed with collection
filePath = "c:\file directory" + "\"
MyFile = Dir$(filePath & "*.xlsx")
Do While MyFile <> ""
fileNamesCol.Add (Replace(MyFile, ".xlsx", ""))
MyFile = Dir$
Loop
主要基于此处详述的技术:关于向上投票的答案,我喜欢它,除了如果在数组公式{CSE}中使用生成的“listfiles”数组,则列表值将全部显示在水平行中。为了使它们以垂直列的形式出现,我简单地将数组设置为二维,如下所示:
ReDim vaArray(1 To oFiles.Count, 0)
i = 1
For Each oFile In oFiles
vaArray(i, 0) = oFile.Name
i = i + 1
Next
子测试()
作为对象的Dim FSO
设置FSO=CreateObject(“Scripting.FileSystemObject”)
设置folder1=FSO.GetFolder(FromPath).Files
FolderPath_1=“D:\Arun\Macro Files\UK Marco\Au的外部销售工具\Example Files\”
工作手册。添加
设置Movenamelist=ActiveWorkbook
对于文件夹1中的每个文件
移动名称列表。激活
范围(“A100000”)。结束(xlUp)。偏移量(1,0)。值=fil
ActiveCell.Offset(1,0)。选择
下一个
端接头
在VBA中连接字符串不是吗?与Filepath&i
甚至Filepath&CStr(i)
@pi yes一样,这需要更改为Filepath&i
@MatthewD谢谢,但我想生成文件夹中的文件列表。我的标题有点误导人。很抱歉。我现在改了。看来&
可能是首选。。。您需要在其他地方列出的文件吗?或者你只是想在文件中做一些事情而不列出它们?只是想在文件中做一些事情,这与你的问题相反。你想要文件名,而不仅仅是对文件做一些事情。@Raystafarian是的,但是如果我得到文件名,我可以用工作簿打开它们。open()因此,我只需要获取字符串数组中的名称列表。我仍在获取各种格式的名称,并且获取所有文件,而不仅仅是Excel文件。编写一个if语句来测试文件名。。。如果LCase(Right(sPath,5))=“.xlsx”,则或您可能希望查看File.Type属性。将变量声明为正确的类型,并且它们不会是变量。对于Dir版本,为+1。需要考虑的一件事是DIR在调用时读取下一个文件。如果您在当前选定的文件上执行任何任务,它可能会对文件重新排序,因此即使您希望打开另一个文件,也不会打开它。为了避免这种情况,将文件列表读入字符串数组,然后使用该列表执行所有操作。值得知道的是,Dir方法比FSO方法快得多。在修改这两种方法以写入字符串数组(因为Debug.Print本身非常慢)之后,我发现对于包含大约3000个文件的文件夹,Dir方法在0.009秒内执行,FSO方法在13秒内执行,系数为1400!这管用!唯一的问题是它是一个变量数组,我需要它们作为字符串,但类型转换不能正常工作。在那之后,我需要打开它们中的每一个。它是一个包含在变量中的字符串,在可能使用字符串的地方使用它应该不会有问题。你确定不是其他原因导致了你的错误吗?你能发布违规代码吗?另外,我不使用数组作为以后打开的文件名列表,我使用的是文件集合,这可能也适用于您。我发现了我的问题。我对oFiles工作簿中的每个I使用迭代文件。Open(oFiles(I))
只需将其更改为I。我的错!谢谢你的帮助!我可以阅读并认为我理解了上面的代码在大部分情况下所做的工作,如何修改上面的代码,以便它也可以从子文件夹中获取文件名?
Dim fileNamesCol As New Collection
Dim MyFile As Variant 'Strings and primitive data types aren't allowed with collection
filePath = "c:\file directory" + "\"
MyFile = Dir$(filePath & "*.xlsx")
Do While MyFile <> ""
fileNamesCol.Add (Replace(MyFile, ".xlsx", ""))
MyFile = Dir$
Loop
Dim myWs As Worksheet: Set myWs = Sheets("SheetNameToDisplayTo")
Dim ic As Integer: ic = 1
For Each MyFile In fileNamesCol
myWs.Range("A" & ic).Value = fileNamesCol(ic)
ic = ic + 1
Next MyFile
ReDim vaArray(1 To oFiles.Count, 0)
i = 1
For Each oFile In oFiles
vaArray(i, 0) = oFile.Name
i = i + 1
Next