使用VBA从Outlook通讯簿获取别名时报错,求原因
问题原因分析
你的代码执行Debug.Print(oExUser.Alias)时报错,核心原因是全局地址列表(GAL)中的条目并非都是Exchange用户,导致myAddrEntry.GetExchangeUser()返回了Nothing,此时直接访问oExUser.Alias就会触发“对象变量或With块变量未设置”的错误。
具体细节:
- 全局地址列表里可能包含邮件联系人、通讯组等非Exchange用户类型的条目,这类条目调用
GetExchangeUser()方法无法获取有效ExchangeUser对象,会返回Nothing。 - 你直接取了
AddressEntries.Item(1),这个条目恰好不是Exchange用户,所以后续访问属性时触发错误。
修复方案:
在访问oExUser的属性前,先判断它是否有效:
Sub Test() Dim AliasName, FullName As String Dim outlookApp As Outlook.Application Dim myNameSpace As Outlook.nameSpace Dim myAddrList As AddressList Dim myAddrEntries As AddressEntries Dim myAddrEntry As Outlook.AddressEntry Dim oExUser As Outlook.ExchangeUser Set outlookApp = New Outlook.Application Set myNameSpace = outlookApp.GetNamespace("MAPI") Set myAddrList = myNameSpace.GetGlobalAddressList() Set myAddrEntries = myAddrList.AddressEntries Set myAddrEntry = myAddrEntries.Item(1) Set oExUser = myAddrEntry.GetExchangeUser() ' 先判断oExUser是否有效 If Not oExUser Is Nothing Then Debug.Print oExUser.Alias Else Debug.Print "当前条目不是Exchange用户" End If End Sub
也可以先通过条目类型筛选,只处理Exchange用户:
' 在获取myAddrEntry后添加类型判断 If myAddrEntry.AddressEntryUserType = olExchangeUserAddressEntry Then Set oExUser = myAddrEntry.GetExchangeUser() Debug.Print oExUser.Alias Else Debug.Print "该条目不属于Exchange用户类型" End If
内容的提问来源于stack exchange,提问作者trinocle
相关产品推荐
相关产品推荐

