Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Константы условной компиляции / 25 сообщений из 47, страница 1 из 2
30.03.2016, 15:36
    #39204259
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Здравствуйте!

Потребовалось мне одну разработку регулярно переводить в различные версии Access, включая Ac97.
В разработке использованы некоторые возможности более поздних версий, неизвестные 97-ому.
В частности, условное форматирование.
Задается оно программно – изначально в ленточной форме отсутствует, чтобы не мигало и не тормозило,
а в определенном случае создаются нужные правила, это вынесено в отдельную процедуру.
Чтобы исключить ошибки компиляции, в Ac97 попробовала применить условную компиляцию.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Dim S As String
 S = SysCmd(acSysCmdAccessVer)
 #If S = "8.0" Then
  <ничего не должно происходить>
 #Else
  With Forms!<имя формы>
   If .<имя поля_1>.FormatConditions.Count = 0 Then
    .<имя поля_1>.FormatConditions.Add acExpression, , "<условие>"
    .<имя поля_1>.FormatConditions(0).BackColor = RGB(210, 255, 210)
    …………………………………………………
   End If
  End With
 #End If

Разумеется,
Код: vbnet
1.
2.
3.
 Dim S As String
 S = SysCmd(acSysCmdAccessVer)
 #If S = "8.0" Then

оказалось глупостью, ведь значение S в момент компиляции не определено, да и само S тоже.

Передавать аргументы условной компиляции извне не очень хочется,
так как потребуется их каждый раз задавать вручную.
Кроме того, они и задаются по-разному:
для Ac97 — через главное меню БД
Код: vbnet
1.
Сервис —> Параметры.—> Другие —> Аргументы условной компиляции

для Ac2000 и далее — через редактор VBA
Код: vbnet
1.
Tools —> Project Properties Dialog Box —> General Tab —> Conditional Compilation Arguments


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

Пока вижу наименее трудоемкий способ таким – два разных условия и переносить знак комментария:
Код: vbnet
1.
2.
3.
4.
5.
6.
#If True Then           ‘     для Ac97
‘#If False Then         ‘     для Ac2000 и далее
  <ничего не должно происходить>
#Else
  <необходимые действия>
#End If

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

Поэтому такой вопрос:

Есть ли такая константа компилятора VBA, значение которой будет говорить об используемой версии Access, или хотя бы офиса?
По аналогии с константами Win16/Win32/Win64.

Список имеющихся констант смотрела https://msdn.microsoft.com/ru-ru/library/office/gg264614.aspx.
Но вдруг кто-то знает секретные константы.)))
...
Рейтинг: 0 / 0
30.03.2016, 15:49
    #39204273
akirey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__Michelle,

Константы VBA6 и VBA7 не помогут?
Вроде как VBA6 это до Ac97, а 7 2000 и дальше
...
Рейтинг: 0 / 0
30.03.2016, 15:59
    #39204285
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
akirey,

Спасибо.
Очень возможно.
Доступ к 97-му буду иметь завтра, там и проверю.
Думаю, главное определить, что это 97, то есть достаточно будет проверять Vba6.
Для всех же остальных версий действия одинаковые.

А если на машине несколько офисов, не перекроется ли более раннее VBA более поздним?
Наверное, все же нет.
В общем, надо все проверить.

О результатах сообщу.
...
Рейтинг: 0 / 0
30.03.2016, 16:16
    #39204307
Константы условной компиляции
__Michelle
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Dim S As String
 S = SysCmd(acSysCmdAccessVer)
 #If S = "8.0" Then
  <ничего не должно происходить>
 #Else
  With Forms!<имя формы>
   If .<имя поля_1>.FormatConditions.Count = 0 Then
    .<имя поля_1>.FormatConditions.Add acExpression, , "<условие>"
    .<имя поля_1>.FormatConditions(0).BackColor = RGB(210, 255, 210)
    …………………………………………………
   End If
  End With
 #End If

В вашем конкретном случае условная компиляция не нужна. Достаточно обычного If, т.к. наличие свойства/метода у объекта при компиляции не проверяется.
Только acExpression нужно заменить значением или собственной (можно одноименной) константой.
...
Рейтинг: 0 / 0
30.03.2016, 16:25
    #39204319
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Анатолий ( Киев ),

Да. Спасибо.
Этот вариант мною уже опробован как запасной.
Но я еще для гарантии вместо явного указания формы сделала так
Код: vbnet
1.
2.
3.
4.
Dim Ob As Object
Set Ob = Forms!<имя формы>
With Ob
...................

Может, это использование объекта и лишнее.
Вместо acExpression использовала 1.

Но это уже после того, как у меня не вышло с условной компиляцией.
А разобраться ведь все-таки надо.)))
...
Рейтинг: 0 / 0
30.03.2016, 20:09
    #39204521
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__Michelle,

Есть ещё 1 вариант, правда очень трудоёмкий. Зато есть существенные плюсы.
Можно вообще убрать весь код из MS Access и написать VB скрипты, которые будут находиться в какой-либо таблице.
Создаёте единcтвенную VBA процедуру, которая и запускает VB скрипт. Что-то вроде этого 13121558

Правда VB скрипт немножко отличается от VBA, не все функции и процедуры есть в VBS, да и есть некоторые отличии. Со временем привык как-то. Всё, что VB скрипт не умеет, пришлось делать в VBA, а в VB скрипт вызывать их.

Какие существенные плюсы можно извлечь от этого?

1) Вам достаточно поменять данные в спец. таблице, где хранятся VB скрипты. У Всех юзеров не надо будет менять файл, а если все пользуются общим файлом, то не надо выгонять их.
2) Можно потихоньку создавать такие коды, которые будут работать в любой ОС и в любом офисе (32 или 64 разрядность не имеет значение, т.к. VBS это язык позднего связывания!).

Минусы:
1) Хлопотно такие коды писать. Лично я сначала тренируюсь в Excel, ибо нет необходимости предварительного сохранения тренировочного файла.
2) Нет возможности прервать запущенный VBS код с помощью Ctrl + Break.
3) Очень осторожно с таблицей, где будут хранится все скрипты. Нечаянно удалил, то всё. Все коды исчезнут. Поэтому тщательно нужно охранять от юзеров.

P.S.
Даже Win API функцию тоже можно вызывать в VB скрипт, только для этого сначала надо регистрировать библиотеку dynwrapx.dll.
Вот примерчик 14019148
...
Рейтинг: 0 / 0
30.03.2016, 20:42
    #39204538
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__Michelle, добрый вечер.

Может пригодится, гляньте(из хелпа):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Dim strFormat As String

Select Case CurrentProject.FileFormat
    Case acFileFormatAccess2
        strFormat = "Microsoft Access 2"
    Case acFileFormatAccess95
        strFormat = "Microsoft Access 95"
    Case acFileFormatAccess97
        strFormat = "Microsoft Access 97"
    Case acFileFormatAccess2000
        strFormat = "Microsoft Access 2000"
    Case acFileFormatAccess2002
        strFormat = "Access 2002 - 2003"
    Case acFileFormatAccess12
        strFormat = "Microsoft Access 2007"
End Select

MsgBox "This is a " & strFormat & " project."
...
Рейтинг: 0 / 0
30.03.2016, 20:46
    #39204542
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Вакшуль Сергей,

Если ТС и в правду юзает А97, то не пригодится. А97 не знает что такое currentproject.
...
Рейтинг: 0 / 0
30.03.2016, 20:51
    #39204550
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
studieren,

ну я не помню, как там 97-ом

но есть два св-ва:
CodeProject.FileFormat
CurrentProject.FileFormat

Returns an AcFileFormat constant indicating the Microsoft Access version format of the specified project. Read-only.
Может CodeProject нужно попробовать.
...
Рейтинг: 0 / 0
30.03.2016, 21:07
    #39204562
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
studieren,

Спасибо. Очень интересно.
Что-то более осмысленное сказать пока не в состоянии -
надо внимательно прочитать и здесь и по ссылкам. И не один раз.
Первое впечатление - весьма непростой вариант, для корифеев.)))
...
Рейтинг: 0 / 0
30.03.2016, 21:13
    #39204565
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Вакшуль Сергей,

)))
Спасибо.
Но это действительно появилось позже.
Сейчас проверила в 2000-м - еще такого свойства нет, а вот в 2003-м уже есть.

И потом, ведь это, как мне кажется, примерно то же, что и SysCmd(acSysCmdAccessVer).
Только результат по-другому представлен.
А, нет, все же не полный аналог.
SysCmd(acSysCmdAccessVer) дает версию Access, а
CodeProject.FileFormat - в каком формате сохранен файл БД.
...
Рейтинг: 0 / 0
31.03.2016, 11:27
    #39204895
Константы условной компиляции
__Michelle, очень интересный вопрос вы задали.
Условную компиляцию использовал но глубоко не копал.
Оказывается, если в #If использовать выражение, которое не объявлено ни в #Const, ни в параметрах проекта, то оно воспринимается как False.
В А2010 есть внутренние константы VBA6 и VBA7, обе в #If принимаются как True. В А2000-2003 вероятно (проверить негде) только VBA6 - True. А А97, это VBA 5 , поэтому, ИМХО, достаточно проверять VBA6, чтоб выяснить это.
...
Рейтинг: 0 / 0
03.04.2016, 18:29
    #39206934
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Анатолий ( Киев ), akirey,

Спасибо за идеи.
Прошу прощения за долгую паузу.)))

Проверила константы VBA6 и VBA7 в версиях Access 97, 2000, 2003, 2007.
Получилось следующее.
В 97-ом ни одна константа не известна.
2000-й, 2003-й, 2007-й знают только VBA6.
Гипотетической константы VBA5 нет вообще.
Окончательно сделала так:
Код: vbnet
1.
2.
3.
4.
5.
 #If VBA6 Then
  <настройка условного форматирования>
 #Else
  <ничего не должно происходить>
 #End If

Все работает. И не пришлось применять уловки, замещать acExpression значением.
_________________________________________________________________________________

Однако попутно возникли некоторые странности, заставившие разбираться.
Код: vbnet
1.
#If VBA6 Then

и
Код: vbnet
1.
#If Not VBA6 Then

дают одинаковый результат – Истина. Почему?
В конце концов, экспериментальным путем, выяснилось, что VBA6 = 1, а Not VBA6 = –2.
И то, и другое трактуется как Истина.
И вообще, Истиной считается любое ненулевое и непустое число –
как положительное, так и отрицательное, как целое, так и дробное.
А Not, согласно результатам моих экспериментов, действует на <значение> так:
Код: vbnet
1.
Not <значение> = ((-1) * <значение>)) + (-1) 

, то есть, например,
Код: vbnet
1.
2.
Not 10 = -11
Not (Not 10) = 10

Информация о том, что ненулевое число дает Истину, где-то мне раньше попадалась.

Что скажете обо всем этом?)))
...
Рейтинг: 0 / 0
03.04.2016, 18:38
    #39206935
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__MichelleИнформация о том, что ненулевое число дает Истину, где-то мне раньше попадалась.
If именно так и работает. Теперь мы знаем, что так же работает и #If.
...
Рейтинг: 0 / 0
03.04.2016, 18:44
    #39206936
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Владимир Саныч,

Меня удивило, что поэтому
#If VBA6 Then
и
#If Not VBA6 Then
дают одинаковый результат.
...
Рейтинг: 0 / 0
04.04.2016, 05:45
    #39207074
Константы условной компиляции
__MichelleА Not, согласно результатам моих экспериментов, действует на <значение> так:
Код: vbnet
1.
Not <значение> = ((-1) * <значение>)) + (-1) 


Из справки AccessIn addition, the Not operator inverts the bit values of any variable and sets the corresponding bit in result according to the following table:

If bit in expression isThen bit in result is 01 10
...
Рейтинг: 0 / 0
04.04.2016, 07:53
    #39207100
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__MichelleВладимир Саныч,

Меня удивило, что поэтому
#If VBA6 Then
и
#If Not VBA6 Then
дают одинаковый результат.
Здесь Not работает как-то странно. If работает правильно.
...
Рейтинг: 0 / 0
04.04.2016, 09:18
    #39207136
Константы условной компиляции
Владимир Саныч__MichelleВладимир Саныч,

Меня удивило, что поэтому
#If VBA6 Then
и
#If Not VBA6 Then
дают одинаковый результат.
Здесь Not работает как-то странно. If работает правильно.
Если принять во внимание
__Michelle... экспериментальным путем выяснилось, что VBA6 = 1 ...
то и Not работает правильно:
Код: vbnet
1.
2.
3.
4.
?Hex(Not 1)
FFFE
?&HFFFE
-2 
...
Рейтинг: 0 / 0
04.04.2016, 09:38
    #39207154
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Но в справке также сказаноИз справки Access Remarks

The following table illustrates how result is determined:

If expression is Then result is True False False True Null Null
То есть, применение Not к выражению, трактуемому как True, должно давать False.
Возьмем выражение 1, это трактуется как True, но
Код: vbnet
1.
2.
Debug.Print CInt(Not 1)
-2 

.А –2 тоже трактуется как True.
Налицо противоречие.
Табличка, получается, справедлива только, если expression 0, -1 или Null.
...
Рейтинг: 0 / 0
04.04.2016, 10:24
    #39207209
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
__Michelle,

Код: vbnet
1.
#If Not VBA6 <> 0 Then

Многие функции API возвращают 0 или 1 как булевы значения, в системе они соответствуют False и True
...
Рейтинг: 0 / 0
04.04.2016, 10:29
    #39207216
Константы условной компиляции
__MichelleТо есть, применение Not к выражению, трактуемому как True, должно давать False.
Возьмем выражение 1, это трактуется как True, но
Код: vbnet
1.
2.
Debug.Print CInt(Not 1)
-2 

.А –2 тоже трактуется как True.
Налицо противоречие.
Табличка, получается, справедлива только, если expression 0, -1 или Null.
Единица трактуется как True инструкцией If, а Not считает ее числом.
Кроме того, обратите внимание, что True(-1) при инвертировании битов переходит в False(0) и наоборот - False в True.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
?Hex(Not False)
FFFF
?Hex(Not 0)
FFFF
?Hex(Not True)
0
?Hex(Not -1)
0
...
Рейтинг: 0 / 0
04.04.2016, 10:47
    #39207240
Константы условной компиляции
Michelle, мне нравится ваша жажда познания...
Итак:
1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1
2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно.
Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа.
При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное.
...
Рейтинг: 0 / 0
04.04.2016, 11:01
    #39207256
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
Анатолий ( Киев )Michelle, мне нравится ваша жажда познания...
Итак:
1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1
2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно.
Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа.
При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное.
А есть есчё константа "-1".
С уважением.
...
Рейтинг: 0 / 0
04.04.2016, 11:02
    #39207258
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
ROIАнатолий ( Киев )Michelle, мне нравится ваша жажда познания...
Итак:
1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1
2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно.
Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа.
При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное.
А есть есчё константа "-1".
С уважением.
Вернее значение, сори.
...
Рейтинг: 0 / 0
04.04.2016, 12:17
    #39207385
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Константы условной компиляции
ROIА есть есчё константа "-1".
С уважением.ROIВернее значение, сориВ чем смысл Вашего замечания?
Прошу прощения, но мне кажется, что Вы сорите.)))
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Константы условной компиляции / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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