运行中文件调用.Attachments.Add报错80070020的问题咨询
解决Outlook添加当前运行文件作为附件时的文件占用错误
这个问题我之前也碰到过,错误码-2147024864 (80070020)本质是文件被其他进程锁定/占用导致的,结合你的描述来拆解问题和解决方案:
问题根源分析
你提到“当前运行代码的文件”作为附件时报错,但关闭该文件后用其他宏添加就正常——这说明正在运行宏的Excel本身锁定了这个文件。当宏执行时,宿主程序(Excel)会保持对当前工作簿的独占访问锁,Outlook尝试读取这个文件时就会被拒绝。另外你的文件存在OneDrive里,OneDrive的实时同步机制也可能在后台占用文件,双重锁定导致了这个突然出现的问题(之前正常可能是同步机制的触发时机变化了)。
可行的解决方案
1. 复制文件到临时目录,添加副本作为附件
既然原文件被锁定,我们可以先创建一个临时副本,用副本作为附件,发送完成后再删除临时文件。示例VBA代码如下:
Sub AttachCurrentWorkbookToOutlook() Dim outlookApp As Object Dim outlookMail As Object Dim tempPath As String Dim tempFileName As String ' 初始化Outlook对象 Set outlookApp = CreateObject("Outlook.Application") Set outlookMail = outlookApp.CreateItem(0) ' 生成临时文件路径(避免重名) tempPath = Environ("TEMP") & "\" tempFileName = tempPath & "Temp_Copy_" & Format(Now(), "YYYYMMDDHHMMSS") & "_" & ThisWorkbook.Name ' 保存当前工作簿的副本 ThisWorkbook.SaveCopyAs tempFileName ' 构建邮件并添加临时附件 With outlookMail .To = "recipient@example.com" .Subject = "测试附件" .Body = "请查看附件" .Attachments.Add tempFileName .Display ' 或者用 .Send 直接发送 End With ' 清理临时文件(注意:如果邮件还在草稿状态,文件可能被占用,建议发送后再删除) ' Kill tempFileName ' 释放对象 Set outlookMail = Nothing Set outlookApp = Nothing End Sub
2. 排查OneDrive同步的影响
OneDrive的实时同步可能在宏运行时后台锁定文件,你可以尝试:
- 暂时暂停OneDrive同步,再运行宏测试是否正常
- 如果移出OneDrive到本地目录可以解决,考虑将文件保留在本地,或者调整OneDrive的同步设置(比如关闭“文件随选”功能,确保文件完全下载到本地)
3. 检查其他占用进程
有时候杀毒软件的实时扫描、Office后台服务也可能锁定文件,你可以:
- 暂时关闭杀毒软件的实时保护,测试宏是否正常
- 打开任务管理器,查看是否有其他Excel进程或Office相关进程在后台运行,结束多余进程后重试
内容的提问来源于stack exchange,提问作者bird72486
相关产品推荐
相关产品推荐

