Access 2010-2016 VBA: можете ли вы ссылаться на библиотеку объектов MS Outlook в нескольких версиях? - PullRequest
0 голосов
/ 01 мая 2018

Меня попросили устранить неполадки сценария VBA, который отправляет электронное письмо из базы данных Access. БД и VBA были разработаны в Access 2010 (данные хранятся в базе данных SQL) и, вероятно, предназначены для Outlook 2010.

В настоящее время мы используем Outlook 2013 и 2016.

Когда мой скрипт (отмеченный ниже) запускается, в объявлении Outlook.Application генерируется ошибка: Определяемый пользователем тип данных не определен .

Здесь начинается сценарий, где мы определяем типы данных.

Option Compare Database
Option Explicit
 
' InitOutlook sets up outlookApp and outlookNamespace.
Private outlookApp As Outlook.Application
Private outlookNamespace As Outlook.NameSpace

Остальная часть сценария приведена ниже. Он вызывается кнопкой формы, напрямую вызывающей SendEmail () и передающей адрес электронной почты в виде переменной.

Private Sub InitOutlook()
    ' Initialize a session in Outlook
    Set outlookApp = New Outlook.Application
    
    'Return a reference to the MAPI layer
    Set outlookNamespace = outlookApp.GetNamespace("MAPI")
    
    'Let the user logon to Outlook with the
    'Outlook Profile dialog box
    'and then create a new session
    outlookNamespace.Logon , , True, False
End Sub

Public Sub SendEmail(varTo As Variant)
    Dim mailItem As Outlook.mailItem
        
    InitOutlook
    Set mailItem = outlookApp.CreateItem(olMailItem)
    mailItem.To = varTo & ""
    mailItem.Subject = "subject text"
    mailItem.Body = "Body text"
    mailItem.Display
    
    Set mailItem = Nothing
    CleanUp
End Sub

Я не очень знаком с VBA / Access, но я работал с VB.NET, и с самого начала я был уверен, что это был простой вопрос: «в нем отсутствует оператор импорта или ссылка. «

Немного покопавшись, я обнаружил здесь , что для использования этой функции необходимо добавить ссылку в библиотеку объектов Microsoft Outlook XX.X ,

Я еще не видел ссылок, которые есть в этой базе данных (работает над тем, чтобы добраться туда сейчас), так как у меня ограниченный доступ к этой базе данных доступа, поскольку она содержит много конфиденциальной информации, и я должен находиться под наблюдением при просмотре Это.

Однако, учитывая, что мы использовали Outlook 2010, когда мы писали этот сценарий, и теперь разделены между Outlook 2013 и 2016, я считаю, что нам нужно обновить эту ссылку до более новой.

Я обсуждал это с коллегой здесь, и он задал мне важный вопрос:

Можем ли мы сослаться на несколько версий библиотеки объектов Microsoft Outlook?

Если мы нацеливаемся на самую последнюю версию библиотеки, например, на Outlook 2016, сценарий не будет работать для пользователей Outlook 2013?

Обновление: В ходе тестирования я обнаружил, что если бы мы использовали библиотеку объектов MS Outlook 16.0, Outlook 2013 не распознал бы ссылку и выдавал бы ошибки, если эта ссылка отсутствовала.

Если мы использовали библиотеку MS Outlook 15.0, скрипт работал на машинах с любой из версий outlook.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Если вам нужно использовать раннее связывание, добавьте ТОЛЬКО самую раннюю поддерживаемую ссылку (т. Е. Нет необходимости добавлять ссылку на 2003 Outlook, если вы собираетесь поддерживать только 2013+), и она должна позаботиться о себе. Очень немногие вещи не имеют обратной совместимости

В противном случае используйте позднюю привязку. Это требует использования функции CreateObject вместо ключевого слова New для любого Outlook.__object__.

Обратите внимание , что вам нужно явно объявить константы Outlook как olMailItem, иначе они вызовут ошибки компиляции (при условии, что вы используете Option Explicit):

Option Compare Database
Option Explicit

' InitOutlook sets up outlookApp and outlookNamespace.
Private outlookApp As Object ' Outlook.Application
Private outlookNamespace As  Object ' Outlook.NameSpace

А затем небольшие изменения в теле вашего кода:

Const olMailItem As Long = 0 '## You need to add this enumeration!

Private Sub InitOutlook()
    ' Initialize a session in Outlook
    Set outlookApp = CreateObject("Outlook.Application")

    'Return a reference to the MAPI layer
    Set outlookNamespace = outlookApp.GetNamespace("MAPI")

    'Let the user logon to Outlook with the
    'Outlook Profile dialog box
    'and then create a new session
    outlookNamespace.Logon , , True, False
End Sub

Public Sub SendEmail(varTo As Variant)
    Dim mailItem As Object ' Outlook.mailItem

    InitOutlook
    Set mailItem = outlookApp.CreateItem(olMailItem)
    mailItem.To = varTo & ""
    mailItem.Subject = "subject text"
    mailItem.Body = "Body text"
    mailItem.Display

    Set mailItem = Nothing
    CleanUp
End Sub
0 голосов
/ 01 мая 2018

Краткий (-ийский) ответ: Да, вы можете.

И на ваш второй вопрос; Ссылка на библиотеку не должна иметь каких-либо неблагоприятных последствий, подобных описанным. Я бы сказал, что лучший способ проверить наверняка - это проверить проблему.

Длинный ответ: Зачем вам это нужно? IIRC; более новая ссылка должна содержать все, что делала старая, с дополнительной библиотечной информацией. Однако, если это как-то не так, и более новая ссылка не покрывает проблему, добавление новой ссылки, скорее всего, решит проблему, но добавление библиотечных ссылок не всегда является лучшей практикой.

Мое лучшее предположение здесь состоит в том, что одна ссылка на библиотеку Outlook в любом случае решит вашу проблему.

...