powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / проблема совместимости разных версий
7 сообщений из 7, страница 1 из 1
проблема совместимости разных версий
    #39681934
Sergey8969
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день

Недавно добавил в базу access возможность экспорта данных в эксель, для этого пришлось подключить библиотеку Microsoft Excel 16.0 Object Library. Проблема в том, что у меня довольно новая версия excel стоит и более старую версию библиотек выбрать нельзя - в списке только один вариант. После добавления библиотек, на компах со старым офисом база запускаться перестала.
Пробовал на старом офисе подключить старые библиотеки, но при запуске базы на машине с новым офисом версия библиотек автоматически меняется и при последующем запуске со старого офиса опять та же проблема возникает.

Понятно, что есть выходы: 1) поставить на все машины одну версию офиса
2) пилить базу на старом офисе, тогда при распространении ее копий на более новых версиях офиса все будет работать
Только у этих вариантов есть недостатки: если базу придется поменять на новой версии офиса - она уже не будет работать на старой. Придется лезть в references и заново подключать библиотеку.

Подскажите, есть ли какой-то более универсальный вариант решения проблемы? Поиск в гугле простых решений не обнаружил...
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39681938
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey8969есть ли какой-то более универсальный вариант решения проблемы?
Используйте позднее связывание на продакшене и раннее на разработке. Т.е. если во время разработки у Вас есть что-то типа

Код: vbnet
1.
2.
3.
4.
Dim xlapp As Excel.Application
Dim xlwbk As Excel.Workbook
Set xlApp = New Excel.Application
Set xlwbk = xlApp.Open("x:\folder\filename.xlsx")


перед отдачей в продукт Вы удаляете референс на объектную либу Экселя и корректируете код до

Код: vbnet
1.
2.
3.
4.
Dim xlapp As Object
Dim xlwbk As Object
Set xlApp = CreateObject("Excel.Application")
Set xlwbk = xlApp.Open("x:\folder\filename.xlsx")


Таким образом при разработке Вы пользуетесь подсказками Intellisince, а в продукте можете использовать библиотеку любой версии, ту, которая есть на текущей рабочей станции.

Само собой, надо внимательно следить, что в объектной модели ничего не поменялось, и не использовать те объекты/свойства/методы, которые добавились или изменились. В крайнем случае в рантайме надо получать версию созданного объекта и, ориентируясь на неё, в местах использования изменившихся объектов организовывать соответствующие IF или SELECT CASE с разными версиями кода для разных версий библиотеки.
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39681945
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если при разработке Вы используете экспортируемые библиотекой константы, то в продукте Вы должны либо использовать их численные значения, либо определить эти константы. Т.е.

Код: vbnet
1.
Range("A1").PasteSpecial xlPasteFormulas, xlPasteSpecialOperationNone


в продукте превратится в
Код: vbnet
1.
Range("A1").PasteSpecial -4123, -4142


или в
Код: vbnet
1.
2.
3.
4.
Const xlPasteFormulas As Long = -4123
Const xlPasteSpecialOperationNone As Long = -4142
' ...
Range("A1").PasteSpecial xlPasteFormulas, xlPasteSpecialOperationNone


Второе предпочтительнее - используемые константы можно один раз объявить как Public в отдельном модуле и подключать его в продукт, не внося изменений в программный код.
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39681967
Полностью поддерживаю Akina, но хочу добавить, что здесь удобно использовать условную компиляцию. Например:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#Const IsExlRef = 1 'В заголовке модуля
...
'В процедуре
#If IsExlRef = 1 Then
  Dim xlapp As Excel.Application
  Dim xlwbk As Excel.Workbook
  Set xlApp = New Excel.Application
  Set xlwbk = xlApp.Open("x:\folder\filename.xlsx")
#Else
  Dim xlapp As Object
  Dim xlwbk As Object
  Set xlApp = CreateObject("Excel.Application")
  Set xlwbk = xlApp.Open("x:\folder\filename.xlsx")
#End If


Тогда "перед отдачей в продукт Вы удаляете референс на объектную либу Экселя и указываете IsExlRef = 0.
Всё! Код корректировать не надо. При необходимости доработки кода снова создаете референс, даете IsExlRef = 1, наслаждаетесь подсказками Intellisince, а по завершении см. выше.
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39682045
Sergey8969
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь! Разобрался, теперь все нормально работает на всех компах.

На самом деле у меня уже код был вида:
Код: sql
1.
2.
3.
4.
Dim xlapp As Object
Dim xlwbk As Object
Set xlApp = CreateObject("Excel.Application")
Set xlwbk = xlApp.Open("x:\folder\filename.xlsx")



, только вот эту деталь я не учел:
AkinaДа, если при разработке Вы используете экспортируемые библиотекой константы, то в продукте Вы должны либо использовать их численные значения, либо определить эти константы.
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39682075
POKEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Весьма чёткое и толковое объяснение от Akina.

Я делаю так же для работы с офисными приложениями, используя шаблоны Word и Excel. И для отправки сообщений через Outlook (либо другой почтовый клиент).

Дополнительно я ещё проверяю версию Access пользователя, чтобы понять, поддерживается ли у него лента, или надо использовать старую систему меню. например,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#If VBA7 Then

    'Начиная с Access 2010 поддерживается лента.
    'Глобальные константы для определния в свойствах форм меню (ленты), панели быстрого доступа (qat)
    'и контекстного меню. Почти всё задано с помощью XML кода, хранящегося в скрытой (системной) таблице USysRibbons.

    Public Const S_MENUBAR = ""
    Public Const S_TOOLBAR = ""
    Public Const S_SHORTCUTMENUBAR = "mnuPopUp"

' .... Дальше разные команды и процедуры обработки контролов ленты.

#Else

    'Access 2003. И ниже. Лента не поддерживается.
    'Глобальные константы для определния в свойствах форм меню (вместо ленты),
    'панели быстрого доступа и контекстного меню.

    Public Const S_MENUBAR = "Menu_My"
    Public Const S_TOOLBAR = "Form_View_My"
    Public Const S_SHORTCUTMENUBAR = "FormViewControl_My"

#End If
...
Рейтинг: 0 / 0
проблема совместимости разных версий
    #39713543
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брошу свои 2 копейки.

to POKER
Access 2007 так же имеет ленту, но работает с VBA 6

На сайте HiProg.com вместо подстановки числовых значений в окончательном варианте предлагают подключать модули с прописанными константами. Тогда не надо всё "вертать у зад" при корректировке. Прикладываю три модуля с константами для Excel, Word и Outlook, взятые с HiProg.com
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / проблема совместимости разных версий
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]