惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
美团技术团队
腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
博客园_首页
V
V2EX
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss

博客园 - 云起

ArcGISPro SDK Addin打包机制 一次 ArcGISPro Addin项本地化的排查实录 记一次arm机器装系统的经历 记一次vs中无法找到win sdk的问题 arcpy运行时,报错产品许可尚未初始化 Visual Studio 2022生成解决方案代码图报错“无法连接到指定的数据库” win10下定制文件夹 ArcGISPro SDK 3.1版本中使用QueuedTask的小问题 Compress-Archive压缩zip包的小瑕疵 Pro更新字段别名,重载数据后失效 在多个office文档内替换关键字 git日志分组 xlst处理时命名空间带来的小坑 更新压缩流 使用excel生成简单的日历 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常 使用C#获取文件详情 Pro更改启动界面 使用AES加密时,结果不一样 命令行程序读取注册表失败的分析 pg_index
excel中,根据文件名查询文件路径
云起 · 2025-08-07 · via 博客园 - 云起

excel内置函数,没有提供文件搜索的功能。所以引入VBA代码,来进行辅助。

Sub CheckFilesExistence()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim fileName As String
    Dim fso As Object
    Dim basePath As String
    Dim result As String
    
    ' 设置工作表和基础路径(最好使用绝对路径)
    Set ws = ThisWorkbook.Sheets(1)
        basePath = "myfolder" ' 修改为实际路径
    
    ' 初始化文件系统对象。使用
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' 获取A列最后一行
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 预处理:缓存所有文件路径(以文件名为键,路径为值)
    Dim allFiles As Object
    Set allFiles = GetFilesInFolderTree(fso, basePath)
    
    ' 遍历A列文件名,快速查询缓存并返回路径
    For i = 1 To lastRow
        fileName = ws.Cells(i, 1).Value
        If fileName <> "" Then
            ' 直接检查文件名是否存在于缓存
            If allFiles.Exists(fileName) Then
                result = "存在,路径:" & allFiles(fileName)
            Else
                result = "不存在"
            End If
            ws.Cells(i, 2).Value = result
        Else
            ws.Cells(i, 2).Value = "文件名为空"
        End If
    Next i
    
    Set allFiles = Nothing
    Set fso = Nothing
End Sub

' 预加载目录树内所有文件路径到字典,通过队列,避免递归
Function GetFilesInFolderTree(fso As Object, ByVal folderPath As String) As Object
    Dim filesDict As Object
    Set filesDict = CreateObject("Scripting.Dictionary")
    
    ' 检查路径是否有效
    If Not fso.FolderExists(folderPath) Then Exit Function
    
    Dim queue As Object
    Set queue = CreateObject("System.Collections.Queue") ' 使用队列实现迭代
    queue.Enqueue fso.GetFolder(folderPath)
    
    Dim currentFolder As Object
    Dim subFolder As Object
    Dim file As Object
    
    ' 非递归遍历所有文件夹
    Do While Not queue.Count = 0
        Set currentFolder = queue.Dequeue()
        
        ' 遍历当前文件夹下的所有文件,存入字典(文件名为键,完整路径为值)
        For Each file In currentFolder.Files
            ' 存储格式:Key=文件名,Value=完整路径(含文件名),按格式需要调整
            filesDict(file.Name) = file.Path
        Next
        
        ' 将子文件夹加入队列继续处理
        For Each subFolder In currentFolder.SubFolders
            queue.Enqueue subFolder
        Next
    Loop
    
    Set GetFilesInFolderTree = filesDict
End Function

filesystemobject参考