Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
Проблема.
программа работает под Access версий от 2000 до 2016.
Хотел сделать подпрограмму для сворачивания при запуске ленты Ribbon. Написал такую вещь. Поскольку в А2000-2003 ленты нет, воспользовался операторами условной компиляции
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.

Что делать?

Причём вот такая структура работает
#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-ти миллиардное состояние Билла Гейтса?
8 июн 17, 10:10    [20549050]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
#
Guest
Значение, которое проверяется в директиве условной компиляции, должно быть определено на момент компиляции (а не вовремя выполнения).
8 июн 17, 10:28    [20549124]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
И как это здесь провернуть?
8 июн 17, 10:40    [20549186]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19590
Переместите код минимизации в процедуру. Вместо условной компиляции примените обращение к этой процедуре по условию.

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 не вызывает процедуру, и ошибки не будет.
8 июн 17, 10:54    [20549232]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
Спасибо.

Я выкрутился несколько иначе.
Команда CommandBars.ExecuteMso "MinimizeRibbon" работает только в Access начиная с версии 2010. А в Версии 2010 уже используется VBA7. Так что я переделал код следующим образом
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

А за предложение спасибо.
8 июн 17, 11:13    [20549308]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
Да, с таким изменением компиляция в Access 2003 и в access 2010 проходит без ошибок.
8 июн 17, 11:20    [20549334]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
#
Guest
Joss,

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

Application.SetOption("Conditional Compilation Arguments", "<arguments>")
8 июн 17, 11:21    [20549339]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
Вот что нашел в учебнике про условную компиляцию

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

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

Аргументы:

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

Синтаксис:
  #If выражение Then
    инструкции 
  [#ElseIf выражение-n Then
    [инструкции_elseif]] 
  [#Еlse
    [инструкции_elseif ]],
  #End If

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

  #Const WinPl = 1
  ' если Windows95, то Const WinPl = 1 
  ' если Windows NT, то Const WinPl = 2
  #If WinPl = 1 Then ФайлЗаставка = Start95.bmp" 
  #If WinPl = 2 Then ФайлЗаставка = "StartNT.bmp"
8 июн 17, 12:01    [20549540]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
#
Guest
Joss
А в Версии 2010 уже используется VBA7.
только в 64 битном офисе
8 июн 17, 14:21    [20550180]     Ответить | Цитировать Сообщить модератору
 Re: Компиляция кода в зависимости от версии Access  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4950
#
Joss
А в Версии 2010 уже используется VBA7.
только в 64 битном офисе
Неправда Ваша. И 32-х разрядной версии VBA7 существует и прекрасно работает. Обратите внимание на предоставленный код
#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-х разрядный.
9 июн 17, 11:51    [20552547]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить