VBA代码执行报错:Attachments.Add无法找到指定文件,求排查解决
VBA运行时错误:找不到文件的排查与修复
错误信息
Runtime error: "Cannot find this file, verify the file name and path are correct."
问题根源
附件路径不完整
代码添加附件时仅使用NewPDFName(文件名),未拼接SavePDFFolder指定的保存路径。系统默认在Excel当前工作簿目录查找文件,但实际PDF被保存到SavePDFFolder对应的文件夹,路径不匹配导致找不到文件。SendKeys保存逻辑不稳定
- 用
SendKeys模拟保存操作时,未确保保存对话框定位到SavePDFFolder,可能导致文件存到PDF阅读器默认目录而非目标文件夹。 Application.Wait设置的等待时间过短,文件尚未完成保存就执行添加附件操作,此时文件还未生成,自然找不到。
- 用
修复方案
1. 拼接完整文件路径(核心修复)
修改附件添加代码,将保存文件夹和文件名拼接成完整路径,确保系统准确定位文件:
' 确保保存文件夹路径末尾带斜杠 If Right(SavePDFFolder, 1) <> "\" Then SavePDFFolder = SavePDFFolder & "\" End If ' 生成完整PDF路径 Dim FullPDFPath As String FullPDFPath = SavePDFFolder & NewPDFName ' 替换原邮件附件添加代码 With OutMail ' ...其他邮件设置... .Attachments.Add FullPDFPath ' ...其他邮件设置... End With
2. 优化SendKeys保存流程(可选但推荐)
SendKeys依赖窗口状态和系统响应速度,稳定性差。若使用Acrobat处理PDF表单,建议改用Acrobat VBA对象模型直接操作,避免模拟按键:
Dim AcroApp As Object, AcroDoc As Object, AcroField As Object Set AcroApp = CreateObject("AcroExch.App") Set AcroDoc = CreateObject("AcroExch.PDDoc") ' 打开PDF模板文件(替换为你的模板路径) If AcroDoc.Open("你的PDF模板完整路径") Then ' 填充表单字段(替换为实际字段名) Set AcroField = AcroDoc.GetPDField("PayoutDate") AcroField.Value = PayoutDate Set AcroField = AcroDoc.GetPDField("TotalPayout") AcroField.Value = TotalPayout Set AcroField = AcroDoc.GetPDField("FullName") AcroField.Value = FirstName & " " & LastName Set AcroField = AcroDoc.GetPDField("AmountName") AcroField.Value = AmountName ' 直接保存到指定路径 AcroDoc.Save 1, FullPDFPath AcroDoc.Close End If AcroApp.Exit ' 释放对象 Set AcroField = Nothing Set AcroDoc = Nothing Set AcroApp = Nothing
若必须用SendKeys,需先切换到目标文件夹并延长等待时间:
Application.SendKeys "^+(s)", True Application.Wait Now + 0.0001 ' 延长等待确保保存对话框弹出 ' 切换到地址栏并输入保存路径 Application.SendKeys "%(d)", True Application.SendKeys SavePDFFolder, True Application.SendKeys "{Enter}", True Application.Wait Now + 0.0001 ' 输入文件名并确认保存 Application.SendKeys NewPDFName, True Application.Wait Now + 0.0001 Application.SendKeys "{Enter}", True Application.Wait Now + 0.0002 ' 等待文件保存完成
3. 增加文件存在检查
添加附件前验证文件是否存在,提前拦截错误:
If Dir(FullPDFPath) = "" Then MsgBox "PDF文件未生成或路径错误:" & FullPDFPath, vbCritical Exit Sub ' 终止流程或添加错误处理逻辑 End If
内容的提问来源于stack exchange,提问作者USLDan
相关产品推荐
相关产品推荐

