Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Microsoft Access - программирование и готовые решения


Выпуск 91. Препроцессор, или как дважды определить одну функцию в VBA

Подписка: "Microsoft Access  - программирование и готовые решения"
Дата17.05.2008
Сайтhttp://www.leadersoft.ru
Тема:  Препроцессор или как дважды определить одну функцию в VBA
Пример: http://shops.leadersoft.ru/Product.aspx?ProductID=3795
Источник: http://shops.leadersoft.ru/Product.aspx?ProductID=19869


Полезные ссылки
http://www.leadersoft.ru/russian/orders/index.html - заказ баз данных
http://shops.leadersoft.ru/Catalog.aspx?MarketID=1  - исходники и программы для Access, SQL Server
http://shops.leadersoft.ru/Catalog.aspx?MarketID=18 - игры, антивирусы и другие программы (5000 шт.)
http://help.leadersoft.ru/Форумы/tabid/74/Default.aspx - форумы

Вступление 
    Препроцессор - это средство разработки программ было заимствовано из языка С. Он использовался для разработки операционных систем. Суть его - это сокращение программного кода, путем обработки нужных фрагментов кода еще до процесса компиляции.
    Синим цветом показаны, команды относящиеся к препроцессору. Он первым начинает обработку программного кода. После его прохода на выходе, используя #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
Полный пример: http://shops.leadersoft.ru/Product.aspx?ProductID=3795

Пример 3. Создание демоверсии

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


#Const DemoVer = 1 ' !!! Константа действует только в текущем модуле.
#If DemoVer = 1 Then
   Dim MaxRecords = 10 ' Можно читать только 10 записей из таблиц
 #Else
   Dim MaxRecords = 0 ' Нет ограничений на чтение записей
#End If
 

 


В избранное