升级Office365后VBA发送的xlsm附件提示格式无效如何解决
可行修复方案
- 调整文件保存逻辑,显式指定文件格式,避免Office365默认格式和扩展名不匹配
原来的SaveCopyAs逻辑没有指定格式,Office365会根据当前默认配置生成文件,很容易出现实际格式和你指定的.xlsm扩展名不符的问题,替换为以下代码:
' 替换原来的DestinWB.SaveCopyAs那一行 ' 显式指定为启用宏的工作簿格式,值为52,对应xlOpenXMLWorkbookMacroEnabled If FileExtStr = ".xlsm" Then DestinWB.SaveAs Filename:=TempFilePath & TempFileName & FileExtStr, FileFormat:=52 Else ' 对应普通无宏xlsx格式,值为51 DestinWB.SaveAs Filename:=TempFilePath & TempFileName & FileExtStr, FileFormat:=51 End If
- 修复附件删除时机的问题,避免Outlook还未加载完附件就删除临时文件
你现有代码.Display之后立刻执行删除临时文件的操作,Office365版本的Outlook加载附件速度比旧版慢,经常出现还没读完临时文件就被删除,导致附件损坏。在.Display之后加1~2秒的延迟即可:
With OutlookMessage ' 其他原有配置不变 .Display Application.Wait Now + TimeValue("0:00:02") ' 新增2秒延迟,给Outlook加载附件的时间 End With
- 补充外部链接为空的判断,避免空数组遍历导致的文件异常
现有代码中如果DestinWB没有外部链接,ExternalLinks会返回空值,直接调用UBound会报错,虽然有On Error Resume Next跳过,但可能导致文件保存时出现隐性损坏,修改为以下逻辑:
ExternalLinks = DestinWB.LinkSources(Type:=xlLinkTypeExcelLinks) If Not IsEmpty(ExternalLinks) Then ' 新增判断,只有存在外部链接时才遍历 For x = 1 To UBound(ExternalLinks) DestinWB.BreakLink Name:=ExternalLinks(x), Type:=xlLinkTypeExcelLinks Next x End If
- 固定扩展名判断逻辑,避免源文件状态带来的误差
如果你的附件固定需要是启用宏的工作簿,可以直接替换原来的扩展名判断代码,避免源文件未保存、扩展名识别错误的问题:
' 替换原来的Determine File Extension部分的代码 FileExtStr = ".xlsm"
- 验证工作表复制逻辑的正确性
你现有代码只选中了Sheet5进行复制,如果需要复制的是Report工作表,确认Sheet5的CodeName是否对应Report表,避免复制了空表或者错误的表导致生成的文件异常。
内容的提问来源于stack exchange,提问作者Owen4512
相关产品推荐
相关产品推荐

