powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Компиляция кода в зависимости от версии Access
10 сообщений из 10, страница 1 из 1
Компиляция кода в зависимости от версии Access
    #39468352
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема.
программа работает под 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
Компиляция кода в зависимости от версии Access
    #39468368
#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
#
Гость
Значение, которое проверяется в директиве условной компиляции, должно быть определено на момент компиляции (а не вовремя выполнения).
...
Рейтинг: 0 / 0
Компиляция кода в зависимости от версии Access
    #39468381
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как это здесь провернуть?
...
Рейтинг: 0 / 0
Компиляция кода в зависимости от версии Access
    #39468392
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переместите код минимизации в процедуру. Вместо условной компиляции примените обращение к этой процедуре по условию.

Код: 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
Компиляция кода в зависимости от версии Access
    #39468416
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.

Я выкрутился несколько иначе.
Команда 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
Компиляция кода в зависимости от версии Access
    #39468423
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, с таким изменением компиляция в Access 2003 и в access 2010 проходит без ошибок.
...
Рейтинг: 0 / 0
Компиляция кода в зависимости от версии Access
    #39468426
#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
#
Гость
Joss,

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

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

В 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
Компиляция кода в зависимости от версии Access
    #39468655
#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
#
Гость
JossА в Версии 2010 уже используется VBA7. только в 64 битном офисе
...
Рейтинг: 0 / 0
Компиляция кода в зависимости от версии Access
    #39469310
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#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
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Компиляция кода в зависимости от версии Access
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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