【问题标题】:Retrieve Outlook details based on alias name Excel VBA根据别名 Excel VBA 检索 Outlook 详细信息
【发布时间】:2015-05-11 03:41:18
【问题描述】:

我有一个我组织中所有员工的员工 ID 列表。我希望 Excel VBA 代码获取详细信息,例如名字、姓氏、指定联系人# 和部门。

别名是员工 ID。因此,代码应将员工 ID 作为别名,并在 Outlook 中搜索上述相应的详细信息。

我在网上找到了一个宏,修改成我的要求:

Sub tgr()

Dim appOL As Object
Dim oGAL As Object
Dim oContact As Object
Dim oUser As Object
Dim UserIndex As Long
Dim i As Long
Dim j As Integer

Set appOL = CreateObject("Outlook.Application")
Set oGAL = appOL.GetNamespace("MAPI").AddressLists("/Name of the Distribution List/").AddressEntries

On Error Resume Next

For j = 2 To Application.WorksheetFunction.CountA(Columns(1))

    For i = 1 To oGAL.Count

        Set oContact = oGAL.Item(i)

        If oContact.AddressEntryUserType = 0 Then

            Set oUser = oContact.GetExchangeUser

            If UCase(oUser.FirstName) = UCase(Range("A" & j).Value) And UCase(oUser.LastName) = UCase(Range("B" & j).Value) Then

                Range("c" & j).Value = oUser.Alias

                Range("D" & j).Value = oUser.JobTitle

                Range("E" & j).Value = oUser.Department

                Range("F" & j).Value = oUser.ManagerName

                i = oGAL.Count
            End If
        End If       
    Next i
Next j

Set oGAL = Nothing
Set oContact = Nothing
Set oUser = Nothing

End Sub

代码有效,但问题是它每次都检查地址列表中的所有项目以搜索每个项目。这需要更多时间。

有没有办法通过广泛搜索而不是查看地址列表中的每个项目并进行比较来简化它。 Addresslist.find 之类的东西。好吧,只有在没有 FIND 属性的联系人文件夹中搜索地址列表时,属性查找才有效。

【问题讨论】:

  • Global Address List 或可从 Outlook 或 AD 访问的联系人文件夹中提取详细信息?您需要在 Contacts/AD 中指定 Employee ID 的关联方式。如果您尝试了一些编码来实现,我们将不胜感激。
  • 不清楚需要在哪里搜索联系人...
  • 感谢您的快速回复。不幸的是,我希望代码在我没有外部电子邮件访问的工作场所工作。所以我无法获取代码。我想要的只是一个简单的代码来使用别名搜索 GAL,当找到结果时检索名字、姓氏、职务、部门和经理。我知道要求太多,但我一直在尝试找到一种方法来做到这一点。我在网上找到的代码很少,但所有代码都使用除别名之外的所有其他字段进行搜索。
  • 然后按照 Patrick 的建议走 Outlook 和 GAL 路线,看起来在vbaexpress.com/kb/getarticle.php?kb_id=222上有一个完整的示例代码用于您的场景

标签: excel vba outlook


【解决方案1】:

Windows 登录别名中的别名?尝试 Namespace.ResolveName - GAL 提供程序将根据登录别名进行解析。

【讨论】:

    【解决方案2】:

    过去,我在 Excel 中使用 ADSI VBScripts 或 ADO+VBA 从域而不是 Outlook 中查找这些详细信息。一个例子是:

    Dim adoConnection As ADODB.Connection
    Set adoConnection = New ADODB.Connection
    With adoConnection
        .Provider = "ADsDSOObject"
        .CursorLocation = adUseClient
        .Open "Active Directory Provider"
    End With
    
    Dim adoCommandText As String
    adoCommandText = "<LDAP://DC=company, DC=co, DC=uk>" & _
    "; (& (objectCategory=person) (mail=" & EmailAddress & ")); " & _
    "sAMAccountName, cn, givenName; subtree")
    
    Dim adoCommand As ADODB.Command
    Dim adoReturnRecordset As ADODB.Recordset
    
    Set adoCommand = New ADODB.Command
    With adoCommand
        .ActiveConnection = adoConnection
        .CommandType = adCmdText
        .CommandText = adoCommandText
    
        Set adoReturnRecordset = .Execute
    End With
    
    ' read the data returned by using ADQueryReturnRecordset.Fields(0) etc.
    

    https://msdn.microsoft.com/en-us/library/ms810638.aspx 页面可以帮助您开始使用 ADO 路由,如果您完全确定需要在 VBA 中执行此操作。

    但是,现在我们在 2015 年,我建议您可能会寻找可以从 Active Directory (& Exchange) 查找详细信息的 powershell 作为使用 VBA 的替代方案。是否有任何理由 (1) 您需要为此使用 VBA,以及 (2) 为什么要从 Outlook 而不是 AD/Exchange 查找这些详细信息?

    【讨论】:

    • 感谢您的帮助。在编码方面我不如你。 VBA 似乎是一种简单的编码方式,因为我是编码新手。但我真的很感谢你的帮助。那么有没有办法在 vba 中执行此操作以在 GAL 中进行搜索
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2015-05-31
    • 2017-12-10
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2014-09-25
    • 2016-10-02
    相关资源
    最近更新 更多