【问题标题】:Updating Distribution lists in a shared mailbox from Excel从 Excel 更新共享邮箱中的通讯组列表
【发布时间】:2018-09-06 04:39:01
【问题描述】:

我有以下宏,它在 Excel 中获取电子邮件地址列表,并在 Outlook 的“我的联系人”部分下创建/更新 Outlook 分发列表。

如何调整此代码,以便它在名为“共享测试”的共享邮箱中创建/更新联系人,而不仅仅是在我的邮箱中?

Const DISTLISTNAME As String = "Test"
Const olDistributionListItem = 7
Const olFolderContacts = 10

Sub test() 'Worksheet_Change(ByVal Target As Range)

Dim outlook As Object ' Outlook.Application
Dim contacts As Object ' Outlook.Items
Dim myDistList As Object ' Outlook.DistListItem
Dim newDistList As Object ' Outlook.DistListItem
Dim objRcpnt As Object ' Outlook.Recipient
Dim arrData() As Variant
Dim rng As Excel.Range
Dim numRows As Long
Dim numCols As Long
Dim i As Long
Dim msg As String

msg = "Worksheet has been changed, would you like to update distribution list?"

  If MsgBox(msg, vbYesNo) = vbNo Then
    Exit Sub
  End If

  Set outlook = GetOutlookApp
  Set contacts = GetItems(GetNS(outlook))

  'On Error Resume Next
  Set myDistList = contacts.Item(DISTLISTNAME)
  On Error GoTo 0

  If Not myDistList Is Nothing Then
    ' delete it
    myDistList.Delete
  End If

    ' recreate it
    Set newDistList = outlook.CreateItem(olDistributionListItem)

    With newDistList
      .DLName = DISTLISTNAME
      .Body = DISTLISTNAME
    End With

    ' loop through worksheet and add each member to dist list
    numRows = Range("A1").CurrentRegion.Rows.Count - 1
    numCols = Range("A1").CurrentRegion.Columns.Count

    ReDim arrData(1 To numRows, 1 To numCols)

    ' take header out of range
    Set rng = Range("A1").CurrentRegion.Offset(1, 0).Resize(numRows, numCols)
    ' put range into array
    arrData = rng.Value

    ' assume 2 cols (name and emails only)
    For i = 1 To numRows
      'little variation on your theme ...
      Set objRcpnt = outlook.Session.CreateRecipient(arrData(i, 1) & "<" & arrData(i, 2) & ">")
      'end of variation
      objRcpnt.Resolve
      newDistList.AddMember objRcpnt
    Next i

    newDistList.Save
    'newDistList.Display

End Sub

Function GetOutlookApp() As Object
  'On Error Resume Next
  Set GetOutlookApp = CreateObject("Outlook.Application")
End Function

'To My Contacts
Function GetItems(olNS As Object) As Object
Set GetItems = olNS.GetDefaultFolder(olFolderContacts).Items
End Function

Function GetNS(ByRef app As Object) As Object
  Set GetNS = app.GetNamespace("MAPI")
End Function

【问题讨论】:

  • 第一个好的步骤是摆脱所有那些On Error Resume Next 并向我们展示您的代码产生的实际错误。我一直不明白为什么人们会这样做。为什么你不想知道代码中的错误在哪里?
  • 您好,感谢您的回复。但是,上面的代码不会出错,并且非常适合将联系人上传到我邮箱的“我的联系人”中。但我正在寻找一种将联系人上传到共享邮箱的方法,所以想知道如何为此调整代码。
  • 好吧,如果它工作得很好,你为什么不删除那些表达式?只会让我们手头的事情变得更容易,所以我们不必预测您的代码会出现任何继承错误
  • 是的,我会感谢你的。好建议。我是 VBA 的新手,刚刚在另一个论坛上找到了上述内容,但只是想知道如何调整它。谢谢
  • On Error Resume Next 被严重滥用,因此大多数时候 Rawrplus 的建议是有效的。 cpearson.com/excel/errorhandling.htm。首次使用On Error Resume Next 是有益的。你会发现你必须保持它未注释。小心只绕过您知道的错误,并根据需要处理或不处理。 On Error Resume Next 的第二个实例既无益也无害。

标签: excel vba outlook


【解决方案1】:

引用非默认文件夹的一种方法是使用.CreateRecipient

您的代码中的函数似乎并没有提高效率。

Option Explicit

Const DISTLISTNAME As String = "Test"
Const olDistributionListItem = 7
Const olFolderContacts = 10

Sub test()

    Dim outlook As Object       ' Outlook.Application
    Dim olNs As Object          ' Outlook.Namespace

    Dim shareRecipient As Object            ' outlook.recipient
    Dim sharedMaiboxContacts As Object      ' outlook.Folder
    Dim sharedMaiboxContactsItems As Object ' outlook.items

    Dim myDistList As Object    ' Outlook.DistListItem
    Dim newDistList As Object   ' Outlook.DistListItem

    Dim objRcpnt As Object      ' outlook.recipient

    Set outlook = CreateObject("Outlook.Application")
    Set olNs = outlook.GetNamespace("MAPI")

    ' Enter mailbox name in "sharedMailboxName"
    ' Email address is not as useful. Even if invalid, cannot fail a resolve

    Set shareRecipient = olNs.CreateRecipient("sharedMailboxName")

    shareRecipient.Resolve

    If shareRecipient.Resolved Then

        Set sharedMaiboxContacts = olNs.GetSharedDefaultFolder(shareRecipient, olFolderContacts)
        sharedMaiboxContacts.Display
        Set sharedMaiboxContactsItems = sharedMaiboxContacts.Items

        ' This is a valid use of On Error Resume Next
        '  to bypass a known possible error
        '
        ' Before finalizing the code, test with this commented out
        '  where you think there should not be an error
        '  or you may bypass unknown errors, for example when the syntax is wrong.
        On Error Resume Next

        ' A possible known error occurs if the list does not exist.
        ' myDistList can remain "Nothing" instead of causing an error.
        Set myDistList = sharedMaiboxContactsItems.Item(DISTLISTNAME)

        ' Turn the bypass off. / Turn normal error handling on.
        ' Place it as soon as possible after On Error Resume Next
        On Error GoTo 0

        If Not myDistList Is Nothing Then
            ' delete it
            myDistList.Delete
        End If

        ' Add to non default folders
        Set newDistList = sharedMaiboxContactsItems.Add(olDistributionListItem)

        With newDistList
            .DLName = DISTLISTNAME
            .body = DISTLISTNAME
        End With

        Debug.Print olNs.CurrentUser

        ' Test with yourself
        Set objRcpnt = olNs.CreateRecipient(olNs.CurrentUser)

        objRcpnt.Resolve

        If objRcpnt.Resolved Then
            newDistList.AddMember objRcpnt
            newDistList.Display
        Else
            Debug.Print objRcpnt & " not resolved."
        End If

    Else

        Debug.Print shareRecipient & " not resolved."

    End If

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多