【问题标题】:Creating a "Check Names" button in Excel在 Excel 中创建“检查名称”按钮
【发布时间】:2015-09-18 15:13:30
【问题描述】:

我是使用 VBA 和宏的新手,想知道是否有办法在 Excel 中添加“检查名称”功能(类似于 Outlook 中的功能)。我正在处理的表格的一部分要求我输入员工的姓名,我希望能够单击一个按钮以确保我正确拼写了他们的姓名并且他们在我们的电子邮件系统中。任何正确方向的帮助或指示将不胜感激!

【问题讨论】:

  • 根据姓名的数量,您可以在 Excel 中使用一个列表(隐藏在您的个人工作簿中?),如果不在该列表中,则使用 For 循环和 IF 进行标记,或者如果没有很多,您可以在 VBA 中编写 CASE 语句。然后,如果它们不在“已批准”列表中,则标记
  • 你不能设计一个 Outlook 表单从集中存储的 Excel 中查询数据吗?这样你就拥有了所有 Outlook 邮件功能,我相信这更加现实,因为查询 Outlook 名称需要对 Outlook 授予访问权限(?)
  • 您需要在哪里检查姓名?在 Outlook 通讯簿或 AD 中?

标签: vba excel outlook


【解决方案1】:

这里有几个答案:

编辑:在 Excel 2010 中创建(不知道它是否会在 2003 年工作)。

如果名称可以在 Outlook 中解析,第一个将返回 TRUE 或 FALSE。

'----------------------------------------------------------------------------------
' Procedure : ResolveDisplayNameToSMTP
' Author    : Sue Mosher - updated by D.Bartrup-Cook to work in Excel late binding.
'-----------------------------------------------------------------------------------
Public Function ResolveDisplayName(sFromName) As Boolean

    Dim OLApp As Object 'Outlook.Application
    Dim oRecip As Object 'Outlook.Recipient
    Dim oEU As Object 'Outlook.ExchangeUser
    Dim oEDL As Object 'Outlook.ExchangeDistributionList

    Set OLApp = CreateObject("Outlook.Application")
    Set oRecip = OLApp.Session.CreateRecipient(sFromName)
    oRecip.Resolve
    If oRecip.Resolved Then
        ResolveDisplayName = True
    Else
        ResolveDisplayName = False
    End If

End Function

第二个将解析名称并返回电子邮件地址:

'----------------------------------------------------------------------------------
' Procedure : ResolveDisplayNameToSMTP
' Author    : Sue Mosher - updated by D.Bartrup-Cook to work in Excel late binding.
'-----------------------------------------------------------------------------------
Public Function ResolveDisplayNameToSMTP(sFromName) As String
    Dim OLApp As Object 'Outlook.Application
    Dim oRecip As Object 'Outlook.Recipient
    Dim oEU As Object 'Outlook.ExchangeUser
    Dim oEDL As Object 'Outlook.ExchangeDistributionList

    Set OLApp = CreateObject("Outlook.Application")
    Set oRecip = OLApp.Session.CreateRecipient(sFromName)
    oRecip.Resolve
    If oRecip.Resolved Then
        Select Case oRecip.AddressEntry.AddressEntryUserType
            Case 0, 5 'olExchangeUserAddressEntry & olExchangeRemoteUserAddressEntry
                Set oEU = oRecip.AddressEntry.GetExchangeUser
                If Not (oEU Is Nothing) Then
                    ResolveDisplayNameToSMTP = oEU.PrimarySmtpAddress
                End If
            Case 10, 30 'olOutlookContactAddressEntry & 'olSmtpAddressEntry
                    ResolveDisplayNameToSMTP = oRecip.AddressEntry.Address
        End Select
    End If
End Function

这是一个展示如何使用这两个功能的测试程序:

Sub Test()

    MsgBox ResolveDisplayName("Marty Moesta")
    MsgBox ResolveDisplayNameToSMTP("Marty Moesta")

End Sub

【讨论】:

  • 请记住 Namespace.CreateRecipient / Recipient.Resolve 不会显示不明确的名称对话框。
  • 我什至从未考虑过@Dmitry - 我将不得不努力解决这个问题。找到了这个链接,它可以为我指明正确的方向 - msdn.microsoft.com/en-us/library/bb646055(v=office.12).aspx
  • 是的,那是用于选择名称,而不是用于模棱两可的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多