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

运行中文件调用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:42:51