You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel宏使用Dir函数时出现Run-time error '1004'找不到文件的问题求助

解决Excel宏Run-time error '1004' 文件找不到问题

问题描述

运行宏时触发错误:

Run-time error '1004':sorry, we couldn't find filename Is it possible it was moved, renamed or deleted?

但文件实际存在、路径正确,且之前宏运行完全正常。

业务流程:

  • 目标文件路径:C:\Users\folder\
  • 打开命名格式为A-99-123的Excel文件
  • 在L66单元格输入22-Apr-2025格式的日期
  • 将文件另存为PDF到C:\Users\folder\dated\123\,最终PDF路径为C:\Users\folder\dated\123\A-99-123.pdf
  • 目标文件夹属于OneDrive(示例路径已做修改)

宏代码

Sub Dates()
    Dim sDate, sFile, sMerge As String
    Dim wb As Workbook
    
    sDate = Format(Date, "dd-mmm-yyyy")
    sFile = Dir("C:\Users\folder\*.xlsx")
    sMerge = ("C:\Users\folder\dated\")
    
    Do While Len(sFile) > 0
        Set wb = Workbooks.Open(sFile)
        wb.Worksheets("Dat").Range("L66").Value = sDate
        wb.Save
        wb.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sMerge & Mid(sFile, 6, 8) & "\" & Left(sFile, 8) & " app.pdf"
        wb.Close
        sFile = Dir
    Loop
    
End Sub

错误触发场景

最初运行宏时未包含PDF导出代码,所有文件能正常打开并保存日期。添加PDF导出代码后,每次运行宏都会触发错误:

Run-time error '1004':
sorry, we couldn't find A-99-123. Is it possible it was moved, renamed or deleted?

调试指向代码行:Set wb = Workbooks.Open(sFile)

已尝试的排查步骤

  • 添加新文件A-99-122,错误提示变为找不到该文件
  • 确认OneDrive同步正常,网页端和文件资源管理器均可打开文件
  • 注释掉PDF导出代码行
  • 重新粘贴并确认路径C:\Users\folder无拼写错误
  • 移除*.xlsx通配符
  • 关机重启电脑
  • 关机过夜后问题依旧

解决方案

问题核心是Dir函数仅返回文件名而非完整路径,当宏运行时当前工作目录发生变化,导致Workbooks.Open(sFile)找不到文件;同时PDF导出的路径字符串处理逻辑不可靠,且未检查目标文件夹是否存在。

修改后的宏代码:

Sub Dates()
    Dim sDate As String, sFile As String, sMerge As String
    Dim wb As Workbook
    Dim sourcePath As String
    Dim pdfFolder As String
    Dim fileBaseName As String
    
    sDate = Format(Date, "dd-mmm-yyyy")
    sourcePath = "C:\Users\folder\"
    sMerge = sourcePath & "dated\"
    
    ' 获取目标文件夹下的xlsx文件
    sFile = Dir(sourcePath & "*.xlsx")
    
    Do While Len(sFile) > 0
        ' 使用完整路径打开文件,避免当前目录变化导致找不到文件
        Set wb = Workbooks.Open(sourcePath & sFile)
        
        ' 写入日期并保存
        wb.Worksheets("Dat").Range("L66").Value = sDate
        wb.Save
        
        ' 提取文件名(不含后缀)和编号
        fileBaseName = Left(sFile, InStrRev(sFile, ".") - 1)
        pdfFolder = sMerge & Split(fileBaseName, "-")(2) & "\"
        
        ' 检查PDF保存文件夹是否存在,不存在则创建
        If Dir(pdfFolder, vbDirectory) = "" Then
            MkDir pdfFolder
        End If
        
        ' 导出PDF到指定路径
        wb.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFolder & fileBaseName & ".pdf"
        
        wb.Close SaveChanges:=False
        sFile = Dir
    Loop
End Sub

修改要点说明

  1. 使用完整路径打开文件:Workbooks.Open(sourcePath & sFile),彻底避免当前工作目录变化导致的文件查找失败
  2. 可靠提取文件编号:通过Split(fileBaseName, "-")(2)从文件名中拆分出编号,比固定位置的Mid函数更适配命名格式
  3. 自动创建PDF文件夹:提前检查并创建目标文件夹,避免因文件夹缺失导致的导出错误
  4. 明确变量类型:原代码中sDate、sFile未声明类型,默认是Variant,改为明确的String类型,避免潜在问题
  5. 关闭文件时指定参数:wb.Close SaveChanges:=False,避免不必要的保存提示

内容的提问来源于stack exchange,提问作者SFilbert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:07:11