Outlook VBA代码触发运行时错误91(对象变量未设置)求助
Outlook VBA 运行时错误91(对象未设置)问题排查与解决
问题描述
接手的Outlook VBA代码此前运行正常,近期在执行语句 sSenderName = (OutItems(i).Sender.GetExchangeUser.PrimarySmtpAddress) 时触发运行时错误91(对象变量或With块变量未设置),代码未做任何修改。
错误原因
错误91的本质是链式调用中某个对象返回了Nothing:
- 即使
SenderEmailType为"EX",也不代表OutItems(i).Sender一定是有效对象(比如邮件发件人是已删除的Exchange账户、外部转发导致发件人信息不完整); Sender.GetExchangeUser()也可能返回Nothing(比如Exchange服务器未同步该用户信息、邮件来自共享邮箱/公共文件夹)。
解决方案
在代码中添加对象存在性检查,避免直接链式调用,分步验证每个对象是否有效:
If TypeName(OutItems(i)) = "MailItem" Then If OutItems(i).SenderEmailType = "EX" Then Dim objSender As Outlook.AddressEntry Dim objExUser As Outlook.ExchangeUser ' 先获取Sender对象并检查有效性 Set objSender = OutItems(i).Sender If Not objSender Is Nothing Then ' 再获取ExchangeUser对象并检查有效性 Set objExUser = objSender.GetExchangeUser If Not objExUser Is Nothing Then sSenderName = objExUser.PrimarySmtpAddress Else ' 无法获取ExchangeUser时,用发件人名称作为备选 sSenderName = OutItems(i).SenderName End If Else ' Sender对象为空时,直接使用SenderEmailAddress sSenderName = OutItems(i).SenderEmailAddress End If Else sSenderName = OutItems(i).SenderEmailAddress End If End If
额外排查建议
- 定位异常邮件:找到触发错误的具体邮件,手动查看发件人属性,确认Exchange用户信息是否能正常显示;
- 清理缓存:重启Outlook或系统,清除Outlook缓存,解决临时的同步异常;
- 检查权限:确认当前用户对Exchange服务器的访问权限未发生变化,是否能正常读取发件人信息;
- 版本兼容:检查Outlook近期是否有版本更新,部分更新可能影响对象模型的调用逻辑。
内容的提问来源于stack exchange,提问作者Noob_coder
相关产品推荐
相关产品推荐

