Как определить выбор CC/BCC с помощью VBA GetSelectNameDialog из глобального списка адресов

Привет знающие люди!

Задний план:

Я разрабатываю специальный инструмент слияния почты в MS Word VBA для нашей команды, чтобы у нас была дополнительная функциональность помимо стандартного пакета слияния почты Office Word. Использование сторонних продуктов или надстроек невозможно. Но возможность автоматически прикреплять определенные файлы, настраиваемую строку темы и т. д. сэкономила бы нам много времени и усилий.

Одной из функций является предоставление пользователю возможности выбирать дополнительные учетные записи электронной почты с копией (CC) или скрытой копией (BCC) для добавления к слиянию из нашего корпоративного глобального списка адресов Microsoft Exchange (GAL). Пользователю может потребоваться выбрать несколько учетных записей электронной почты CC или BCC.

Проблема:

Используя предыдущий вопрос и ответ (30918152), я смог позвонить по адресу зарезервируйте глобальный список адресов и настройте метки Кому: / Копия: / Скрытая копия:. Код может получить выбранные учетные записи Exchange в коллекции .Recipients, но я изо всех сил пытаюсь определить, какие выборки являются CC или BCC.

Я знаю, что Outlook.Recipient.Type возвращает переменную типа Long, относящуюся к From: / To: / CC: / BCC: Но когда я debug.print 'recipient.type' всегда возвращает 1, даже когда выбраны CC или BCC.

Кто-нибудь знает, где я ошибаюсь?

Прогресс на данный момент:

Я искал MSDN, выполнял несколько поисковых запросов в Интернете и просматривал такие места, как Stack Overflow, VBOffice.net, но не нашел того, что ищу. Я самоучка, поэтому подозреваю, что моя основная проблема заключается в непонимании страницы MSDN на SelectNamesDialog.Recipients

Код:

Private Sub cmdSetProjectMember1_Click()
' CODE TO SELECT FROM ADDRESS BOOK AND TAKE EMAIL ADDRESS WHEN IT IS AN EXCHANGE USER.
' TAKEN FROM https://stackoverflow.com/questions/30918152/opening-outlook-address-book-from-excel

  Dim olApp As Outlook.Application
  Dim oDialog As SelectNamesDialog
  Dim oGAL As AddressList
  Dim myAddrEntry As AddressEntry
  Dim exchUser As Outlook.ExchangeUser
  Dim TEST_Recipient As Outlook.Recipient

  Dim AliasName As String
  Dim FirstName As String
  Dim LastName As String
  Dim EmailAddress As String

    Set aOutlook = GetObject(, "Outlook.Application")
    Set oDialog = aOutlook.Session.GetSelectNamesDialog
    Set oGAL = aOutlook.GetNamespace("MAPI").AddressLists("Global Address List")

    With oDialog
        .AllowMultipleSelection = True
        .InitialAddressList = oGAL
        .ShowOnlyInitialAddressList = True
        .Caption = "Custom mail merge tool  *****  | |  *****  SELECT EMAIL FROM ADDRESS BOOK"
        .NumberOfRecipientSelectors = olShowToCc
        .ToLabel = "Select CC:"
        .CcLabel = "Select BCC:"

        If .Display Then
                AliasName = oDialog.Recipients.Item(1).Name
                Set myAddrEntry = oGAL.AddressEntries(AliasName)
                Set exchUser = myAddrEntry.GetExchangeUser

                If Not exchUser Is Nothing Then
                    FirstName = exchUser.FirstName
                    LastName = exchUser.LastName
                    EmailAddress = exchUser.PrimarySmtpAddress

                    'MsgBox "You selected contact: " & vbNewLine & _
                        '"FirstName: " & FirstName & vbNewLine & _
                        '"LastName:" & LastName & vbNewLine & _
                        '"EmailAddress: " & EmailAddress

                Set TEST_Recipient = oDialog.Recipients.Item(1)
                 Debug.Print TEST_Recipient.Type

                 If TEST_Recipient.Type = olCC Then
                    MsgBox "Carbon Copy"

                Else
                    MsgBox "NOT CC"

                End If

            End If

        End If

    End With

 Set olApp = Nothing
 Set oDialog = Nothing
 Set oGAL = Nothing
 Set myAddrEntry = Nothing
 Set exchUser = Nothing

End Sub

person SpikeManZombie    schedule 08.06.2020    source источник
comment
Как вы перебираете всех получателей после закрытия диалогового окна? В приведенном выше коде проверяется только первый получатель.   -  person Eugene Astafiev    schedule 08.06.2020
comment
Привет, я еще не написал эту часть, но я планирую создать простой цикл, используя Recipients.Count, который выведет все детали для каждого пользователя Exchange. Единственная часть, которую я не могу вытащить, это то, выбрал ли пользователь их как CC или BCC.   -  person SpikeManZombie    schedule 08.06.2020
comment
Вы пытались использовать метод Logon для входа в определенную учетную запись?   -  person Eugene Astafiev    schedule 08.06.2020
comment
Не могли бы вы также указать версию Outlook с номерами сборки?   -  person Eugene Astafiev    schedule 08.06.2020
comment
Я не знаком с этой командой, но проведу исследование и дам вам знать. Если это имеет какое-то значение, это для команды, поэтому любой из нас (~ 15 человек) может загрузить этот файл MS Word, войдя в систему. сети и запустите этот инструмент слияния почты. У меня уже есть другой код, который извлекает их сетевое имя для отображения в пользовательской форме.   -  person SpikeManZombie    schedule 08.06.2020
comment
Помог ли метод Logon?   -  person Eugene Astafiev    schedule 09.06.2020
comment
Привет @EugeneAstafiev читал веб-страницу MS Office Dev по методу NameSpace.Logon. Спасибо, что указали мне в этом направлении. Наши корпоративные машины подключены к сети (в настоящее время через VPN через персональный широкополосный доступ, работающий дома) на серверах Exchange, на которых работает Office 365. В информации о продукте указано MS Office Professional Plus 2013. Если я правильно понял LOGON, потому что Outlook уже работает, я бы не стал необходимо использовать этот метод для инициализации Outlook. Но я собираюсь переписать, чтобы включить и посмотреть, что произойдет   -  person SpikeManZombie    schedule 09.06.2020
comment
Команда LOGON сработала! Не знаю, почему, но он работает именно так, как нужно. Большое спасибо @Eugene, очень признателен :)   -  person SpikeManZombie    schedule 09.06.2020


Ответы (1)


Спасибо @Eugene за помощь в поиске LOGON

По какой-то причине, поскольку Outlook уже запущен, экземпляр адресной книги не смог получить данные при повторном вызове отдельно через MS Word VBA.

Вот мой окончательный код, чтобы заставить это работать, дополненный циклом для захвата деталей для нескольких вариантов выбора CC / BCC.

Private Sub cmdSetProjectMember1_Click()
' CODE TO SELECT FROM ADDRESS BOOK AND TAKE EMAIL ADDRESS WHEN IT IS AN EXCHANGE USER.
' TAKEN FROM https://stackoverflow.com/questions/30918152/opening-outlook-address-book-from-excel

  Dim olApp As Outlook.Application
  Dim oNS As Outlook.Namespace
  Dim oDialog As SelectNamesDialog
  Dim oGAL As AddressList
  Dim myAddrEntry As AddressEntry
  Dim exchUser As Outlook.ExchangeUser
  Dim TEST_Recipient As Outlook.Recipient

  Dim AliasName As String
  Dim FirstName As String
  Dim LastName As String
  Dim EmailAddress As String

  ' New dimension variables to capture multiple address book selections
  Dim iRecipientCount As Integer
  Dim iLoop As Integer

    Set aOutlook = GetObject(, "Outlook.Application")

    ' New code for LOGON inserted here
    Set oNS = aOutlook.GetNamespace("MAPI")
    oNS.Logon "LatestProfile", , True, True


    Set oDialog = aOutlook.Session.GetSelectNamesDialog
    Set oGAL = aOutlook.GetNamespace("MAPI").AddressLists("Global Address List")

    With oDialog
        .AllowMultipleSelection = True
        .InitialAddressList = oGAL
        .ShowOnlyInitialAddressList = True
        .Caption = "Custom mail merge tool  *****  | |  *****  SELECT EMAIL FROM ADDRESS BOOK"
        .NumberOfRecipientSelectors = olShowToCcBcc
        .ToLabel = "Select FROM:"
        .CcLabel = "Select CC:"
        .BccLabel = "Select BCC:"

        If .Display Then
          AliasName = oDialog.Recipients.Item(1).Name
          Set myAddrEntry = oGAL.AddressEntries(AliasName)
          Set exchUser = myAddrEntry.GetExchangeUser

          If Not exchUser Is Nothing Then
            iRecipientCount = oDialog.Recipients.Count

            For iLoop = 1 To iRecipientCount
              Set TEST_Recipient = oDialog.Recipients.Item(iLoop)

              Debug.Print TEST_Recipient.Index
              Debug.Print TEST_Recipient.Type
              Debug.Print "NEXT"

              Select Case TEST_Recipient.Type
                Case 1
                  MsgBox TEST_Recipient.Name & vbNewLine & "Selected FROM:"

                Case 2
                  MsgBox TEST_Recipient.Name & vbNewLine & "Selected CC:"

                Case 3
                  MsgBox TEST_Recipient.Name & vbNewLine & "Selected BCC:"

               End Select

            Next iLoop

          End If

        End If

    End With

 Set olApp = Nothing
 Set oDialog = Nothing
 Set oGAL = Nothing
 Set myAddrEntry = Nothing
 Set exchUser = Nothing

End Sub
person SpikeManZombie    schedule 09.06.2020
comment
Рад слышать, что мое предложение помогло! - person Eugene Astafiev; 09.06.2020