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

Если у меня есть электронная таблица, на которую я ссылался на библиотеку объектов 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?

1 Ответ

25 голосов
/ 29 февраля 2012

tbone, то, что вы называете Строгий набор , называется «Раннее связывание».

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

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

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

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

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

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

Не отказывайтесь от Раннего связывания, если вам это нравится из-за интеллигентности. Однако перед распространением приложения измените код на 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

НТН

Sid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...