Outlook VBA自动打印邮件附件报错'438':对象不支持该属性或方法
错误438的原因及修复方案
核心问题:方法名拼写错误
错误438(对象不支持该属性或方法)的直接诱因是代码里的InvokeVebrEx拼写错误,正确方法名应为InvokeVerbEx——你把单词Verb误写成了Vebr,导致Shell对象无法识别该方法,触发报错。
其他潜在问题及优化建议
- 变量未声明:
cTmpFld、FileName、FileType等变量均未声明,建议在代码开头添加Option Explicit强制变量声明,避免因变量拼写错误或未定义引发的隐性问题。 - 扩展名判断逻辑缺陷:
Right$(FileName, 4)仅能匹配含点在内的4位扩展名,若遇到扩展名长度不同的文件(比如.png没问题,但如果是.csv就会匹配错误),建议改用FileSystemObject的GetExtensionName方法获取准确扩展名:FileType = "." & LCase(oFS.GetExtensionName(FileName)) - 临时文件堆积:代码创建了临时文件夹但未清理,长期运行会导致系统临时文件冗余,建议在流程结束前添加临时文件夹删除逻辑:
oFS.DeleteFolder cTmpFld, True
修复后的完整代码
Option Explicit Sub AttachmentPrint(Item As Outlook.MailItem) On Error GoTo OError Dim oFS As FileSystemObject Dim sTempFolder As String Dim cTmpFld As String Dim oAtt As Attachment Dim FileName As String Dim FileType As String Dim FullFile As String Dim objShell As Object Dim objFolder As Object Dim objFolderItem As Object Set oFS = New FileSystemObject sTempFolder = oFS.GetSpecialFolder(TemporaryFolder) cTmpFld = sTempFolder & "\OETMP" & Format(Now, "yyyymmddhhmmss") MkDir cTmpFld For Each oAtt In Item.Attachments FileName = oAtt.FileName FileType = "." & LCase(oFS.GetExtensionName(FileName)) FullFile = cTmpFld & "\" & FileName oAtt.SaveAsFile FullFile Select Case FileType Case ".doc", ".docx", ".pdf", ".txt", ".jpg", ".png" Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.NameSpace(0) Set objFolderItem = objFolder.ParseName(FullFile) objFolderItem.InvokeVerbEx "Print" End Select Next oAtt ' 清理临时文件夹 oFS.DeleteFolder cTmpFld, True ' 释放对象 Set objFolderItem = Nothing Set objFolder = Nothing Set objShell = Nothing Set oFS = Nothing OError: If Err <> 0 Then MsgBox Err.Number & " - " & Err.Description Err.Clear End If Exit Sub End Sub
内容的提问来源于stack exchange,提问作者Roland Berbás
相关产品推荐
相关产品推荐

