Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Компиляция кода в зависимости от версии Access / 10 сообщений из 10, страница 1 из 1
08.06.2017, 10:10
    #39468352
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Проблема.
программа работает под Access версий от 2000 до 2016.
Хотел сделать подпрограмму для сворачивания при запуске ленты Ribbon. Написал такую вещь. Поскольку в А2000-2003 ленты нет, воспользовался операторами условной компиляции
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function DbRibbonMinimize() As Boolean
Dim strversion As String
Dim sngVersion As Single
Dim intComp As Integer
strversion = SysCmd(acSysCmdAccessVer)
sngVersion = CSng(Val(strversion))
If sngVersion <= 12 Then intComp = -1

#If intComp Then

#Else
    If Not RibbonState() Then
        Application.Echo False
        CommandBars.ExecuteMso "MinimizeRibbon"
        Application.Echo True
    End If
#End If

End Function

По идее в Access 2003 вторая ветка не должна компилироваться. Но при запуске функции Access останавливается на операторе .ExecuteMso и выдаёт сообщение Method or data member not found .

Что делать?

Причём вот такая структура работает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#If VBA7 Then
'  Code is running in the new VBA7 editor
     #If Win64 Then
     '  Code is running in 64-bit version of Microsoft Office
     #Else
     '  Code is running in 32-bit version of Microsoft Office
     #End If
#Else
' Code is running in VBA version 6 or earlier
#End If



-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
08.06.2017, 10:28
    #39468368
#
#
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Значение, которое проверяется в директиве условной компиляции, должно быть определено на момент компиляции (а не вовремя выполнения).
...
Рейтинг: 0 / 0
08.06.2017, 10:40
    #39468381
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
И как это здесь провернуть?
...
Рейтинг: 0 / 0
08.06.2017, 10:54
    #39468392
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Переместите код минимизации в процедуру. Вместо условной компиляции примените обращение к этой процедуре по условию.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function DbRibbonMinimize() As Boolean
If Val(SysCmd(acSysCmdAccessVer)) > 12 Then Call PerformMinimize
End Function

Private Function PerformMinimize()
If Not RibbonState() Then
    Application.Echo False
    CommandBars.ExecuteMso "MinimizeRibbon"
    Application.Echo True
End If
End Function


Компиляция процедуры, конечно, выполняется, но вот проверка существования метода CommandBars.ExecuteMso выполняется только в момент обращения к процедуре. Соответственно если версия Access не знает про этот метод, то условие в DbRibbonMinimize не вызывает процедуру, и ошибки не будет.
...
Рейтинг: 0 / 0
08.06.2017, 11:13
    #39468416
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Спасибо.

Я выкрутился несколько иначе.
Команда CommandBars.ExecuteMso "MinimizeRibbon" работает только в Access начиная с версии 2010. А в Версии 2010 уже используется VBA7. Так что я переделал код следующим образом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function DbRibbonMinimize() As Boolean

#If vba7 Then
    If Not RibbonState() Then
        Application.Echo False
        CommandBars.ExecuteMso "MinimizeRibbon"
        Application.Echo True
    End If
#End If

End Function

Function RibbonState() As Long
'Result: 0=normal, -1=autohide
    RibbonState = (CommandBars("Ribbon").Controls(1).Height < 100)
End Function


А за предложение спасибо.
...
Рейтинг: 0 / 0
08.06.2017, 11:20
    #39468423
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Да, с таким изменением компиляция в Access 2003 и в access 2010 проходит без ошибок.
...
Рейтинг: 0 / 0
08.06.2017, 11:21
    #39468426
#
#
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Joss,

В эту сторону, имхо, нужно двигаться - 5171537
И работать с этими параметрами можно программно:
Код: vbnet
1.
2.
3.
Application.GetOption("Conditional Compilation Arguments")

Application.SetOption("Conditional Compilation Arguments", "<arguments>")
...
Рейтинг: 0 / 0
08.06.2017, 12:01
    #39468468
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
Вот что нашел в учебнике про условную компиляцию

В VBA имеются две инструкции компилятора, с помощью которых можно обеспечить условную компиляцию некоторых фрагментов исходного кода. Для условной компиляции необходимо определить условные константы компилятора, значениями которых будет руководствоваться компилятор при обработке программы. Константы должны быть определены в разделе глобальных объявлений модуля.

Синтаксис:
Код: vbnet
1.
  #Const имяКонстанты = выражение


Аргументы:

имяКонстанты - имя константы; должно соответствовать стандартным соглашениям об именах переменных.
выражение - константа в явном представлении, другая условная константа компилятора или любая их комбинация, которая включает любые арифметические или логические операторы, за исключением Is.
Чтобы указать компилятору, какие фрагменты кода компилировать при разных условиях, используется инструкция #If. Оператор If является объектом компилирования в отличие от инструкции #If, которая является служебной пометкой в тексте, принимаемой компилятором к сведению.

Синтаксис:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  #If выражение Then
    инструкции 
  [#ElseIf выражение-n Then
    [инструкции_elseif]] 
  [#Еlse
    [инструкции_elseif ]],
  #End If


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

Код: vbnet
1.
2.
3.
4.
5.
  #Const WinPl = 1
  ' если Windows95, то Const WinPl = 1 
  ' если Windows NT, то Const WinPl = 2
  #If WinPl = 1 Then ФайлЗаставка = Start95.bmp" 
  #If WinPl = 2 Then ФайлЗаставка = "StartNT.bmp"
...
Рейтинг: 0 / 0
08.06.2017, 14:21
    #39468655
#
#
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
JossА в Версии 2010 уже используется VBA7. только в 64 битном офисе
...
Рейтинг: 0 / 0
09.06.2017, 11:51
    #39469310
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компиляция кода в зависимости от версии Access
#JossА в Версии 2010 уже используется VBA7. только в 64 битном офисе Неправда Ваша. И 32-х разрядной версии VBA7 существует и прекрасно работает. Обратите внимание на предоставленный код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#If VBA7 Then
'  Code is running in the new VBA7 editor
     #If Win64 Then
     '  Code is running in 64-bit version of Microsoft Office
     #Else
     '  Code is running in 32-bit version of Microsoft Office
     #End If
#Else
' Code is running in VBA version 6 or earlier
#End If

Сначала идёт проверка на версию VBA , а затем на разрядность. Вот VBA6, тот только 32-х разрядный.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Компиляция кода в зависимости от версии Access / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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