Outlook使用VBA打开Excel文件报编译错误:用户定义类型未定义
错误原因
编译错误: User-defined type not defined(用户定义类型未定义)出现的核心原因是Outlook VBA默认没有加载Excel对象库的引用,你代码中用到的Excel.Application、Excel.Workbook这些属于Excel类型库的定义,Outlook原生无法识别这些数据类型,因此触发编译报错。
解决方案
提供两种可选择的解决方式:
方式1:添加Excel对象库引用(前期绑定)
这种方式保留代码原有写法,编码时能获得代码补全提示,适合个人自用脚本:
- 打开Outlook,按
Alt + F11进入VBA编辑器 - 点击顶部菜单栏的「工具」→「引用」
- 在弹出的引用列表中找到对应版本的
Microsoft Excel [版本号] Object Library,例如Office 2019/365对应Microsoft Excel 16.0 Object Library,勾选前面的复选框后点击确定即可 - 保存代码后重新运行,报错就会消失
方式2:修改代码为后期绑定(无需加引用,兼容性更好)
这种方式不需要手动添加引用,适配不同版本的Office环境,适合需要分发的脚本:
把原来定义Excel对象的部分修改为变体类型,用CreateObject创建实例,修改后的完整代码如下:
Public Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim source As Object Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim ExApp As Object Dim ExWbk As Object Set ExApp = CreateObject("Excel.Application") saveFolder = "C:\Reports\Daily Traffic Report per Site\Source" On Error Resume Next Kill "C:\Reports\Daily Traffic Report per Site\Source\*.*" On Error GoTo 0 For Each objAtt In itm.Attachments objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName Next Set ExWbk = ExApp.Workbooks.Open("C:\Reports\Calculation.xlsm") ' 若需要让Excel界面可见可取消注释下行 ' ExApp.Visible = True End Sub
额外注意:原始代码中清空旧文件的
Kill语句路径和附件保存路径不一致,会导致旧附件没有被正常清空,上述修改后的代码已经统一了两个路径。
内容的提问来源于stack exchange,提问作者aab
相关产品推荐
相关产品推荐

