Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3585|回复: 1

如何基于vba循环查找文件夹下包含某指定字符串的文件名

[复制链接]
发表于 2020-4-2 17:29 | 显示全部楼层 |阅读模式
本帖最后由 cnhnhsh 于 2020-4-2 17:29 编辑

如何基于vba循环查找文件夹下包含某指定字符串的文件名?问题说明:
在EXCEL名单表中有“姓名,绝对路径文件名”  这2个字段,要根据表中的姓名查找文件夹“E:\GZ”下包含姓名的所有文件名,如果没有找到就在“绝对路径文件名”单元格写“没找到”,如果找到了就将包含该姓名的多个文件名写到表中的“绝对路径文件名”单元格里。
数据如下:
E:\GZ下的文件有:
张三工资表.docx
张三工资表2019.9.doc
张三简历表.doc
李四简历表.docx
李四工资表.xls
王五简历表.docx
......

程序要实现如下功能:
名单表.xlsx:
姓名    绝对路径文件名
张三    张三工资表.docx、张三工资表2019.9.doc、张三简历表.doc
李四    李四简历表.docx、李四工资表.xls
王五    王五简历表.docx
黄六    没找到
......

感谢老师!



excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2020-4-3 08:58 | 显示全部楼层
本帖最后由 hfwufanhf2006 于 2020-4-3 09:00 编辑

我给你我个人经常使用的文件检索函数,代码没几行:
Function GetFilesList(myPath As String) '获得当前路径的全部文件,不区分文件类型
Dim myArr()
myJs = 0
Set myFolder = CreateObject("Scripting.FileSystemObject").GetFolder(myPath)
For Each mySubfile In myFolder.Files
    myJs = myJs + 1
    ReDim Preserve myArr(1 To myJs)
    myArr(UBound(myArr)) = mySubfile.Name
Next
GetFilesList = myArr
End Function

说明:
myPath:路径
上面的函数会获得指定目录下的全部文件,不分文件类型,结果以一维数组的形式返回;
要引用这个函数,类似下面的简单定义就可以:
dim arr()
dim Path as string
Path="e\gz"
arr=GetfilesList(Path)

至于要达到你说的排列要求,则需要你的排列算法了;
我看你的排列规则,直接检索或者字典应该都可以,通常文件列表的数据量不大,直接检索结构上更简单,也不会影响速度(没实测):
range("b2:b10000").clearcontents
for i=1 to ubound(arr)
     for k=2 to [a10000].end(3).row    '假设数据从第2行开始,第一行通常是标题
          if instr(arr(i),cells(i,1))>0 then
             cells(k,2)=iif(isempty(cells(k,2)),arr(i),cells(k,2) & "," & arr(i))
          endif
     next k
next i
上面的代码理论上会按照a列的姓名定义,在b列中把文件列表对应分开排列,每个文件中用",”来分隔;
如果没有对应姓名的文件,那么b列应该就是空白,而不是文字定义“没找到”,如果你喜欢这个文字定义,需要再检索一遍b列清单,把所有的空行转换成文字“没找到”,我个人认为没这个必要;

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 17:20 , Processed in 0.441578 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表