Вступление |
Препроцессор - это средство разработки программ было заимствовано из языка С. Он использовался для разработки операционных систем. Суть его - это сокращение программного кода, путем обработки нужных фрагментов кода еще до процесса компиляции. Синим цветом показаны, команды относящиеся к препроцессору. Он первым начинает обработку программного кода. После его прохода на выходе, используя #If - Else будет создан нужный нам текстовый файл. После этого компилятор превратит код VBA в машинный код. Для того, чтобы понять как работает препроцессор рассмотрим несколько примеров. |
Пример 1. Компиляция базы для Vista
Вы решили использовать ссылки на Word, Excel, Outlook. К сожалению на OS Vista это может вызвать проблемы из-за того, что они неправильно будут обрабатываться в mde и ade проектах. Вам надо будет привязывать ссылки в момент вызова приложения CreateObject("Application.Word"), а не через References в VBA (New Application.Word). Управлять и писать код на VBA в первом варианте - невозможно. У офисных приложений много переменных, а в варианте с CreateObject мы их не видим. Суть решения - ставим ссылку на Word и решаем задачу. Далее копируем фрагменты кода и заменяем типы переменных на object. Заключение. Для создания рабочей версии базы данных для пользователей снимите ссылку в VBA на Word, приравняйте WordRef = 0, создайте проект mde или ade. В этом случае база данных будет работать и в XP и в Vista для офисов 2000, 2002, 2003, 2007
|
#Const WordRef = 1 ' !!! Константа действует только в текущем модуле. #If WordRef = 1 Then Dim app As New Word.Application Dim rng As Word.Range ' Область данных Dim tbl As Word.Table ' Таблица документа #Else Dim obj As Object Set obj = CreateObject("Word.Application") Dim rng As Object ' Область данных Dim tbl As Object ' Таблица документа #End If |
Пример 2. Двойное определение функций
Нам надо в Word вставить таблицу или запрос из базы данных. Это делает функция InsertDatabase. При этом в версии A2000 - она имела одни параметры, а в Access 2002 - другие. Изменилась строка соединения. Если не использовать препроцессор, то придется писать несколько баз данных для разных версий. Понятно, что работать с одной базой значительно проще, чем управлять несколькими.
|
#Const AccessVer = 2003 ' !!! Константа действует только в текущем модуле. ' Вставляем таблицу, используя запрос из базы данных #If AccessVer = 2000 Then .InsertDatabase _ Style:=191, _ LinkToSource:=False, _ Connection:="Query ЗапросПримера04", _ DataSource:=strMDB #Else .InsertDatabase Format:=0, Style:=0, LinkToSource:=False, _ Connection:= _ "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" & strMDB & ";Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLE" _ , SQLStatement:="SELECT * FROM `ЗапросПримера04`" & "", PasswordDocument _ :="", PasswordTemplate:="", WritePasswordDocument:="", _ WritePasswordTemplate:="", DataSource:= _ strMDB, From:=-1, To _ :=-1, IncludeFields:=True #End If |
Пример 3. Создание демоверсии
Вы хотите сделать демоверсию и рабочую. Препроцессор в этом случае тоже может пригодиться. Определив участок кода для демоверсии и рабочей программы, после компиляции Вы получите демоверсию, которую взломать невозможно, потому что код рабочей версии не будет присутствовать в демоверсии.
|
#Const DemoVer = 1 ' !!! Константа действует только в текущем модуле. #If DemoVer = 1 Then Dim MaxRecords = 10 ' Можно читать только 10 записей из таблиц #Else Dim MaxRecords = 0 ' Нет ограничений на чтение записей #End If |