|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Здравствуйте! Потребовалось мне одну разработку регулярно переводить в различные версии Access, включая Ac97. В разработке использованы некоторые возможности более поздних версий, неизвестные 97-ому. В частности, условное форматирование. Задается оно программно – изначально в ленточной форме отсутствует, чтобы не мигало и не тормозило, а в определенном случае создаются нужные правила, это вынесено в отдельную процедуру. Чтобы исключить ошибки компиляции, в Ac97 попробовала применить условную компиляцию. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Разумеется, Код: vbnet 1. 2. 3.
оказалось глупостью, ведь значение S в момент компиляции не определено, да и само S тоже. Передавать аргументы условной компиляции извне не очень хочется, так как потребуется их каждый раз задавать вручную. Кроме того, они и задаются по-разному: для Ac97 — через главное меню БД Код: vbnet 1.
для Ac2000 и далее — через редактор VBA Код: vbnet 1.
Запускать через ярлык со значением аргумента условной компиляции тоже не очень удобно. Пока вижу наименее трудоемкий способ таким – два разных условия и переносить знак комментария: Код: vbnet 1. 2. 3. 4. 5. 6.
Всего одно движение. Но хочется так наладить, чтобы все происходило вообще само собой, без моего участия каждый раз. Поэтому такой вопрос: Есть ли такая константа компилятора VBA, значение которой будет говорить об используемой версии Access, или хотя бы офиса? По аналогии с константами Win16/Win32/Win64. Список имеющихся констант смотрела https://msdn.microsoft.com/ru-ru/library/office/gg264614.aspx. Но вдруг кто-то знает секретные константы.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 15:36 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__Michelle, Константы VBA6 и VBA7 не помогут? Вроде как VBA6 это до Ac97, а 7 2000 и дальше ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 15:49 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
akirey, Спасибо. Очень возможно. Доступ к 97-му буду иметь завтра, там и проверю. Думаю, главное определить, что это 97, то есть достаточно будет проверять Vba6. Для всех же остальных версий действия одинаковые. А если на машине несколько офисов, не перекроется ли более раннее VBA более поздним? Наверное, все же нет. В общем, надо все проверить. О результатах сообщу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 15:59 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__Michelle Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В вашем конкретном случае условная компиляция не нужна. Достаточно обычного If, т.к. наличие свойства/метода у объекта при компиляции не проверяется. Только acExpression нужно заменить значением или собственной (можно одноименной) константой. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 16:16 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Анатолий ( Киев ), Да. Спасибо. Этот вариант мною уже опробован как запасной. Но я еще для гарантии вместо явного указания формы сделала так Код: vbnet 1. 2. 3. 4.
Может, это использование объекта и лишнее. Вместо acExpression использовала 1. Но это уже после того, как у меня не вышло с условной компиляцией. А разобраться ведь все-таки надо.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 16:25 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 20:09 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__Michelle, добрый вечер. Может пригодится, гляньте(из хелпа): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 20:42 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, Если ТС и в правду юзает А97, то не пригодится. А97 не знает что такое currentproject. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 20:46 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
studieren, ну я не помню, как там 97-ом но есть два св-ва: CodeProject.FileFormat CurrentProject.FileFormat Returns an AcFileFormat constant indicating the Microsoft Access version format of the specified project. Read-only. Может CodeProject нужно попробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 20:51 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
studieren, Спасибо. Очень интересно. Что-то более осмысленное сказать пока не в состоянии - надо внимательно прочитать и здесь и по ссылкам. И не один раз. Первое впечатление - весьма непростой вариант, для корифеев.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 21:07 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, ))) Спасибо. Но это действительно появилось позже. Сейчас проверила в 2000-м - еще такого свойства нет, а вот в 2003-м уже есть. И потом, ведь это, как мне кажется, примерно то же, что и SysCmd(acSysCmdAccessVer). Только результат по-другому представлен. А, нет, все же не полный аналог. SysCmd(acSysCmdAccessVer) дает версию Access, а CodeProject.FileFormat - в каком формате сохранен файл БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 21:13 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__Michelle, очень интересный вопрос вы задали. Условную компиляцию использовал но глубоко не копал. Оказывается, если в #If использовать выражение, которое не объявлено ни в #Const, ни в параметрах проекта, то оно воспринимается как False. В А2010 есть внутренние константы VBA6 и VBA7, обе в #If принимаются как True. В А2000-2003 вероятно (проверить негде) только VBA6 - True. А А97, это VBA 5 , поэтому, ИМХО, достаточно проверять VBA6, чтоб выяснить это. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 11:27 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Анатолий ( Киев ), akirey, Спасибо за идеи. Прошу прощения за долгую паузу.))) Проверила константы VBA6 и VBA7 в версиях Access 97, 2000, 2003, 2007. Получилось следующее. В 97-ом ни одна константа не известна. 2000-й, 2003-й, 2007-й знают только VBA6. Гипотетической константы VBA5 нет вообще. Окончательно сделала так: Код: vbnet 1. 2. 3. 4. 5.
Все работает. И не пришлось применять уловки, замещать acExpression значением. _________________________________________________________________________________ Однако попутно возникли некоторые странности, заставившие разбираться. Код: vbnet 1.
и Код: vbnet 1.
дают одинаковый результат – Истина. Почему? В конце концов, экспериментальным путем, выяснилось, что VBA6 = 1, а Not VBA6 = –2. И то, и другое трактуется как Истина. И вообще, Истиной считается любое ненулевое и непустое число – как положительное, так и отрицательное, как целое, так и дробное. А Not, согласно результатам моих экспериментов, действует на <значение> так: Код: vbnet 1.
, то есть, например, Код: vbnet 1. 2.
Информация о том, что ненулевое число дает Истину, где-то мне раньше попадалась. Что скажете обо всем этом?))) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2016, 18:29 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__MichelleИнформация о том, что ненулевое число дает Истину, где-то мне раньше попадалась. If именно так и работает. Теперь мы знаем, что так же работает и #If. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2016, 18:38 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Владимир Саныч, Меня удивило, что поэтому #If VBA6 Then и #If Not VBA6 Then дают одинаковый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2016, 18:44 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__MichelleА Not, согласно результатам моих экспериментов, действует на <значение> так: Код: vbnet 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 05:45 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__MichelleВладимир Саныч, Меня удивило, что поэтому #If VBA6 Then и #If Not VBA6 Then дают одинаковый результат. Здесь Not работает как-то странно. If работает правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 07:53 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Владимир Саныч__MichelleВладимир Саныч, Меня удивило, что поэтому #If VBA6 Then и #If Not VBA6 Then дают одинаковый результат. Здесь Not работает как-то странно. If работает правильно. Если принять во внимание __Michelle... экспериментальным путем выяснилось, что VBA6 = 1 ... то и Not работает правильно: Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 09:18 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Но в справке также сказаноИз справки 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.
.А –2 тоже трактуется как True. Налицо противоречие. Табличка, получается, справедлива только, если expression 0, -1 или Null. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 09:38 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__Michelle, Код: vbnet 1.
Многие функции API возвращают 0 или 1 как булевы значения, в системе они соответствуют False и True ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 10:24 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
__MichelleТо есть, применение Not к выражению, трактуемому как True, должно давать False. Возьмем выражение 1, это трактуется как True, но Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 10:29 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Michelle, мне нравится ваша жажда познания... Итак: 1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1 2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно. Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа. При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 10:47 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Michelle, мне нравится ваша жажда познания... Итак: 1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1 2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно. Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа. При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное. А есть есчё константа "-1". С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 11:01 |
|
Константы условной компиляции
|
|||
---|---|---|---|
#18+
ROIАнатолий ( Киев )Michelle, мне нравится ваша жажда познания... Итак: 1. Not, это оператор меняющий состояние каждого бита на противоположное, т.е. 1->0, а 0->1 2. Хоть VBA в операторах сравнения и оперирует понятиями ноль и не ноль, но родным True для него является -1, т.е. в FF в Hex, т.е. все биты равны 1. Поэтому Not превращает это значение в 0 и обратно. Любые целые числа (отличные от 0 и -1) оператор Not превращает в другие целые числа. При этом для всех числовых типов кроме Byte (здесь FF равно 255) самый старший бит определяет - положительное число или отрицательное. А есть есчё константа "-1". С уважением. Вернее значение, сори. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2016, 11:02 |
|
|
start [/forum/topic.php?fid=45&msg=39207240&tid=1613720]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 152ms |
0 / 0 |