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

如何实现Outlook宏等待TIFF转存的PDF完全保存后再附加?

解决PDF文件未完全保存就附加导致损坏的问题

问题分析

你当前通过判断文件大小是否大于0来决定是否附加,但Microsoft Print to PDF在开始写入文件时,文件大小就会立刻变为非0,此时文件内容还未完全写入完成,直接附加会导致文件损坏。仅循环等待文件大小>0的逻辑对大文件完全无效。

可行解决方案

正确的判断方式是检查文件是否处于系统锁定状态——文件在保存过程中会被系统锁定,无法被其他程序打开,只有当文件完全保存完成后,锁定才会解除。我们可以通过尝试打开文件的方式来判断是否锁定,循环等待直到文件可正常打开,同时增加超时机制避免无限等待。

完整VBA代码实现

  1. 先添加检查文件锁定的函数:
Private Function IsFileLocked(filePath As String) As Boolean
    Dim fileNum As Integer
    Dim errNum As Integer
    
    On Error Resume Next
    fileNum = FreeFile()
    ' 尝试以独占方式打开文件
    Open filePath For Input Lock Read Write As #fileNum
    Close #fileNum
    errNum = Err.Number
    On Error GoTo 0
    
    ' 错误号70表示文件被锁定
    IsFileLocked = (errNum = 70)
End Function
  1. 修改你的等待逻辑,替换原来的大小判断循环:
Dim pdfPath As String
pdfPath = "你的PDF文件完整路径" ' 替换成实际的PDF路径
Dim waitTime As Integer
waitTime = 0
Const MAX_WAIT_SECONDS As Integer = 30 ' 设置最大等待时间,避免无限循环

' 循环等待文件解锁,直到超时
Do While IsFileLocked(pdfPath)
    If waitTime >= MAX_WAIT_SECONDS * 10 Then ' 每次Sleep 100ms,10次就是1秒
        MsgBox "PDF文件保存超时,请检查转换过程是否正常。", vbCritical
        End
    End If
    Sleep 100 ' 等待100毫秒
    waitTime = waitTime + 1
Loop

' 确认文件存在且大小正常
If Dir(pdfPath) = "" Or FileLen(pdfPath) = 0 Then
    MsgBox "Attachment File Corrupted. Must convert the TIFF file to PDF again.", vbCritical
    End
End If

' 这里执行附加文件到邮件的代码
' 示例:
' Dim olApp As Outlook.Application
' Dim olMail As Outlook.MailItem
' Set olApp = New Outlook.Application
' Set olMail = olApp.CreateItem(olMailItem)
' olMail.Attachments.Add pdfPath
' ... 其他邮件设置代码

代码说明

  • IsFileLocked函数通过尝试以独占读写方式打开文件,捕获错误号70(文件被锁定)来判断文件是否处于保存中。
  • 循环中加入了最大等待时间(30秒),防止因转换失败导致宏无限等待。
  • 最后额外检查文件是否存在和大小是否非0,作为双重保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:52:45