Подтвердить что ты не робот

Предотвращение ошибок компиляции Excel VBA из-за того, что у пользователей установлена ​​более старая версия MS Office (MS Outlook)?

Если у меня есть электронная таблица, на которой я ссылался на библиотеку объектов MS Outlook 14.0 из редактора VBA, и у пользователя, у которого установлен только MS Outlook 12.0, тогда, когда этот пользователь открывает электронную таблицу, они получают ошибку компиляции в этой строке

Range("export_date") = Date - 1

Если они перейдут в "Инструменты", "Ссылки" в списке ссылок, появится такая ошибка:

MISSING: MS Outlook 14.0 Object Library

Если они отменили выбор этой библиотеки и вместо этого выберите

Библиотека объектов MS Outlook 12.0

... код затем правильно компилируется, и электронная таблица отлично работает для них.

Я действительно не понимаю, почему это не работает в функции Date(), поскольку это функция VBA, а не функция Outlook. Но что еще важнее, есть ли способ избежать этой ситуации? Единственное, о чем я могу думать, это не устанавливать ссылки и просто использовать переменные типа Object и создавать экземпляры через CreateObject ( "Outlook.Application" ) и т.д., Но я не хочу отказываться от сильной типизации и т.д.

Может ли кто-нибудь предложить лучший способ справиться с этой проблемой обратной совместимости со старыми версиями MS Office?

4b9b3361

Ответ 1

tbone, то, что вы называете Strong Typing, называется "Раннее связывание".

К сожалению, одним из недостатков раннего связывания является то, что если у конечного пользователя нет такой же версии, как у вас, вы получите эти ошибки.

Если вы спросите меня, я предпочитаю Late Binding (где вы не создаете ссылки и не используете CreateObject для создания экземпляра)

Интересное чтение.

Тема: Использование раннего связывания и позднего связывания в Automation

Ссылка: http://support.microsoft.com/kb/245115

Мое предложение

Не отказывайтесь от раннего связывания, если вам это нравится из-за intellisense. Однако перед распространением приложения измените код на Latebinding. Не так уж много различий в том, как вы кодируете раннее связывание и позднюю привязку.

Вот пример

Ранняя привязка

'~~> Set reference to Excel Object Library
Sub Sample()
    Dim oXLApp As Excel.Application
    Dim oXLBook As Excel.Workbook
    Dim oXLSheet As Excel.Worksheet

    '~~> Create a new instance of Excel
    Set oXLApp = New Excel.Application
    '~~> Add a new workbook
    Set oXLBook = oXLApp.Workbooks.Add
    Set oXLSheet = oXLBook.Worksheets(1)

    '
    '~~> Rest of the code
    '
End Sub

Поздняя привязка

'~~> Doesn't require a reference to Excel Object Library
Sub Sample()
    Dim oXLApp As Object
    Dim oXLBook As Object
    Dim oXLSheet As Object

    '~~> Create a new instance of Excel
    Set oXLApp = CreateObject("Excel.Application")
    '~~> Add a new workbook
    Set oXLBook = oXLApp.Workbooks.Add
    Set oXLSheet = oXLBook.Worksheets(1)
    '
    '~~> Rest of the code
    '
End Sub

НТН

Сид