excel中使用VBA提取指定文件夹中指定扩展名的所有文件名的技巧

在不使用VBA,列出指定文件夹的所有文件名的教程里,我们曾借助Excel内置的FILES函数配合定义名称,将指定目录下的文件名逐一抓取到工作表中。本次内容将实现更精准的控制——依据扩展名进行筛选,只挑出符合需求的文件类型(例如仅获取 .xlsx 或 .jpg 文件)。通过编写一个自定义函数(UDF),你能够像调用Excel原生函数一样轻松完成这项任务。

利用VBA创建一个自定义函数(UDF),即可快速取得某个文件夹下具备特定扩展名的所有文件名称。

代码来了

'================================================
' 函数名称:GetFileNamesbyExt
' 功能描述:获取指定文件夹中特定扩展名的所有文件名
' 参  数:FolderPath - 文件夹路径
' FileExt - 文件扩展名(如".xlsx")
' 返 回 值:包含文件名的数组
'================================================
Function GetFileNamesbyExt(ByVal FolderPath As String, FileExt As String) As Variant
Dim Result As Variant
Dim i As Integer
Dim MyFile As Object
Dim MyFSO As Object
Dim MyFolder As Object
Dim MyFiles As Object
Set MyFSO = CreateObject("Scripting.FileSystemObject")
Set MyFolder = MyFSO.GetFolder(FolderPath)
Set MyFiles = MyFolder.Files
ReDim Result(1 To MyFiles.Count)
i = 1
For Each MyFile In MyFiles
If InStr(1, MyFile.Name, FileExt) <> 0 Then
Result(i) = MyFile.Name
i = i + 1
End If
Next MyFile
ReDim Preserve Result(1 To i - 1)
GetFileNamesbyExt = ResultEnd Function

上述代码定义了一个名为GetFileNamesbyExt的函数,它可以直接在工作表公式中像内置函数那样调用。

如何使用这个函数?

插入模块:按下 Alt + F11 打开VBE编辑器,插入一个标准模块,将上面的代码粘贴进去。
使用公式提取

在任意单元格中输入需要列出文件名的文件夹路径,本例中放在单元格A1;在另一个单元格中输入目标扩展名,例如放在单元格B1。接着,在希望显示文件名的起始单元格(示例中为A3)输入以下公式:

=IFERROR(INDEX(GetFileNamesbyExt($A$1,$B$1),ROW()-2),"")

向下拖动填充公式,直到所有符合条件的文件名都显示出来,效果如下图1所示。

注意,公式里使用了ROW()-2,因为公式起始于第三行,这样在向下复制时索引会逐行递增1。如果你在某一行的首行输入公式,则可以直接使用ROW()。

特别提示

如果省略第二个参数(扩展名),函数将返回文件夹中的全部文件名;
扩展名是否区分大小写?不必担心,InStr 函数默认不区分大小写,可放心使用;
路径末尾是否需要添加反斜杠?不需要,GetFolder 方法会自动处理。

写在最后

这个小型工具在以下场景中尤为实用:

整理照片时批量提取所有 .jpg 文件;
汇总报表时一次性抓取所有 .xlsx 文件;
清理系统时列出所有 .tmp 临时文件。

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?