Язык VBA (Visual Basic Application) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Язык VBA (Visual Basic Application)



Многие задачи можно решить с помощью макросов. Но их возможности не всегда достаточны и необходимо использовать возможности языка VBA.

· Он имеет все конструкции, необходимые для управления логикой программы.

· Обеспечивает возможность перехватить сообщение об ошибке, возникающее при работе программы и написать программу обработки этой ошибки.

· Поддерживает несколько механизмов для взаимодействия с другими приложениями (OLE – внедрение объектов)

При программировании на VBA необходимо помнить 2 момента:

1. VBA – объектно-ориентированный язык.

2. Модель программирования в access является событийно-управляемой.

 

Структура программ на VBA

Проект состоит из модулей, каждый модуль состоит из объявления (Declaration) и еще какой-то херни.

Модули могут быть стандартные, то есть находятся где угодно и не связаны ни с одним объектом и работают тогда, когда запустим.

И модули класса, содержат кроме процедур еще и описание объекта, и используются для создания объектов.

Типы данных VBA

Всего их 14

· array – описание массивов

· currency (@) – числа с заданным количеством знаком после запятой (для денег)

· double (#) – числа с плавающей точкой и двойной точностью.

· integer (%) – он и в Африке Integer

· long (&) - длинное целое

· single (!) – плавающая точка с обычной точностью

· object – ссылки на объект

· string ($) - строки

· variant – любой тип, но это тормозит трансляцию и забивает память, т.к. требует определение типа на ходу

· пользовательский

 

Описание переменных

Dim <имя перем>[As <тип данных>],[…

Dim a As string – переменная «а» строчного типа

Dim b% - переменная «b» типа Integer

Dim b%, c! – сам(а) посмотри что это значит, все описано выше:D

Const <имя к> [As <тип>] = выраж // выражение это число или формула

Например: Const C = 50

 

Замечание: Константа не может начинаться с префиксов ac, wd,xl, ol,vh.

 

Описание массивов

Dim <имя>(<размер1>,<размер2>…) [As <тип данных>]

Например: Dim a(15) As integer – целочисленный массив из 16 элементов

Dim b(3, 3)%

Dim c(1 to 7) As double // 7 чисел

Так описываются статические массивы. Но VBA позволяет работать с динамическими массивами, т.е. с такими, размер которых изменяется в процессе работы программы.

Dim <имя массива>() [As<тип>]

Redim[Preserve]<имя массива>(<размер>,<размер>…)

Preserve означает, что при новом определении длины массива старое содержание массива сохраняется.

Пример использования динамического массива

Dim Books() As integer

Dim n%

n=50

Redim Books(n)

… (заполнение массива)

Redim Preserve Books(n+10)

 

Тип, определяемый пользователем

Type Person

name $

Birthday As date

Endtype

Type book

Title As string

Content() As string

Author As Person

Endtype

Dim MyBook As Book

MyBook.title = “База данных”

Radim Content(1 to 10)

MyBook.content(1)=”Введение”

MyBook.content(2)=”Проектирование бд”

 

Управляющие конструкции VBA

Это команды, с помощью которых пишем программы

1) if <усл> then

<оператор 1>

[else

<оп 2>]

Endif

2) select case <проверяемое выражение>

case <список значений 1>

<операторы 1>

case <список значений 2>

<операторы 2>

Case else

<операторы n>

End Select

Список значение может быть:

· <выражение>

· <выр 1> to <выр 2>

· Is <логич опер> <выр>

 

Если нужно определить какое число введено с клавиатуры:

Dim t As integer

t=InputBox(“Введите число”)

Select Case t

Case 0

MsgBox(“Это ноль”)

Сase 1 to 100

MsgBox(“Это полож число”)

Case -100 to -1

MsgBox(“Это отриц”)

case Is <-100, Is>100

MsgBox(“Большое число”)

Case else

MsgBox(“Это не число”)

Endselect

 

Операторы цикла

1.1. do while <усл> <операторы> loop

Начинается с 0

1.2. do <операторы> loop while <усл>

Начинается с 1

1.3. do until <усл> <операторы> loop

1.4. do <операторы> loop until <усл>

1.5. for … next [<счетчик>]

1.6. Цикл для обработки семейства однородных объектов

for each <элемент> In <семейство> <операторы> next [<элемент>]

Можем перебирать объекты, например, таблицы, формы и др.

Пример. Функция, проверяющая открыта ли форма.

Function IsLoaded*(FormName As string) As Boolean

Dim frm As Form // Объектная переменная типа Form

IsLoaded = false

For each frm In Forms //семейство открытых форм

if frm Name = FormName then IsLoaded = true

Exit function

Endif

Next frm

Endfunction

Для отладки и работы этого модуля напишем модуль 2

Sub Vizov()

Dim str As string

Dim a As Boolean

str = InputBox(“Введите имя формы”)

a=IsLoaded(str)

MsgBox(a)

Endsub

 

Процедуры VBA

Они (проце дуры) бывают двух видов:

1. Обработки событий. Они связаны с некоторым объектом Access и хранятся в модуле этого объекта.

2. Общие. Могут хранится и в стандартных модулях и в модулях отчетов.

 

Подпрограммы:

1. Sub <имя подпрог> [<арг 1>, <арг 2>, …)]
<операторы процедуры>
endsub

2. Функции:
function <имя функции> [(арг.тип) [As <тип функции>]]
<операторы>
<имя ф> = <возвращаемое значение>
end function

Вызов осуществляется, как и в других программах.

Объявление процедур

Sub Int (arr() As Integer)
Dim I%, str$
For I = LBound(arr) to ИBound(arr)
str = “Введите след число” &i
arr(i)=inputbox(str)
next i
endsub

1. LBound и UBound – верхние и нижние значения массива

2. & - функция сцепления, которая сначала преобразует i в строку.

Объявление функции, подсчитывающей сумму любого числа аргументов:

FunctionSumVar(ParamArray vararg() As variant) %

ParamArray означает, что количество аргументов – переменное число

Dim intSum %, numb As variant
For each numb In vararg
int Sum = int Sum + numb
next numb
SumVar = intsum
endfunction

Фрагмент программы для вызова подпрограммы и функции

Dim intSl(1 to 38) As Integer
Dim int S%
Call Init (intSl)
int S = Sum Var (1, 2, 7, 15, 27, 30)

Передача параметров может осуществляться по значению или по ссылке:

By Val – по значению
By Ref – по ссылке
Sub Refval((x,By Val Y, by ref z)
x = x+1
y = y+1
z = z+1
MsgBox(x)
MsgBox(y)
MsgBox(z)
Endsub

 

Sub MainCall()
a = 10
b = 20
c = 30
Call Refval (a,b,c)
MsgBox(a)
MsgBox(b)
MsgBox(c)
Endsub

1. Пусть сначала запускается MainCall
Результат:
11
20
31

 

Область видимости переменных и процедур

 

Переменная имеет 3 уровня видимости:

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

2. Уровень модуля. Модульные переменные описываются в области Declaration

3. Уровни проекта. Глобальные переменные

Замечание:

· Глобальные переменные лучше описывать в отдельном модуле

· Глобальных переменных должно быть минимально количество, а лучше вообще скинуть их с обрыва, как это делают в СПАРТЕ!

· Все вышесказанное относится и к константам, и к массивам. Локальную переменную можно объявить статически, тогда при каждом новом обращении к процедуре данная переменная сохраняет предыдущее значение

 

 

Уровни видимости процедур

Тут существует только 2 уровня:

· Уровень модуля

· Уровень проекта (по умолчанию)

Описание некоторого модуля:

Public A1$


Private A2%
Dim A3 As single
Sub P~oel() // поел?
Dim A4%, static 5%
A1 = “Область видимости”
A2 = 2
A3 = 3,14
A4 = A4 + 4
A5 = A5 + 5
MsgBox(A4)
MsgBox(A5)

Endsub

Sub Proc2()

Call Proc1

MsgBox(A1)

MsgBox(A2)

MsgBox(A3)

MsgBox(A4)

MsgBox(A5)

Call Proc1

Endsub

 

Пусть сначала вызвается Proc2

1. Из proc1 будет напечатано 4 и 5

2. Из proc2 «Область видимости»
2
3,14
Пусто
Пусто

3. Из proc1 A4 = 4
A5 = 10 – т.к. статическая

 

Создание функции или подпрограммы общего назначения

1. Открываем Access. Кнопка «Модуль» -> Создать

2. Insert -> Procedure
Add -> Имя
Add -> public/private

3. ---------------------------
| Public Sub Proc3() |
| Call Proc2 |
| endSub |
Save as Модуль 1

4. Что бы ввести предыдущий пример нажимаем Модуль-> Создать
Declaration
Public
Private
….

Save As Модуль2

5. Откроем proc3 и запустим кнопкой «Run»

 

Пример: Доступ к существующей БД и её таблицам

Sub Doctup()



Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 532; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.165.246 (0.026 с.)