Помощь в учёбе, очень быстро...
Работаем вместе до победы

Символьные данные. 
Операции и функции для работы с символьными данными

РефератПомощь в написанииУзнать стоимостьмоей работы

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

Символьные данные. Операции и функции для работы с символьными данными (реферат, курсовая, диплом, контрольная)

Символьные данные

Напомним, что по умолчанию данные строкового типа имеют переменную длину и могут удлиняться (до длины в 231 символов) или укорачиваться. Однако такие строки занимают на 10 байт памяти больше, поэтому можно объявить строки фиксированной длины, явно указав количество символов.

Dim s as String*20.

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

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

Единственная операция, применяемая при работе со строками — конкатенация. Зато встроенных функций для работы достаточно много:

Действие.

Ключевые слова.

Сравнение двух строк.

StrComp.

Преобразование строк.

StrConv.

Изменение регистра.

Lcase, UCase.

Создание строк, содержащих повторяющиеся символы.

Space, String.

Определение длины строки.

Len.

Форматирование строки.

Format.

Выравнивание строки.

Lset, RSet.

Обработка строк.

InStr, Left, LTrim, Mid, Right, RTrim, Trim.

Выбор типа сравнения строк.

Option Compare.

Работа с кодами ASCII и ANSI.

Asc, Chr.

Сравнение двух строк. Функция StrComp возвращает значение типа Variant (Integer), представляющее результат сравнения строк.

StrComp (string1, string2[, compare]).

Синтаксис функции StrComp содержит следующие аргументы:

string1 — Обязательный. Любое допустимое строковое выражение.

string2 — Обязательный. Любое допустимое строковое выражение.

compare — Необязательный. Указывает способ сравнения строк. Аргумент compare может быть опущен или иметь значение 0, 1 или 2. Чтобы выполнить двоичное сравнение, следует указать 0 (это значение используется по умолчанию). Чтобы выполнить посимвольное сравнение без учета регистра, следует указать 1. Если аргумент compare опущен, способ сравнения строк определяется значением параметра инструкции Option Compare.

Возвращаемые значения.

string1 меньше чем string2 -1.

string1 равняется string2 0.

string1 больше чем string2 1.

Пример:

Dim MyStr1, MyStr2, MyComp.

MyStr1 = «ABCD»: MyStr2 = «abcd» ' Определяет переменные.

MyComp = StrComp (MyStr1, MyStr2, 1) ' Возвращает 0.

MyComp = StrComp (MyStr1, MyStr2, 0) ' Возвращает -1.

MyComp = StrComp (MyStr2, MyStr1) ' Возвращает 1.

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

Option Compare {Binary | Text}.

Инструкция Option Compare при ее использовании должна находиться в модуле перед любой процедурой и указывает способ сравнения строк (Binary или Text) для модуля. Если модуль не содержит инструкцию Option Compare, по умолчанию используется способ сравнения Binary.

Инструкция Option Compare Binary задает сравнение строк на основе порядка сортировки, определяемого внутренним двоичным представлением символов. В Microsoft Windows порядок сортировки определяется кодовой страницей символов. В следующем примере представлен типичный результат двоичного порядка сортировки:

A < B < E < Z < a < b < e < z < Б < Л < Ш < б < л < ш Инструкция Option Compare Text задает сравнение строк без учета регистра символов на основе системной национальной настройки. Тем же символам, что и выше, при сортировке с инструкцией Option Compare Text соответствует следующий порядок:

(A=a) < (B=b) < (E=e) < (Z=z) < (Б=б) < (Л=л) < (Ш=ш) Преобразование строк. Функция StrConv имеет следующи синтаксис:

StrConv (string, conversion).

Здесь string — строковое выражение, которое следует преобразовать, conversion — значение типа Integer, Сумма значений, указывающих тип преобразования, которое следует выполнить.

vbUpperCase 1 Преобразование строки к верхнему регистру.

vbLowerCase 2 Преобразование строки к нижнему регистру.

vbProperCase 3 Преобразование первой буквы каждого слова в строке в прописную.

Вместо одной этой функции можно применять функции Lcase, Ucase.

Lcase — возвращает значение типа String, представляющее строку, преобразованную к нижнему регистру.

LCase (строка) Обязательный аргумент строка представляет любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null.

К нижнему регистру преобразуются только прописные буквы; строчные буквы и прочие символы остаются неизмененными.

Ucase — возвращает значение типа Variant (String), содержащее строку, преобразованную к верхнему регистру.

UCase (строка) Обязательный аргумент строка представляет любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null.

К верхнему регистру преобразуются только строчные буквы; прописные буквы и прочие символы остаются неизменными.

Создание строк, содержащих повторяющиеся символы. Для создания таких строк применяют функции Space и String. Функция Space (число) формирует строку, а обязательный аргумент число указывает нужное число пробелов в строке. Ее удобно использовать для форматирования и очистки данных в строках фиксированной длины.

Функция String (number, character) содержит следующие аргументы:

number — Значение типа Long. Длина возвращаемой строки.

character — Значение типа Variant. Код символа или строковое выражение, первый символ которого используется при создании возвращаемой строки.

Определение длины строки. При работе со строками переменной длины удобно использовать функцию Len (строка), возвращую значение типа Long, содержащее число символов в строке.

Выравнивание строки. Оператор Lset — выравнивает строку по левому краю строковой переменной или копирует переменную одного определяемого пользователем тип в переменную другого типа, также определенного пользователем.

LSet переменная = строка.

LSet имяПеременной1 = имяПеременной2.

Здесь строка — строковое выражение, которое следует выровнять по левому краю строки переменная. Все оставшиеся символы в строке переменная LSet заменяет на пробелы. Если строка длиннее, чем переменная, LSet копирует в переменную столько начальных символов строки, сколько в ней поместится.

Rset — то же самое, но выравнивает строку по правому краю строковой переменной. Если длина строки переменная больше, чем строка, инструкция RSet заменяет все оставшиеся символы вплоть до начала строки переменная пробелами.

Обработка строк. Для разнообразной обработки строк применяются функции InStr, Left, LTrim, Mid, Right, RTrim, Trim.

InStr — Возвращает значение типа Long, указывающее позицию первого вхождения одной строки внутри другой строки.

InStr ([start, ]string1, string2[, compare]).

Синтаксис функции InStr содержит следующие аргументы:

start — числовое выражение, задающее позицию, с которой начинается каждый поиск. Если этот аргумент опущен, поиск начинается с первого символа строки. Указание аргумента start является обязательным, если указан аргумент compare.

string1 — Строковое выражение, в котором выполняется поиск.

string2 — Искомое строковое выражение.

compare — Указывает способ сравнения строк. Аргумент compare может быть опущен или иметь значение 0 или 1. Чтобы выполнить двоичное сравнение, следует указать 0 (это значение используется по умолчанию). Чтобы выполнить посимвольное сравнение без учета регистра, следует указать 1. Если аргумент compare опущен, способ сравнения строк определяется значением параметра инструкции Option Compare.

Возвращаемые значения.

string1 является пустой строкой 0.

string2 является пустой строкой start.

string2 не найдена 0.

string2 найдена в string1 Позиция обнаруженной подстроки.

start > string2 0.

Left — возвращает значение типа String, содержащее указанное число первых символов строки.

Left (string, length).

Здесь string — строковое выражение, из которого извлекаются символы. length — значение типа Variant (Long), числовое выражение, указывающее число возвращаемых символов. Если 0, возвращается пустая строка (««). Если значение length больше либо равняется числу символов в строке string, возвращается вся строка.

Для определения числа символов в строке string следует использовать функцию Len.

Ltrim, Rtrim, Trim — возвращают значение типа String, содержащее копию строки, из которой удалены пробелы, находившиеся в начале строки (LTrim), в конце строки (RTrim) или в начале и конце строки (Trim).

LTrim (строка), RTrim (строка), Trim (строка) Обязательный аргумент строка представляет любое допустимое строковое выражение.

Mid — Возвращает значение типа Variant (String), содержащее указанное число символов строки.

Mid (string, start[, length]).

Здесь string — строковое выражение, из которого извлекаются символы, start — значение типа Long. Позиция символа в строке string, с которого начинается нужная подстрока. Если start больше числа символов в строке string, функция Mid возвращает пустую строку (««).

length — значение типа Variant (Long). Число возвращаемых символов. Если этот аргумент опущен или превышает число символов, расположенных справа от позиции start, то возвращаются все символы от позиции start до конца строки.

Right — Возвращает значение типа String, содержащее указанное число последних символов строки.

Right (string, length).

Здесь string — строковое выражение, из которого извлекаются символы. length — значение типа Variant (Long). Числовое выражение, указывающее число возвращаемых символов. Если 0, возвращается пустая строка (««). Если превышает число символов в строке string, возвращается вся строка.

Работа с кодами ASCII.

Asc — Возвращает значение типа Integer, представляющее код символа для первого символа строки.

Asc (строка) Аргумент строка является любым допустимым строковым выражением. Если строка не содержит символов, возникает ошибка выполнения. Возвращаемые значения лежат в диапазоне 0 — 255.

Chr — возвращает значение типа String, содержащее символ, соответствующий указанному коду символа.

Chr (кодСимвола) Обязательный аргумент кодСимвола является значением типа Long, определяющим символ.

Коды 0−31 соответствуют стандартным управляющим символам ASCII. Например, Chr (10) возвращает символ перевода строки. Обычным диапазоном значений аргумента кодСимвола является интервал 0−255.

Пример: Заменить в строке буквы А, Б, В на 1, 2, 3 соответственно.

Sub пример6().

Dim s As String, sn As String, t As String.

Dim l As Integer, i As Integer.

Call read («g1», s).

l = Len (s).

For i = 1 To l.

t = Mid (s, i, 1).

Select Case t.

Case «А»: sn = sn + «1» .

Case «Б»: sn = sn + «2» .

Case «В»: sn = sn + «3» .

Case Else: sn = sn + t.

End Select.

Next i.

Call out («h1», sn).

End Sub.

Пример: Из набора слов вывести только те, у которых одинаковые первые буквы.

Sub пример7().

Dim first () As String, s As String, n As Integer, i As Integer, k As Integer.

i = 0: k = 0.

Do While Лист1. Range («g» & i+1).Text «» .

i = i + 1.

s = Лист1. Range («g» & i).Text.

ReDim Preserve first (1 To i).

first (i) = Left (s, 1).

Loop.

Лист1.Range («h1», «h» & i).Clear.

For n = 1 To i.

If n i Then.

For k = n + 1 To i.

If first (k) = first (n) Then.

Лист1.Range («h» & n).Value = Лист1. Range («g» & n).Text.

Лист1.Range («h» & k).Value = Лист1. Range («g» & k).Text.

End If.

Next.

End If.

Next.

End Sub.

БУЛЕВСКИЕ ВЕКТОРА И ОПЕРАЦИИ ДЛЯ РАБОТЫ С НИМИ Напомним, что в VBA имеется тип Boolean — для хранения логических (булевых) значений, которые сохраняются как 16-разрядные (двухбайтовые) числа, но могут иметь только значения True или False. Переменные типа Boolean отображаются как строковые значения True или False при использовании метода Print. Для присваивания переменным логических значений ИСТИНА или ЛОЖЬ следует использовать ключевые слова True или False.

При преобразовании других числовых типов данных к типу Boolean значение 0 преобразуется в False, а все остальные значения преобразуются в True. Если значения типа Boolean преобразуются к другим типам данных, то False превращается в 0, а True в -1.По умолчанию значением булевской переменной является Falseложь.

Любое число можно представить в двоичном виде, а полученный набор нулей и единиц рассматривать как булевский вектор. Для получения представления числа в двоичном виде можно использовать следующий код:

Sub пример8().

Dim b As String.

Dim s As Single.

Dim a As Integer.

b = «» .

s = CSng (InputBox («Введи десятичное», «Ввод данных», 255)).

Do While s > 0.

a = s Mod 2#.

b = CStr (a) + b.

s = (s) 2#.

Loop.

MsgBox b, vbOKOnly, «Результат» .

End Sub.

Для преобразования двоичного представления числа в его десятичное значение можно использовать следующий код:

Sub пример9().

Dim b As String.

Dim i As Integer, l As Integer, k As Integer, j As Integer.

b = InputBox («Введи двоичное», «Ввод данных», 11 111 111).

l = Len (b).

i = 0.

For k = l To 1 Step -1.

j = CInt (Mid (b, k, 1)).

i = i + j * 2 ^ (l — k).

Next.

MsgBox i, vbOKOnly, «Результат» .

End Sub.

При работе с булевскими векторами часто приходится выделять из них конкретные разряды, тетрады (4 разряда), байты (2 тетрады) и слова (2 байта, 4 тетрады). Для этого применяются операции маскирования и/или сдвига. Маскирование представляет собой наложение на число (с помощью операции И) некоторой маски — числа, содержащего единицы в нужных разрядах и нули — в ненужных:

0001 0111 AND 0000 1111 = 0000 0111.

Сдвиг представляет собой операцию добавления к числу слева или справа без изменения его разрядности указанного количества нулей. Вытолкнутые разряды при этом теряются:

0001 0111 SHL 4 = 0111 0000, 0001 0111 SHR 4 = 0000 0001.

Для сдвига вправо двоичного представления числа b на i разрядов можно использовать код:

shr = Left (b, Len (b) — i).

Для сдвига влево двоичного представления числа b на i разрядов можно использовать код:

shl = Right (b, Len (b) — i).

shl=shl+String (i," 0″).

Для работы с булевскими векторами применяются логические операции:

логические операции, используемые для выполнения логических операций Рассмотрим пример: Выделить в двухбайтовом слове 1ю и 3ю тетрады и объединить их по исключающему ИЛИ.

Для решения этой задачи необходимо сохранить заданное число (больше 255) во вспомогательной переменной, ввести маску 0000 0000 0000 1111 для выделения 1 тетрады, перевести ее в десятичный вид и объединить ее по И с заданным числом, ввести маску 0000 1111 0000 0000 для выделения 3 тетрады, перевести ее в десятичный вид и объединить ее по И с копией заданного числа и сдвинуть вправо на 8 разрядов, после чего объединить полученные значения с помощью операции XOR. Представленная ниже программа использует процедуру tobin для получения двоичного представления числа и функции toint для перевода двоичного представления к десятичному значению и shr для сдвига вправо.

Sub пример10().

Dim a As Integer, b As Integer, m1 As Integer, m2 As Integer, rez As Integer.

a = CInt (InputBox («Введи число», «Ввод данных», 256)).

Call tobin (a): b = a.

m1 = toint («111 100 000 000»).

m2 = toint («1111»).

a = a And m1.

Call tobin (a).

a = toint (shr (a, 8)).

b = b And m2.

Call tobin (b).

rez = a Xor b.

Call tobin (rez).

End Sub.

ПОДПРОГРАММА-ПРОЦЕДУРА Можно упростить программирование, разбивая задачу на небольшие логические компоненты. Эти компоненты, называемые процедурами, могут впоследствии стать строительными блоками, которые позволят усилить и расширить VBA.

При программировании с использованием процедур можно выделить два основных преимущества:

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

В VBA используется несколько видов процедур:

  • — Процедуры Sub (не возвращают значения)
  • — Процедуры Function (возвращают значения)
  • — Процедуры Property (могут возвращать и присваивать значения), а также устанавливать ссылки на объекты.

Процедуры Sub.

Процедура Sub (или подпрограмма) — это блок кода, который выполняется в ответ на событие. Разбивая код модуля на процедуры Sub, намного легче читать или модифицировать код приложения.

Синтаксис процедуры Sub таков:

[Private | Public][Static]Sub ().

End Sub.

При вызове процедуры выполняются операторы между ключевыми словами Sub и End Sub. Процедуры Sub можно помещать в стандартные модули, модули классов и форм. По умолчанию процедуры Sub во всех модулях имеют атрибут public, который означает, что их можно вызывать из любого места приложения.

Задание параметров процедуры подобно объявлению переменных. Пример:

Sub tobin (i As Integer).

Dim b As String, a As Integer, s As Single.

b = «»: s = CSng (i).

Do While s > 0.

a = s Mod 2#.

b = CStr (a) + b.

s = (s) 2#.

Loop.

MsgBox b, vbOKOnly, «Результат» .

End Sub.

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

Зачем надо создавать общие процедуры? Одна причина заключается в том, что нескольким разным процедурам обработки событий может потребоваться выполнить одни и те же действия. Общие операторы помещают в отдельную процедуру (общую процедуру), а в процедуры обработки событий помещают вызовы этой процедуры. Это исключает дублирование кода и облегчает поддержку приложения.

Создание новых процедур Для создания новой общей процедуры следует в окне кода набрать на клавиатуре заголовок процедуры и нажать клавишу Enter. Заголовок процедуры состоит из слова Sub или Function, за которым следует имя процедуры. Например:

Sub UpdateForm ().

Function GetCoord ().

В результате VBA заполняет шаблон для новой процедуры, т. е. дописывает строку End Sub или End Function, например:

Sub UpdateForm ().

.. .

End Sub.

Просмотр существующих процедур Чтобы просмотреть процедуру в текущем модуле:

" Существующую общую процедуру можно увидеть, выбрав элемент (General) в списке Object в окне кода и затем процедуру в списке Procedure.

" Существующую процедуру обработки события можно увидеть, выбрав соответствующий объект в списке Object в окне кода и затем процедуру в списке Procedure.

Чтобы просмотреть процедуру в другом модуле, следует:

  • 1. Выбрать команду Object Browser (Просмотр объектов) меню View (Вид).
  • 2. Выбрать проект в списке Project/Library (Проект/Библиотека).
  • 3. Выбрать модуль в списке Classes (Классы) и процедуру в списке Members of (Члены).
  • 4. Выбрать опцию View Definition (Посмотреть определение).

Вызов процедур Sub.

Процедура Sub отличается от процедуры Function тем, что ее нельзя вызвать по имени в выражении. Ее вызов осуществляется в отдельном операторе. Также процедура sub, в отличие от функции, не возвращает значения. Однако, как и функция, она может изменять значения любых переменных, переданных ей в качестве параметров.

Существуют два способа вызова процедуры sub — при помощи ключевого слова Call и без него:

' Оба эти оператора вызывают процедуру Sub с именем МуРгос.

Call МуРгос (FirstArgument, SecondArgument).

МуРгос FirstArgument, SecondArgument.

Заметим, что при наличии ключевого слова Call, параметры заключены в круглые скобки. Если ключевое слово Call опускается, следует опустить и скобки вокруг списка параметров.

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

Процедуры в формах Для вызова процедуры, находящейся во внешнем модуле, т. е. в не в том модуле, в котором находится код, из которого производится вызов процедуры, перед именем процедуры должно быть указано имя модуля, в котором находится код процедуры. К примеру, если код процедуры с именем SomeSub находится в модуле формы, названном Form1, то вызвать процедуру можно следующим оператором:

Call Form1. SomeSub ().

Процедуры в стандартных модулях Процедура является уникальной, если она определена только в одном месте.

Если имя процедуры уникально, то включать имя модуля в вызов процедуры не обязательно. Внешние или внутренние вызовы процедуры будут ссылаться на это уникальное имя.

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

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

Module2.CommonName ().

ПОДПРОГРАММА-ФУНКЦИЯ.

VBA содержит встроенные или стандартные функции, например, sqr, cos или chr. Кроме того, с помощью оператора Function можно писать собственные процедуры Function. Эти функции называют нестандартные или пользовательскими.

Синтаксис процедуры Function таков:

[Private|Public][Static]Function () [As type ].

End Function.

Приведем конкретный пример:

Funcstion toint (b As String) As Integer.

Dim i As Integer, l As Integer, k As Integer, j As Integer.

l = Len (b): i = 0.

For k = l To 1 Step -1.

j = CInt (Mid (b, k, 1)).

i = i + j * 2 ^ (l — k).

Next.

toint = i.

End Function.

Как и процедура Sub, процедура Function является самостоятельной и может принимать параметры, выполнять ряд операторов и изменять значения своих параметров. В отличие от процедуры Sub, имя процедуры Function может возвращать значение в вызывающую процедуру. Существуют три различия между процедурами Sub и Function:

  • — Возвращаемое процедурой Function значение присваивается самому имени процедуры. Возвращаемое процедурой Function значение можно использовать в выражениях в программе.
  • — Как и переменные процедуры Function имеют тип, который определяет тип возвращаемого значения. (В отсутствие ключевого слова As в операторе определения процедуры ей назначается по умолчанию тип variant.)
  • — Вызов процедуры Function, или просто функции, в основном осуществляется заданием ее имени и параметров в правой части большого оператора или в составе выражения.

Вот, например, функция, вычисляющая гипотенузу прямоугольного треугольника при заданных катетах:

Function Hypotenuse (A As Integer, В As Integer) As String.

Hypotenuse = Sqr (A2 + В2).

End Function.

В VBA процедура Function вызывается точно так же, как и любая встроенная функция:

strX = Hypotenuse (Width, Height).

Вызов процедур Function.

Если функция не имеет аргументов, скобки после имени функции можно не ставить:

'Все эти операторы вызывают не имеющую аргументов процедуру Function ToDec.

Debug.Print 10 * ToDec.

X = ToDec.

If ToDec =10 Then Debug. Print «Out of Range» .

X = AnotherFunction (10 * ToDec).

Обычно вызов пользовательской функции (нестандартной функции, написанной программистом) аналогичен вызову встроенной (стандартной) функции VBA, например Abs.

Функцию можно вызывать так же, как и процедуру sub.

Следующие операторы вызывают одну и ту же функцию:

Call Year (Now).

Year Now.

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

Механизмы передачи параметров.

Обычно процедуре для выполнения требуются некоторые исходные данные. Эти данные могут передаваться процедуре при помощи параметров процедуры. При этом различают формальные параметры, то есть описанные в заголовке процедуры и используемые в ее теле, и фактические — те, что были указаны при ее вызове. Заметим, что имена формальных и фактических параметров не обязаны совпадать.

Типы данных параметров По умолчанию параметры процедур имеют тип variant. Можно объявлять для параметров и другие типы данных. Заметим, что если типы фактически передаваемых в функцию значений отличаются от типа формальных параметров, то происходит неявное преобразование типов, Поэтому рекомендуется описывать в заголовке функции типы ее формальных параметров, а при вызове функции проверять соответствие типов фактических и формальных параметров.

Передача параметров по значению При передаче параметра по значению (by value) процедуре передается копия переменной, выступающей в качестве параметра процедуры. Если процедура изменяет значение параметра, это затрагивает только копию переменной, а не саму переменную. Значение переменнойоригинала в вызывающей процедуру программе сохраняется прежним.

Для передачи параметров по значению используется ключевое слово ByVal,. например:

Sub PostAccounts (ByVal intAcctNum as Integer).

End Sub.

Фактические параметры, заданные константами, всегда передаются по значению.

Передача параметров по ссылке Передача процедуре параметров по ссылке (by reference) открывает ей доступ к области памяти, где хранится содержимое переменной. В результате процедура может изменять значение переменной, являющейся ее параметром. По умолчанию в VBA все параметры передаются по ссылке.

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

Проще всего представить переменную как выражение, заключив ее в круглые скобки. Например, чтобы передать процедуре целое число через строковый параметр, можно использовать следующий код:

Private Sub Form_Load ().

Dim intX As Integer.

intX = 12 * 3.

ВызываемаяПроцедура (intX).

End Sub.

Sub ВызываемаяПроцедура (Bar As String).

MsgBox Bar 'Значение переменной Bar — строка «36» .

End Sub.

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

(optional arguments) процедуры. Если какой-то аргумент задан как необязательный,.

то и все последующие аргументы в списке аргументов должны быть необязательными и объявляются с ключевым словом optional.

В этом коде все аргументы не являются обязательными:

Dim strИмя As String.

Dim strАдрес As String.

Sub Text (Optional x As String, Optional y As String).

MsgBox x.

MsgBox y.

End Sub.

Private Sub Exec ().

strИмя = «ВашеИмя» .

strАдрес = 12 345 ' Передаются два параметра.

Call Text (strИмя, strАдрес).

End Sub.

В этом коде некоторые аргументы обязательны:

Dim strИмя As String.

Dim varАдрес As Variant.

Sub Text (x As String, Optional у As Variant).

MsgBox x.

If Not IsMissing (y) Then.

MsgBox y.

End If.

End Sub.

Private Sub Exec ().

strИмя = «ВашеИмя» ' Второй параметр не передается.

Call Text (strИмя).

End Sub.

Если необязательный параметр отсутствует, то он рассматривается как параметр с типом variant, имеющий значение Empty. В предыдущем при мере показано, как с помощью функции IsMissing проверять необязательные параметры.

Значения по умолчанию для необязательных параметров В следующем примере процедура возвращает значение по умолчанию необязательного параметра, если при ее вызове он опущен:

Sub ListText (x As String, Optional у As Integer = 12 345).

MsgBox x.

MsgBox y.

End Sub.

Private Sub Exec ().

strName = «yourname» ' Второй параметр не передается.

Call Text (strName) ' Добавляет «yourname» and «12 345» .

End Sub.

Неизвестное число параметров Обычно при вызове процедуры число ее параметров должно быть точно таким же, как и при ее объявлении. Ключевое слово РaramArray «разрешает» процедуре принимать произвольное число параметров. Приведем пример:

Dim x As Integer Dim у As Integer Dim intSum As Integer.

Sub Sum (ParamArray intNums ()).

For Each x In intNums.

у = у + x.

Next x.

intSum = у.

End Sub.

Private Sub Exec ().

Sum 1, 3, 5, 7, 8.

MsgBox intSum.

End Sub.

Рекурсия. Под рекурсией понимают способность программы вызывать саму себя. Процедуры выделяют для хранения переменных ограниченный объем памяти в стеке. Стек — это рабочая область памяти, которая заполняется и освобождается динамически в соответствии с потребностями выполняемой программы. При каждом вызове процедурой самой себя выделяется дополнительный объем этой памяти. Процедура, вызывающая сама себя, называется рекурсивной. Рекурсивная процедура, которая бесконечно вызывает саму себя, приводит к ошибке. Например:

Function RunOut (Maximum).

RunOut = RunOut (Maximum).

End Function.

Эта ошибка менее очевидна, если две процедуры бесконечное число раз вызывают друг друга, или некоторое условие, ограничивающее рекурсию, никогда не выполняется. Рекурсия имеет свои области применения. Например, следующая процедура использует рекурсию для вычисления факториалов:

Function Factorial (N).

If N <= 1 Then ' Достигнут конец рекурсивных вызовов.

Factorial = 1 ' (N = 0) завершение вызовов.

Else ' Повторный вызов функции, если N > 0.

Factorial = Factorial (N — 1) * N.

End If.

End Function.

Необходимо проверить, что рекурсивная функция не вызывает себя столько раз, что начинает сказываться нехватка памяти. При возникновении ошибки, убедитесь, что процедура не вызывает себя бесконечное число раз. После этого попробуйте сэкономить память с помощью:

странения ненужных переменных;

вместо рекурсии можно воспользоваться вложенными циклами.

Создание пользовательской функции на VBA в среде EXCEL. Любая процедура и функция, содержащиеся в общем модуле (но не в модуле формы и не в модуле класса), могут быть использована на рабочем листе Excel. Для выполнения процедур используется команда меню Сервис/Макрос/Макросы, а для вставки функций применяется команда меню Вставка/Функция или кнопка стандартной панели инструментов Вставка функции. При вставке функции запускается мастер функций, и если в проекте VBA имеется хотя бы одна функция, то в правом окне мастера функций появляется категория Определенные пользователем. При выборе этой категории в левом окне мастера функций отображается перечень функций проекта VBA. После выбора необходимой функции из списка, мастер функций предлагает ввести ее параметры, количество которых определено в ее заголовке. Если функция имеет необязательные параметры, или их число не определено, то мастер функций будет открывать окна для их ввода последовательно, по мере заполнения ранее открытых, как это происходит, например, при вставке функции рабочего листа СУММ. Значения параметров можно ввести с клавиатуры, либо можно ввести адрес ячейки, содержащей значение, либо можно указать ячейку с параметром, щелкнув по ней правой кнопкой мыши. Заметим, что ввод в качестве параметра диапазона ячеек допустим лишь в том случае, когда функция имеет неопределенное количество параметров, либо вводимый параметр представляет собой массив, либо он имеет объектовый тип данных Range.

В качестве примера перепишем в виде функции процедуру замены букв «А», «Б», «В» на цифры 1, 2, 3 соответственно (пример 6):

Function пример11(s As String).

Dim sn As String, t As String.

Dim l As Integer, i As Integer.

l = Len (s).

For i = 1 To l.

t = Mid (s, i, 1).

Select Case t.

Case «А»: sn = sn + «1» .

Case «Б»: sn = sn + «2» .

Case «В»: sn = sn + «3» .

Case Else: sn = sn + t.

End Select.

Next i.

пример11 = sn.

End Function.

Отметим, что поскольку функция не может быть выполнена непосредственно, а должна быть вызвана, то для ее отладки (например, в пошаговом режиме) необходимо написать процедуру, обеспечивающую ввод параметров функции, ее вызов и вывод результата работы функции. Если функция возвращает более одного значения (используя список формальных параметров), то эти значения не могут быть выведены на рабочий лист с помощью мастера функций.

ИСПОЛЬЗОВАНИЕ ФАЙЛОВ В VBA.

Начиная с первых версий VBA, файлы обрабатывались с помощью оператора Open и других файловых операторов и функций. Эти механизмы со временем будут вытеснены объектной моделью FSO (File System Object), но они полностью поддерживаются в версии 5.0.

Типы доступа к файлам. Сам по себе файл не представляет ничего более, чем ряд связанных байтов, расположенных на диске. Когда приложение обращается к файлу, оно должно знать, что содержат эти байты (символы, целые числа, строки и т. д.) Тип данных, содержащихся в файле, определяет тип доступа к файлу. VBA три типа доступа к файлу:

Последовательный доступ, обычно используемый для записи текстовых файлов, например протоколов ошибок или отчетов.

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

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

Последовательный доступ предполагает, что каждый символ в файле либо является текстовым символом, либо входит в форматирующую последовательность текста, как, например, символ новой строки. Данные хранятся, как символы в коде ANSI. Предполагается, что файл, открытый для произвольного доступа, составлен из множества записей одинаковой длины. Можно применять определенные пользователем типы для создания записей, составленных из нескольких полей, каждое из которых может иметь разный тип данных. Данные хранятся как двоичная информация.

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

Функции и операторы доступа к файлам. Ряд функций и операторов может быть применен для файлов всех трех типов, а некоторые работают только с файлами одного или двух типов. Со всеми типами доступа к файлам используют следующие :

Для работы с папками и дисками:

Функция Dir возвращает значение типа String, представляющее имя файла, каталога или папки, которое удовлетворяет указанному шаблону имени файла, набору атрибутов файла или метке тома на диске.

Dir[(путь[, атрибуты])].

Здесь путь (Необязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска. Если путь не найден, возвращается пустая строка (««). Атрибуты (Необязательный) — константа или числовое выражение, описывающее атрибуты файла. Если этот аргумент опущен, возвращаются все файлы, имена которых удовлетворяют аргументу путь.

Функция Dir поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

При первом вызове функции Dir необходимо указать путь, в противном случае возникает ошибка. Если указаны атрибуты файла, наличие аргумента путь является обязательным.

Функция Dir возвращает первое имя файла, имя которого удовлетворяет аргументу путь. Для получения остальных файлов, имена которых удовлетворяют указанному пути, следует повторно вызвать функцию Dir без аргументов. Если файлов, имена которых удовлетворяют указанному пути, не осталось, возвращается пустая строка (««). При следующем после возврата пустой строки вызове функции необходимо указать аргумент путь; в противном случае возникает ошибка. Изменить значение аргумента путь можно в любой момент, не дожидаясь, пока закончатся файлы, имена которых удовлетворяют текущему пути. Рекурсивный вызов функции Dir запрещен. Вызов функции Dir с атрибутом vbDirectory не приводит к последовательному возврату подкаталогов.

Поскольку имена файлов возвращаются в произвольном порядке, их можно сохранить в массиве, а затем отсортировать этот массив.

Пример: ' Возвращает список каталогов на диске C:.

MyPath = «c:» ' Указывает путь.

MyName = Dir (MyPath, vbDirectory) ' Возвращает первый элемент.

Do While MyName «» ' Начинает цикл.

' Игнорирует текущий каталог и каталог предыдущего уровня.

If MyName «.» And MyName «.» Then.

' является ли MyName каталогом.

If (GetAttr (MyPath & MyName) And vbDirectory) = vbDirectory Then.

Debug.Print MyName ' Выводит элемент если это каталог.

End If .

End If.

MyName = Dir ' Возвращает следующий элемент.

Loop.

Инструкция ChDir — Изменяет текущий каталог или папку.

ChDir путь Обязательный аргумент путь является строковым выражением, определяющим какой каталог (или папка) станет текущим. Аргумент путь может содержать имя диска. Если диск не указан, инструкция ChDir изменяет текущий каталог или папку на текущем диске.

Инструкция ChDir изменяет текущий каталог, но не изменяет стандартный диск. Например, если стандартным является диск C, то после выполнения следующей инструкции стандартным каталогом станет каталог на диске D, но стандартным диском останется диск C:

ChDir «D:TMP» .

Функция CurDir — Возвращает значение типа Variant (String), представляющее текущий путь.

CurDir[(диск)].

Необязательный аргумент диск является строковым выражением, указывающим существующий диск. Если диск не указан или аргумент диск является пустой строкой (««), функция CurDir возвращает путь к текущему диску.

Инструкция MkDir — Создает новый каталог или папку.

MkDir путь Обязательный аргумент путь является строковым выражением, определяющим создаваемый каталог или папку. Аргумент путь может содержать имя диска. Если диск не указан, инструкция MkDir создает новый каталог или папку на текущем диске.

Инструкция RmDir — Удаляет существующий каталог или папку.

RmDir путь Обязательный аргумент путь является строковым выражением, определяющим каталог или папку, которую следует удалить. Аргумент путь может содержать имя диска. Если диск не указан, инструкция RmDir удаляет каталог или папку с текущего диска.

При попытке удалить с помощью инструкции RmDir каталог (или папку), который содержит файлы, возникает ошибка. Для предварительного удаления всех файлов из каталога или папки следует использовать инструкцию Kill.

Инструкция ChDrive — Изменяет текущий диск.

ChDrive диск Обязательный аргумент диск является строковым выражением, указывающим существующий диск. Если этот аргумент задается пустой строкой (««), текущий диск не изменится. Если диск является строкой, состоящей из нескольких символов, инструкция ChDrive использует только первый символ.

Для работы со свойствами файлов:

Функция FileDateTime — Возвращает значение типа Variant (Date), содержащее дату и время создания или последнего изменения файла.

FileDateTime (путь) Обязательный аргумент путь является строковым выражением, указывающим имя файла. Аргумент путь может содержать имя каталога или папки и диска.

Функция FileLen — Возвращает значение типа Long, содержащее размер файла в байтах.

FileLen (путь) Обязательный аргумент путь является строковым выражением, определяющим файл. Аргумент путь может содержать имя каталога или папки и диска.

Если в момент вызова функции FileLen указанный файл открыт, возвращается размер этого файла до его открытия. Для определения размера открытого файла следует использовать функцию LOF.

Функция GetAttr — возвращает значение типа Integer, содержащее атрибуты файла, каталога или папки.

GetAttr (путь) Обязательный аргумент путь является строковым выражением, указывающим имя файла. Аргумент путь может содержать имя каталога или папки и диска.

Значение, возвращаемое функцией GetAttr, являются суммой следующих значений:

vbNormal 0 Обычный.

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

vbSystem 4 Системный.

vbDirectory 16 Каталог или папка.

vbArchive 32 Файл был изменен после последнего резервирования.

Для определения установленных атрибутов следует с помощью оператора And выполнить поразрядное сравнение значения, возвращенного функцией GetAttr, и значения, соответствующего нужному атрибуту файла. Ненулевой результат означает, что данный атрибут установлен. Например, значение следующего выражения будет нулевым, если архивный атрибут не установлен:

Result = GetAttr (FName) And vbArchive.

Если архивный атрибут установлен, будет возвращено ненулевое значение.

Инструкция SetAttr — задает атрибуты файла.

SetAttr pathname, attributes.

Здесь pathname (Обязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска.

attributes (Обязательный) — константа или числовое выражение, задающее атрибуты файла.

Ниже приведены допустимые значения аргумента attributes:

vbNormal 0 Обычный (по умолчанию).

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

VbSystem 4 Системный.

vbArchive 32 Файл был изменен после последнего резервирования.

При попытке изменения атрибутов открытого файла возникает ошибка выполнения.

Для манипулирования файлами:

Инструкция FileCopy — Копирует файл.

FileCopy source, destination.

Здесь source (Обязательный) — строковое выражение, указывающее имя файла, подлежащего копированию. Аргумент source может содержать имя каталога или папки и диска.

destination (Обязательный) — строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

При попытке скопировать открытый файл с помощью инструкции FileCopy возникает ошибка.

Инструкция Name — Изменяет имя файла, каталога или папки.

Name староеИмя As новоеИмя Здесь староеИмя (Обязательный) — строковое выражение, указывающее имя и положение существующего файла; может содержать имя каталога или папки и диска.

новоеИмя (Обязательный) — строковое выражение, указывающее новое имя и положение файла; может содержать имя каталога или папки и диска. Файл с таким именем не должен существовать.

Оба аргумента, новоеИмя и староеИмя, должны указывать на один и тот же диск. Если путь, указанный с помощью аргумента новоеИмя существует и отличен от указанного с помощью аргумента староеИмя, инструкция Name переместит файл в новый каталог или папку и переименует его (если требуется). Если пути, указанные с помощью аргументов новоеИмя и староеИмя, разные, а имена файлов совпадают, инструкция Name переместит файл в новый каталог или папку без изменения его имени. С помощью инструкции Name, можно переместить файл из одного каталога (или папки) в другой, однако нельзя переместить каталог или папку.

При попытке переименовать открытый файл с помощью инструкции Name возникает ошибка. Прежде чем приступить к изменению имени файла, необходимо его закрыть. В аргументах инструкции Name не допускается использование подстановочных знаков для нескольких символов (*) и оного символа (?).

Инструкция Kill — удаляет файлы с диска.

Kill путь Обязательный аргумент путь является строковым выражением, указывающим имена одного или нескольких файлов, подлежащих удалению. Аргумент путь может содержать имя каталога или папки и диска.

Инструкция Kill поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

При попытке удалить открытый файл с помощью инструкции Kill возникает ошибка. Для удаления каталогов следует использовать инструкцию RmDir.

Для управления файлами:

Инструкция Open — разрешает выполнение с файлом операций ввода/вывода.

Open путь For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина].

Здесь путь (Обязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска.

режим (Обязательный) — ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается в режиме Random.

доступ (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом: Read, Write или Read Write.

блокировка (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write.

номерФайла (Обязательный) — допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile.

длина (Необязательный) — Число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

Чтобы получить возможность выполнить любую операцию ввода/вывода, файл необходимо открыть. Инструкция Open резервирует буфер ввода/вывода для файла и определяет режим использования этого буфера.

Если аргумент путь описывает несуществующий файл, такой файл будет создан при открытии в режиме Append, Binary, Output или Random.

Если файл уже открыт другим процессом и указанный режим доступа не разрешен, инструкция Open не будет выполнена и возникнет ошибка.

Если аргумент режим имеет значение Binary, предложение Len игнорируется.

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

Функция FreeFile — Возвращает значение типа Integer, представляющее следующий номер файла, доступный для использования с инструкцией Open.

FreeFile[(диапазонНомеров)].

Необязательный аргумент диапазонНомеров является выражением типа Variant, указывающим диапазон, из которого возвращается следующий свободный номер файла. Значение 0 (используется по умолчанию) задает возвращение номера файла из диапазона 1 — 255 включительно. Значение 1 задает возвращение номера файла из диапазона 256 — 511.

Функцию FreeFile используют для возвращения незанятого номера файла.

Инструкция Close — завершает операции ввода/вывода с файлом, открытым с помощью инструкции Open.

Close [списокНомеровФайлов].

Необязательный аргумент списокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где номерФайла представляет любой допустимый номер файла:

[[#]номерФайла] [, [#]номерФайла].. .

Если аргумент списокНомеровФайлов опущен, закрываются все активные файлы, открытые с помощью инструкции Open.

При закрытии файла, открытого в режиме Output или Append, в него добавляется содержимое последнего буфера вывода. Все буферы, связанные с закрытым файлом, освобождаются.

Инструкция Close разрывает связь между файлом и соответствовавшим ему номером файла.

Инструкция Reset — Закрывает все файлы, открытые с помощью инструкции Open.

Reset.

Инструкция Reset закрывает все активные файлы, открытые с помощью инструкции Open, и записывает содержимое всех буферов файлов на диск.

Для позиционирования в открытом файле:

Функция Seek — возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open.

Seek (номерФайла) Обязательный аргумент номерФайла является выражением типа Integer, содержащим допустимый номер файла.

Функция Seek возвращает значение в интервале от 1 до 2 147 483 647 (т.е. 231 — 1) включительно.

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

Random Номер записи, которая будет считана или записана следующей.

Binary, Output, Append, Input Номер байта, с которого начинается выполнение следующей операции ввода/вывода. Первому байту файла соответствует 1, второму 2 и т. п.

Функция EOF — Возвращает значение типа Integer содержащее логическое значение True при достижении конца файла.

EOF (номерФайла) Обязательный аргумент номерФайла является выражением типа Integer, содержащим любой допустимый номер файла.

С помощью функции EOF можно избежать ошибок, возникающих при попытках чтения или записи после достижения конца файла.

Функция EOF возвращает значение False до тех пор, пока не будет достигнут конец файла. При использовании с файлами, открытыми в режиме Random или Binary, функция EOF возвращает значение True, если последней выполненной инструкции Get не удалось считать целую запись; в противном случае возвращается значение False.

Для файлов, открытых для доступа в режиме Binary, попытка чтения файла с помощью функции Input до возвращения функцией EOF значения True приводит к ошибке. При чтении двоичных файлов с помощью функции Input следует вместо функции EOF использовать функции LOF и Loc или использовать с функцией EOF инструкцию Get.

Ввод/вывод в файлы различных типов доступа.

Последовательный доступ к файлам:

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

Файлы, открытые для последовательного доступа, допускают следующие операции:

ввод символов в файл (Input);

вывод символов из файла (Output);

добавление символов в файл (Append).

Чтобы открыть файл для последовательного доступа, следует использовать оператор Open:

Open pathname For [Input | Output | Append] As filenum [Len = Buffersize].

Когда последовательный файл открывается для ввода (Input), файл должен существовать, иначе возникнет ошибка. Однако при попытке открыть несуществующий файл для операций вывода (Output) или добавления (Append) оператор Open сначала создает файл, а затем открывает его. Номер файла filenum является обязательным и может быть получен с помощью функции FreeFile. Необязательный параметр Len задает число символов в буфере для операций копирования данных из файла в приложение. Чем больше буфер, тем реже производятся обращения к диску. После открытия файла для операций Input, Output или Append его надо закрыть с помощью оператора Close, прежде чем открывать для операции другого типа.

Для редактирования файла сначала надо прочитать его содержимое в программные переменные, затем изменить переменные и записать их содержимое обратно в файл. Чтобы получить содержимое текстового файла, следует открыть его для операции последовательного ввода (Input). Затем используют оператор Line Input #, Input () или Input #, чтобы скопировать файл в программные переменные. Существуют операторы и функции, которые для последовательных файлов читают и записывают один символ или одну строку за одну операцию. Следующий фрагмент читает файл строка за строкой:

Dim Lines As String, NextLine As String.

Do Until EOF (FileNum).

Line Input # FileNum, NextLine.

Lines = Lines + NextLine + Chr (13) + Chr (10).

Loop.

Оператор Line Input # распознает последовательность символов CR/LF, но не включает их в переменную. О сохранении этих символов должен позаботиться программист.

Можно также использовать оператор Input #, который читает числа и/или строковые выражения, записанные в файл. Например, для чтения строки адреса можно использовать следующий оператор:

Input # FileNum, name, street, city, zip, country.

Можно использовать функцию Input () для копирования любого числа символов из файла в переменную при условии, что они могут поместиться в этой переменной:

Lines = Input (n, FileNum).

Чтобы скопировать целый файл в переменную, следует использовать функцию InputB. Так как она возвращает строку в коде ANSI, для преобразования ее в строку UNICODE надо применять функцию StrConv:

Lines = StrConv (InputB (LOF (FileNum), FileNum), vbUnicode).

Для записи строк в файл следует открыть его для последовательного вывода (Output) или добавления (Append), а затем использовать оператор Print #, например:

Print #FileNum, Text.

Существует также оператор Write #, который записывает список чисел и/или строковых выражений в файл. Он автоматически отделяет каждое выражение запятой и заключает строковые выражения в кавычки:

AnyString = «AnyChars»: AnyNum = 12 345.

Write #FileNim, AnyString, AnyNum.

Результат будет выглядеть так:

" AnyChars", 12 345.

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

Sub пример12().

Dim first () As String, s () As String.

Dim n As Integer, i As Integer, k As Integer.

Dim fn As Integer, x As String.

i = 1: k = 0.

fn = FreeFile.

Open «D:input.txt» For Input As fn.

Do While Not EOF (fn).

ReDim Preserve s (1 To i).

ReDim Preserve first (1 To i).

Line Input #fn, s (i).

first (i) = Left (s (i), 1).

i = i + 1.

Loop.

Close #fn.

i = i — 1.

fn = FreeFile.

Open «D:output.txt» For Output As fn.

For n = 1 To i.

If n i Then.

For k = n + 1 To i.

If first (k) = first (n) Then.

Print #fn, s (n), s (k).

End If.

Next k.

End If.

Next n.

Close #fn.

End Sub.

Произвольный доступ к файлам:

Байты в файлах произвольного доступа формируют записи, каждая из которых содержит одно или более полей. Запись с одним полем соответствует любому стандартному типу. Запись с несколькими полями соответствует определяемому пользователем типу. Например, тип Worker, определяемый ниже, создает 19 байтные записи, которые состоят из трех полей:

Type Worker.

LastName As String * 10.

Title As String * 7.

Rank As String * 2.

End Type.

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

'Переменная записей.

Public Employee As Worker.

'Текущая запись.

Public Position As Long.

'Номер последней записи в файле.

Public LastRecord As Long.

Открыть файл для производного доступа можно с помощью следующего синтаксиса оператора Open:

Open pathname [ For Random] As filenumber Len = reclength.

Так как типом доступа по умолчанию является произвольный (random), ключевые слова For Random не обязательны.

Выражение Len = reclength задает размер каждой записи в байтах. Заметим, что каждая строковая переменная в VBA хранится в формате Unicode, и надо задать длину этой строки. Если reclength меньше, чем действительная длина записываемой в файл записи, генерируется ошибка. Если reclength больше действительной длины записи, то запись сохраняется, но дисковое пространство при этом будет расходоваться нерационально.

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

Dim FileNum As Integer, RecLength As Long, Employee As Person.

' Вычисляем длину каждой записи.

RecLength = LenB (Employee).

' Получаем следующий доступный номер файла.

FileNum = FreeFile.

' Открываем новый файл оператором Open.

Open «MYFILR.FIL» For Random As FileNum Len = RecLength.

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

Для копирования записей в переменные следует использовать оператор Get. Например, чтобы скопировать запись из файла Employee Records в переменную Employee, можно использовать следующий код:

Get FileNum, Position, Employee.

В этой строке Employee содержит номер, который оператор Open использовал для открытия файла; Position содержит номер записи, которая копируется; переменная Employee, объявленная с определенным пользователем типом Worker, получает содержимое записи.

Добавлять или изменять записи в файлах, открытых для произвольного доступа, можно с помощью оператора Put. Чтобы заменить запись, следует использовать оператор Put, задавая положение записи в файле, например:

Put # FileNum, Position, Employee.

Этот код заменит запись с номером, заданным переменной Position, данными из переменной Employee.

Чтобы добавить новые записи в конец файла, открытого для произвольного доступа, следует использовать оператор Put, показанный в предыдущем фрагменте кода. Для этого надо установить значение переменной, Position равным на единицу больше номера последней записи в файле. Например, чтобы добавить новую запись в файл, содержащий пять записей, следует установить переменную Position равной 6.

Следующий оператор добавляет запись в конец файла:

LastRecord = LastRecord + 1.

Put #FileNum, LastRecord, Employee.

Можно удалить запись, очистив ее поля, но тогда запись все еще останется в файле. Не стоит просто очищать записи в файле, так как, оставаясь в нем, они расходуют пространство и служат помехой при выполнении операций последовательного доступа. Лучше скопировать остающиеся в файле записи в новый файл, и затем удалить старый.

Чтобы удалить запись в файле произвольного доступа, следует:

  • 1. Создать новый файл.
  • 2. Скопировать все необходимые из исходного файла в этот новый файл.
  • 3. Закрыть исходный файл и с помощью оператора Kill удалить его.
  • 4. С помощью оператора Name переименовать новый файл, дав ему имя исходного файла.

Доступ к двоичным файлам:

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

Чтобы открыть файл для двоичного доступа, используют следующий синтаксис Open:

Open pathname For Binary As filename.

Отличие от оператора для произвольного доступа заключается в отсутствии указания длины записи с помощью предложения Len = RecLength. Будучи включено в оператор открытия двоичного файла, оно просто игнорируется, поскольку предполагается, что записи имеют произвольную длину. Отсюда следует, что невозможно организовать доступ к записям в произвольном порядке, а только последовательно, определяя длину каждой записи. В то же время можно непосредственно обращаться к каждому байту в файле.

ИСПОЛЬЗОВАНИЕ ОБЪЕКТОВ, ИХ СВОЙСТВА И МЕТОДЫ. ФОРМЫ. ОБЪЕКТНАЯ МОДЕЛЬ FSO.

Работа с объектами При создании приложения в VBA в основном происходит работа с объектами. Можно использовать объекты, предоставляемые VBA: элементы управления, формы и объекты доступа к данным. Можно также управлять объектами других приложений из приложения VBA. Можно даже создавать свои собственные объекты и определять для них дополнительные свойства и методы.

Что такое объект?

Объект — это комбинация кода и данных, которую можно рассматривать как одно целое. Объект может быть частью приложения, как элемент управления или форма. Целое приложение также может быть объектом. В таблице приведены примеры типов объектов, которые можно использовать в VBA:

Объект.

Описание.

Кнопка управления.

Элементы управления на форме, например кнопки управления и рамки, являются объектами.

Форма.

Каждая форма в проекте VBA является отдельным объектом.

База данных.

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

Диаграмма.

Диаграмма в Microsoft Excel является объектом.

Происхождение объектов Каждый объект в VBA определен классом (class). Класс используется для создания объектов и определяет их характеристики. Приведем два примера взаимоотношений между классами и объектами в VBA:

  • — Элементы управления Панели элементов управления в VBA представляют классы. Объект, известный как элемент управления, не существует, пока он не нарисован на форме. Когда создается элемент управления, создается копия, или экземпляр (instance) класса элемента управления
  • — Форма, используемая во время разработки, является классом. Во время выполнения VBA создает экземпляр класса формы

Окно Properties (Свойства) отображает класс и свойство Name (Имя) объектов в разработанном приложении VBA.

Все объекты создаются как идентичные копии своих классов. Свойства индивидуальных объектов можно изменять. Например, если на форме созданы три кнопки управления, каждый объект кнопка управления является экземпляром класса ConroandButton. Объекты одного класса используют общий набор характеристик и способностей (свойств, методов и событий). Каждому объекту дано свое имя, их можно по отдельности заблокировать и разблокировать, поместить в разные места на форме и т. д.

Понятие «класс объекта» не часто упоминается. Просто надо помнить, что, например, термин «элемент управления списком» означает «экземпляр класса ListBox» .

Что можно делать с объектами?

Объект предоставляет в распоряжение разработчика готовый исполняемый код. Например, вместо того чтобы программировать собственные диалоги File Open (Открыть файл) и File Save (Сохранить файл), можно использовать элемент управления общим диалогом (объект, предоставляемый VBA). Можно написать собственный код управления планированием и ресурсами, но вместо этого проще использовать объекты Calendar (Календарь), Resources (Ресурсы) и Task (Задача), предоставляемые Microsoft Project (Проект).

VBA может комбинировать объекты из других источников.

VBA предоставляет инструменты, которые позволяют комбинировать объекты из различных источников. Можно строить решения, комбинируя самые мощные возможности VBA и приложений, поддерживающих Automation (Автоматизация) (ранее известная как OLE Automation). Автоматизация (automation) — это свойство составной модели объекта (Component Object Model, СОМ), промышленного стандарта, используемого приложениями для раскрытия своих объектов инструментам разработки и другим приложениям.

Можно строить приложения, объединяя внутренние элементы управления VBA и объекты, предоставляемые другими приложениями. Предположим, что эти объекты помещены на форму VBA:

  • — Объект Microsoft Excel chart (Диаграмма Microsoft Excel)
  • — Объект Microsoft Excel Worksheet (Рабочий лист Microsoft Excel)
  • — Объект Microsoft Word Document (Документ Microsoft Word)

Эти объекты можно использовать для создания приложения. Это сохранит время разработчика, так как не надо писать код, воспроизводящий все функциональные возможности объектов Microsoft Excel и Microsoft Word.

Основы работы с объектами Объекты VBA поддерживают свойства, методы и события. В VBA данные объекта (установки или атрибуты) называются свойствами, тогда как процедуры, которые оперируют с объектом, называются его методами. Событие — это действие, распознаваемое объектом, например, щелчок кнопкой мыши или нажатие клавиши клавиатуры, и программист может написать код, реагирующий на это событие.

Можно изменять характеристики объекта, меняя его свойства. Рассмотрим радио: одно из свойств радио — громкость (volume). В терминах обсуждаемой темы можно сказать, что радио обладает свойством «Volume», которое регулируется изменением его значения. Предположим, что можно установить регулятор громкости радио в положения от 0 до 10. Если бы радио управлялось с помощью VBA, можно было бы написать код процедуры, которая изменяла бы значение свойства «Volume» от 3 до 5, чтобы радио работало громче:

Radio.Volume = 5.

Кроме свойств объекты обладают методами. Методы — это такая же часть объектов, как и свойства. В целом, методы — это действия, которые можно выполнить, тогда как свойства — это атрибуты, которые устанавливаются или восстанавливаются. Например, чтобы позвонить по телефону, надо набрать номер (dial). Можно было бы сказать, что телефоны обладают методом «Dial», и использовать этот синтаксис для набора номера 555 111:

Phone.Dial 5 551 111.

Объекты также обладают событиями. События инициируются, когда изменяются некоторые свойства объекта. Например, радио может иметь событие «VolumeChange» (Изменение громкости). Телефон может иметь событие «Ring» (Звонок).

Управление объектами с помощью свойств Индивидуальные свойства меняются. Некоторые можно установить во время разработки. Для этого лучше использовать окно Properties (Свойств), что позволяет вообще не писать никакого кода. Другие свойства не доступны во время разработки, следовательно, необходимо программировать установку таких свойств во время выполнения.

Свойства, которые можно установить или значения которых можно получить только во время выполнения, называются изменяемыми (read-write properties). Свойства, значения которых можно только прочитать во время выполнения, называются неизменяемыми (read-only properties).

Установка значений свойств Значение свойства устанавливается, только если необходимо изменить внешний вид или поведение объекта. Например, свойство Text элемента управления TextBox изменяют, если необходимо изменить содержимое поля.

Для установки значения свойства применяется следующий синтаксис:

object.property = expression.

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

Textl.Top = 200 ' Значение свойства Тор равно 200 твипам.

Textl.Visible = True ' Отображает текстовое поле.

Textl.Text = «hello» ' Отображает 'hello' в текстовом поле.

Получение значений свойств Получают значение свойства тогда, когда хотят определить состояние объекта до выполнения каких-либо действий из кода, например, присвоить значение свойству другого объекта. Можно проанализировать содержимое текстового поля (значение свойства Text этого элемента управления) перед выполнением кода, который может изменить это значение.

В большинстве случаев, чтобы получить значение свойства, применяется следующий синтаксис:

variable = object.property.

Можно также использовать значение свойства, как часть более сложных выражений, без присваивания этого значения переменной. В следующем примере значение свойства Top (Верх) нового члена массива элементов управления вычисляется как значение свойства Top предыдущего члена плюс 400:

Private Sub cmdAdd_Click ().

' [операторы].

optButton (n).Top = optButton (n-l).Top + 400.

' [операторы] End Sub.

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

Использование методов в коде Методы могут воздействовать на значения свойств. Например, в аналоге радио метод SetVolume (Установить громкость) изменяет свойство volume (громкость). Списки VBA имеют свойство List (Список), которое можно изменить методами clear (Очистить) и Additem (Добавить элемент).

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

object.теthod.

В следующем примере метод Refresh (Освежить) перерисовывает картинку:

Picturel.Refresh ' Перерисовка элемента управления.

Некоторые методы, как метод Refresh, не имеют параметров и не возвращают значения.

Если методу требуется более одного параметра, они отделяются друг от друга запятыми. Например, метод circle (Круг) требует задать положение, радиус и цвет круга на форме:

' Нарисовать голубой круг радиусом 1200 твипов.

Forml.Circle (1600, 1800), 1200, vbBlue.

Если необходимо сохранить возвращаемое методом значение, следует заключить в круглые скобки его параметры. Например, метод GetData (Получить данные) возвращает картинку из буфера обмена (clipboard):

Picture = Clipboard. GetData (vbCFBitmap).

Если метод не возвращает никакого значения, параметры задаются без круглых скобок. Например, метод Additem (Добавить элемент) не возвращает значения:

Listi.Additem «yourname» ' Добавить текст 'yourname' в список.

Взаимосвязь объектов Если на форму помещаются две кнопки управления, они являются отдельными объектами с различными значениями свойства Name (Имя) (command1 и Command2), НО ОНИ СОВМССТНО ИСПОЛЬЗУЮТ ОДИН И ТОТ ЖЕ КЛАСС: CommandButton.

Кроме того, они расположены на одной форме. Но рассмотренный выше в этой главе элемент управления также принадлежит этой форме. Это выстраивает элементы управления в некоторую иерархию. Чтобы сослаться на элемент управления, сначала нужно сослаться на форму, точно так же необходимо набрать код страны или код области, прежде чем набирать конкретный номер телефона.

Рассматриваемые кнопки управления также являются элементами управления — это их общая характеристика. Все элементы управления имеют общие характеристики, что отличает их от форм и других объектов в окружении VBA. Далее будет рассматриваться использование наборов VBA для объединения родственных объектов в группы.

Иерархия объектов Иерархия объектов (object hierarchy) определяет, как объекты связаны друг с другом и как к ним можно обратиться. В большинстве случаев программисту нет необходимости заботиться об иерархии объектов VBA, однако:

  • — При обращении к объектам других приложений следует знать иерархию объектов этого приложения.
  • — Работая с объектами доступа к данным, следует знать иерархию Data Access Objects (Объектов доступа к данным)

Наборы объектов Наборы объектов имеют собственные свойства и методы. Объекты в наборе называются членами набора (members of the collection). Все члены набора перенумерованы последовательно, начиная с 0. Номер члена в этой последовательности называется его индексом (index number). Например, набор Controls (Элементы управления) состоит из всех элементов управления на заданной форме, как показано на рис. 5.10. Наборы применяются для упрощения кода, если необходимо выполнить одну и ту же операцию над всеми объектами в наборе.

Например, следующий код последовательно просматривает набор controls и заносит имя члена в список:

Dim MyControl as Control For Each MyControl In Forml.Controls.

' Имя каждого элемента управления заносится в список.

Listl.AddItem MyControl.Name Next MyControl.

Применение свойств и методов к членам наборов Существует два общих способа адресации члена набора:

" Задать имя члена. Следующие выражения эквивалентны:

Controls («List1») Controls! List1.

— Использовать индекс члена:

Controls (3).

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

' Установить значение свойства Тор списка равным 200.

Controls! List1. Top = 200.

или так:

Dim MyControl as Control.

For Each MyControl In Form1. Controls ().

' Установить значение свойства Top каждого члена равным 200.

MyControl.Top = 200.

Next MyControl.

Объекты, содержащие другие объекты В VBA некоторые объекты содержат другие объекты. Например, обычно форма содержит один или более элементов управления. Удобство использования объектов в качестве контейнеров (containers) для других объектов заключается в том, что можно ссылаться на контейнер в коде для уточнения, какой объект используется. Например, могут быть две разные формы. Обе формы могут иметь списки с именем istAcctNo. Для точного указания списка можно использовать ссылку на форму, содержащую этот список:

frmReceivable.IstAcctNo.AddItem 1201.

или.

frmPayable.IstAcctNo.AddItem 1201.

Общие наборы в VBA.

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

Формы.

Первым шагом при разработке приложения на VBA является создание интерфейса, видимой части приложения, с которым взаимодействует пользователь. Формы и элементы управления как раз и являются строительными блоками при создании интерфейса. Именно с этими объектами приходится работать при построении приложений.

Формы — это объекты, которые обладают свойствами, определяющими их внешний вид, методами, определяющими их поведение, и событиями, которые определяют их взаимодействие с пользователем. Установкой свойств формы и разработкой кода VBA для отклика формы на события создается объект, удовлетворяющий требованиям определенного приложения.

Элементы управления — это объекты, содержащиеся внутри объектов-форм. Каждый тип элемента управления имеет свой собственный набор свойств, методов и событий, что делает его пригодным для определенной цели. Некоторые элементы управления, используемые в приложениях, лучше всего подходят для ввода или отображения текста. Другие элементы управления обеспечивают доступ к другим приложениям и данным процессов таким образом, как будто бы удаленное приложение является частью самого приложения.

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

Разработка формы Формы являются основными строительными блоками приложения VBA, теми окнами, с которыми взаимодействует пользователь при работе с приложением. У форм есть свои свойства, события и методы, которые позволяют управлять их внешним видом и поведением.

Первым шагом в разработке формы является установка значений ее свойств. Свойства формы можно установить во время разработки в окне Properties (Свойства) или во время выполнения (run time) приложения, написав соответствующий код.

Установка свойств формы Многие из свойств формы воздействуют на ее внешний вид, т. е. то, как ее видит пользователь. Свойство Caption (Название) определяет текст заголовка окна (title bar) формы. Изменяя установку свойства BorderStyle, можно управлять размерами формы.

Свойства Height (Высота) и Width (Ширина) определяют начальные размеры формы; свойства Left (Левый) и Top (Верхний) определяют местоположение формы по отношению к левому верхнему углу экрана монитора.

Свойство Name (Имя) устанавливает имя, по которому можно обращаться к форме из кода. По умолчанию, когда форма впервые добавляется к проекту, ее имя может быть одним из последовательности имен Form1, Form2 и т. д. Однако для программиста удобнее, если свойство Name будет иметь более выразительное значение, например, frmГлавная для первой формы приложения.

Наилучший путь познакомиться с многочисленными свойствами форм — это поэкспериментировать с ними. Изменить значения некоторых свойств формы в окне Properties, затем запустить приложение и проанализировать воздействие новых значений. Узнать больше о каждом свойстве можно также, выбрав его и нажав F1.

События и методы формы Как объекты, так и формы могут выполнять методы и реагировать (откликаться) на события.

При каждом изменении размера формы в результате действий пользователя или программным способом инициируется событие Resize (Изменить размер) формы. Это позволяет изменять размеры элементов управления на форме или перемещать их, когда изменены размеры самой формы.

Событие Activate (Активизировать) происходит всегда, когда форма становится активной, а событие Deactivate (Деактивировать) — когда активной становится другая форма приложения. Эти события удобны для организации поведения формы при ее инициировании и завершении работы с ней. Например, можно написать код, который в случае события Activate выделит текст в каком-нибудь тeкcтoвoм окне, а в случае события Deactivate внесенные изменения будут сохранены в файле или базе данных.

Чтобы сделать форму видимой, следует вызвать метод show (Показать):

Form2.Show.

Вызов метода show имеет тот же эффект, что и установка значения свойства visible (Видимый) формы в True (Истина).

Многие из методов формы работают с текстом или графикой. Методы Print (Печатать), Line (Линия), Сircle (Окружность) и Refresh (Обновить) полезны для печати или рисования непосредственно на поверхности формы.

Свойство Container.

Свойство container (Набор) используется для изменения набора объектов внутри формы. Следующие элементы управления могут содержать другие элементы управления:

  • — Рамка
  • — Графическое окно

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

Следующий код в процедуре обработки события click (Щелчок) формы увеличивает переменную цикла и использует конструкцию select case для поочередного перемещения кнопки управления из контейнера в контейнер:

Private Sub Form_Click ().

Static intX as Integer.

Select Case intX.

Case 0.

Set Command1. Container = Picture1.

Command1.Top= 0.

Command1.Left= 0.

Case 1.

Set Coinmand1. Container = Frame1.

Command1.Top= 0.

Command1.Left= 0.

Case 2.

Set Command1. Container = Form1.

Conmiand1. Top= 0.

Commandl.Left= 0.

End Select.

intX = intX + 1.

End Sub.

Связь между объектами Кроме использования и создания объектов в VBA можно организовать коммуникационную связь с другими приложениями и управлять их объектами из разрабатываемого приложения. Возможность совместного использования данных приложениями — одна из ключевых в операционной системе Windows. VBA предоставляет большую гибкость при организации взаимодействия с другими приложениями.

Создание объектов Самый простой способ создать объект — щелкнуть два раза на элементе управления в Панели управления. Однако для реализации всех возможностей объектов, доступных в VBA и из других приложений, следует использовать программные возможности VBA для создания объектов во время выполнения:

  • — Можно создавать ссылки на объект с помощью переменных
  • — Можно создавать собственные объекты с самого начала с помощью модулей классов
  • — Можно создавать собственные наборы с помощью объекта collection (Набор.)

Использование переменных для объектов Переменная может ссылаться на объекты. Присваивание объектов переменным выгодно по тем же причинам, что и присваивание переменным значений:

  • — Имена переменных, как правило, короче и их легче запомнить, чем значения, которые они содержат (или, как в данном случае, объекты, на которые они ссылаются)
  • — Во время выполнения кода переменные можно изменять, организуя ссылки на другие объекты
  • — Ссылка на переменную, содержащую объект, более эффективна, чем постоянная ссылка на сам объект

Использование переменной для объекта аналогично использованию обычной переменной, но с одним дополнительным шагом — присваиванием объекта переменной:

— Сначала ее объявляют:

Dim variable As class.

— Затем ей присваивают объект:

Set variable = object.

Объявление переменных для объектов Переменные для объектов объявляют так же, как и другие переменные, с помощью операторов Dim, ReDim, Static, Private или public. Единственное отличие заключается в наличии необязательного ключевого слова New (Новый) и параметра class (класс), они обсуждаются ниже в этой главе. Синтаксис задания переменной для объекта следующий:

(Dim | ReDim | Static | Private | Public} variable As [New] class.

Например, можно объявить переменную для объекта, которая ссылается на форму с именем frmMain в приложении:

Dim FormVar As New frmMain ' Объявление объектной переменной типа frmMain.

Можно также объявить переменную, которая может ссылаться на любую форму в приложении:

Dim anyForm As Form ' Переменная родовой формы.

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

Dim anyText As TextBox ' Может ссылаться на любое текстовое поле.

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

Dim anyControl As Control ' Переменная родового элемента управления.

Заметим, что можно объявлять переменную формы, которая будет ссылаться на конкретные формы в приложении, но нельзя объявить переменную элемента управления, которая будет ссылаться на конкретный элемент управления. Можно объявлять переменные, которые ссылаются на определенный тип элемента управления, например TextBox или ListBox, но не на конкретный элемент данного типа, например txtEntry или Listl. Но можно присвоить определенный элемент управления переменной соответствующего типа. Например, для формы со списком, имеющим имя istSample, можно написать код:

Dim objDemo As ListBox.

Set objDemo = IstSample.

Назначение объектов переменным Назначить или присвоить объект переменной можно оператором Set:

Set variable = object.

Этот оператор следует применять, если необходимо, чтобы переменная ссылалась на какой-то объект.

Иногда можно использовать переменные для объектов, иногда переменные для определенного типа элементов управления, просто для того, чтобы сократить размер набираемого кода. Например:

If frmAccountDisplay.txtAccountBalance.Text < 0 Then.

FrmAccountDisplay.txtAccountBalance.BackColor = 0 _.

FrmAccountDisplay.txtAccountBalance.ForeColor = 255.

End If.

Этот код можно значительно сократить, если применить переменную для элемента управления:

Dim Bal As TextBox.

Set Bal = frmAccountDisplay.txtAccountBalance.

If Bal. Text < 0 Then.

Bal.BackColor = 0.

Bal.ForeColor = 255.

End If.

Типы конкретных и родовых объектов Переменные для конкретных объектов (specific object variables) должны ссылаться на один конкретный тип объекта или класса. Переменная для конкретной формы может ссылаться только на одну форму в приложении (хотя она может ссылаться на одну форму из множества экземпляров этой формы). Точно так же переменная для конкретного элемента управления может ссылаться только на один конкретный тип элемента управления в приложении, например, TextBox или ListBox. Чтобы посмотреть, как это делается, откроем новый проект и поместим на форму поле ввода. Добавим следующий код к форме:

Private Sub Form_Click ().

Dim anyText As TextBox.

Set anyText = Textl.

anyText.Text = «Hello» .

End Sub.

Запустим приложение и щелкнем кнопкой мыши на форме. Свойство Text (Текст) поля ввода изменится на «Hello» .

Переменные для родовых объектов (generic object variables) могут ссылаться на один из многих конкретных типов объектов. Переменная для родовой формы, например, может ссылаться на любую форму в приложении; переменная для родового элемента управления может ссылаться на любой элемент управления на любой форме в приложении. Чтобы посмотреть, как это делается, откроем новый проект и поместим несколько элементов управления рамкой, меткой и кнопок управления на форму в произвольном порядке. Добавим следующий код к форме:

Private Sub Form_Click ().

Dim anyControl As Control.

Set anyControl = Formi. Controls (3).

anyControl.Caption = «Hello» .

End Sub.

Запустим приложение и щелкнем кнопкой мыши на форме. Надпись на элементе управления, помещенном на форму третьим, изменится на «Hello» .

В VBA существуют три типа родовых объектов:

  • — Form. Ссылается на любую форму в приложении
  • — control. Ссылается на любой элемент управления в приложении
  • — object. Ссылается на любой объект

Переменные для родовых элементов управления полезны, если не известен конкретный тип объекта, на который будет ссылаться переменная во время выполнения. Например, в коде, который будет оперировать с любой формой в приложении, необходимо использовать переменную для родовой формы.

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

Добавление разработанных пользователем методов и свойств Можно добавлять разработанные методы и свойства к формам и обращаться к ним из других модулей в приложении. Чтобы создать новый метод для формы, следует объявить процедуру с ключевым словом public:

' Пользовательский метод на Form1.

Public Sub LateJobsCountO.

. '.

End Sub.

Процедуру LateJobsCount можно вызвать из другого модуля оператором:

Form1.LateJobsCount.

Создать новое свойство так же просто, как объявить открытую переменную в модуле формы:

Public IDNumber As Integer.

Можно устанавливать и возвращать значение свойства IDNumber формы Form1 из других модулей двумя операторами:

Form1.IDNumber = 3.

Textl.Text = Form1.IDNumber.

Можно также использовать процедуры property (Свойство) для добавления разработанных свойств к форме.

Примечание Можно обратиться к переменной, разработанному методу или установить значение разработанного свойства формы без ее загрузки. Это позволяет выполнить код на форме без загрузки ее в память. Точно так же ссылка на элемент управления без ссылки на какое-то из его свойств или методов не загружает форму.

Ключевое слово New.

Ключевое слово New применяется для создания нового объекта в соответствии с его определением в своем классе. Его можно применять для создания экземпляров форм, классов, определенных в модулях классов, и наборов.

Использование ключевого слова New с формами Каждая создаваемая во время разработки форма является классом. С помощью ключевого слова New можно создавать новые экземпляры этого класса. Чтобы увидеть, как это делается, создадим кнопку управления и несколько других элементов управления на форме. В окне Properties присвоим свойству Name формы значение sample. Добавим следующий код в процедуру обработки события click кнопки управления:

Dim x As sample.

Set x = New sample.

х. Show.

Запустим приложение и щелкнем несколько раз кнопкой мыши на кнопке управления. Передвинем первую форму в сторону. Так как форма является классом с видимым интерфейсом, мы увидим дополнительные копии. Каждая форма имеет те же самые элементы управления, что и форма во время разработки.

Примечание Чтобы сделать форму переменной и сохранять экземпляр загруженной формы, следует использовать переменные Static (Статический) или Public (Открытый) вместо локальных переменных.

Использование ключевого слова New другими объектами Ключевое слово New используется для создания наборов и объектов классов, определенных в модулях классов. Рассмотрим пример, демонстрирующий создание экземпляров класса с помощью ключевого слова New. Откроем новый проект и создадим кнопку управления на форме Form1. Выполним команду Add Class Module (Добавить модуль класса) меню Project для добавления модуля класса в проект. Установим значение свойства Name модуля класса в showMe.

Следующий код в модуле Form1 создает новый образец класса ShowMe и вызывает процедуру, содержащуюся в модуле класса:

Public cisNew As ShowMe.

Private Sub Commandl Click ().

Set cisNew = New ShowMe.

cisNew.ShowFrm.

End Sub.

Процедура ShowFrm в модуле класса создает новый образец класса sample и показывает ее:

Sub ShowFrm ().

Dim frmNew As sample.

Set frmNew = New sample.

frmNew.Show.

End Sub.

Запустим приложение и щелкнем кнопкой мыши несколько раз на кнопке управления. Получаем эффект, как в предыдущем примере, но ключевое слово New использовалось для создания класса.

Ограничения на использование ключевого слова New.

С ключевым словом New нельзя:

  • — Объявлять переменные основного типа данных, например: Dim x As New Integer
  • — Объявлять переменные любого родового объекта, например: Dim x As New Control
  • — Объявлять переменные типа для любого конкретного элемента управления, например: Dim X As New ListBox
  • — Объявлять переменные для любого конкретного элемента управления, например: Dim X As New IstNames.

Освобождение ссылок на объекты Каждый объект использует память и системные ресурсы. Хорошим стилем программирования является освобождение этих ресурсов, когда объект больше не нужен. Этого можно добиться с помощью:

  • — Оператора unload (Выгрузить) для выгрузки формы или элемента управления из памяти
  • — Значения Nothing (Ничего) для освобождения ресурсов, используемых переменной для объекта. Следует присвоить значение Nothing переменной для объекта оператором Set.

Передача объектов в процедуры В VBA можно передавать объекты в процедуры. В следующем примере предполагается, что на форме существует кнопка управления:

Private Sub Commandl_Click ().

' Вызов процедуры Demo sub и передача ей формы.

Demo Form1.

End Sub.

Private Sub Demo (x As Formi).

' Прижать вправо.

x.Left = 0.

End Sub.

Также можно передать объект через параметр по ссылке и затем внутри процедуры установить таким образом, чтобы он ссылался на новый объект. Откроем проект и введем в него вторую форму. Поместим на нее графическое окно. Для свойства Name объекта Form2 необходимо установить значение picture2, а для свойства Picture — имя файла иконки *.ico.

Процедура Form1_click обработки события вызывает процедуру GetPicture в форме Form2 и передает ей пустую картинку:

Private Sub Form_Click ().

Form2.GetPicture Picture1.

End Sub.

Процедура GetPicture в форме Form2 присваивает значение свойства Picture (Картинка) графического окна на форме Form2 пустой картинке на форме Form1:

Private objX As PictureBox Public.

Sub GetPicture (x As PictureBox).

' Присваивает переданное графическое окно объектной переменной.

Set objX = x.

' Присваивает значение свойства Picture графическому окну на Formi.

objX.Picture = picture2.Picture.

End Sub.

Запустим это приложение и щелкнем кнопкой мыши на форме Form1. Увидим значок формы Form2 в графическом окне на форме Form1.

Объектная модель FileSystemObject.

Объектная модель FileSystemObject представляет собой не иерархическую структуру объектов (классов), позволяющих получать информацию о файловой системе компьютера и выполнять различные операции с файлами и каталогами этой системы.

Порядок использования объектной модели FileSystemObject, т. е. ее объектов с их свойствами и методами при программировании приложения следующий:

  • — Подключить к проекту библиотеку типов SCRRUN.DLL. Эта библиотека входит в комплект поставки последних разновидностей Windows95, а все более новые Windows, как 9x, так и NT содержат ее обязательно. Получить эту бибилотеку можно бесплатно на сайте Microsoft http://msdn.microsoft.com/scripting.
  • — Создать новый объект типа FileSystemObject стандартными методами (посредством New или CreateObject)
  • — Использовать его методы и свойства для получения необходимой информации, в том числе ссылок на другие (подчиненные) объекты модели. Соответственно, использовать методы и свойства подчиненных объектов модели.

После завершения работы закрыть все использованные объекты, начиная с нижних в иерархии. Там где это необходимо использовать для закрытия объектов их методы, в прочих случаях использовать.

Set objvar=Nothing.

Объектная модель включает следующие классы.

Класс.

(тип объекта).

Назначение.

FileSystemObject.

Обеспечивает доступ к файловой системе компьютера.

Drives.

Cодержит объекты Drive, каждый из которых ассоциируется ровно с одним диском в файловой системе компьютера, с учетом сети.

Drive.

Обеспечивает доступ к информации о заданном диске компьютера002E.

Folders.

Семейство Folders содержит объекты Folder, каждый из которых ассоциируется ровно с одним подкаталогом заданного каталога.

Folder.

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

Files.

Семейство Files содержит все объекты File, каждый из которых ассоциируется ровно с одним файлом в заданной папке.

File.

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

TextStream.

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

объект FileSystemObject обеспечивает доступ к файловой системе компьютера. Будучи объектом верхнего уровня объектной модели FileSystemObject является «точкой входа» в файловую систему компьютера. Только после его создания возможен доступ к другим объектам модели, их методам и свойствам.

Dim objFSO As FileSystemObject.

Set objFSO = CreateObject («Scripting.FileSystemObject»).

или.

Set objFSO = New FileSystemObject.

Элемент.

Тип данных.

Тип данных.

objFSO.

FileSystemObject.

Идентификатор (имя) объекта FileSystemObject.

Свойства объекта FileSystemObject.

Свойство.

Тип данных.

Чтение/запись.

Описание.

Drives.

Drives.

Только чтение.

Содержит ссылку на семейство Drives, содержащую объекты для каждого устройства дисковой памяти компьютера.

Методы объекта FileSystemObject.

Метод.

Назначение.

BuildPath.

Создание строки путем слияния аргументов и добавления между ними, если его нет, разделителя «» (обратной косой черты).

CopyFile.

Копирование одного или нескольких файлов из одной папки в другую.

CopyFolder.

Копирование содержимого папки со всеми содержащимися в ней папками (подкаталогами) в заданное место.

CreateFolder.

Создание новой папки с заданным именем.

CreateTextFile.

Создание файла и открытие его в режиме текстового файла последовательного доступа для записи как объекта TextStream.

DeleteFile.

Удаление одного или нескольких заданных файлов.

DeleteFolder.

Удаление одной или нескольких заданных папок вместе со всем их содержимым.

DriveExists.

Проверка существования диска с заданным именем на локальной машине или в сети.

FileExists.

Проверка существования файла с заданным именем на локальной машине или в сети.

FolderExists.

Проверка существования папки с заданным именем на локальной машине или в сети.

GetAbsolutePathName.

Получение полного имени файла или папки по относительному имени.

GetBaseName.

Получение поcледнего компонента — имени папки или файла (без расширения) по его полному или относительному имени.

GetDrive.

Получение ссылки на объект Drive, связанный с заданным диском.

GetDriveName.

Получение имени диска из имени папки или файла.

GetExtensionName.

Получение расширения из заданного имени файла.

GetFile.

Получение ссылки на объект File, связанный с заданным файлом.

GetFileName.

Получение имени (с расширением) файла из полного имени (пути) файла.

GetFolder.

Получение ссылки на объект Folder, связанный с заданной папкой.

GetParentFolderName.

Получение имени папки, являющейся предпоследним компонентом полного имени (пути) файла или папки.

GetSpecialFolder.

Получение ссылки на объект Folder, связанный с одной из трех специальных папок — папки Windows, системной папки и папки временных файлов.

GetTempName.

Получение имени для временного файла.

MoveFile.

Перемещение одного или нескольких файлов из одной папки в другую.

MoveFolder.

Перемещение содержимого папки со всеми содержащимися в ней папками (подкаталогами) в заданное место.

OpenTextFile.

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

У каждого из прочих вышеперечисленных семейств и объектов имеются свои свойства и методы. Для ознакомления с ними следует обратиться к справочной литературе.

ЭЛЕМЕНТЫ УПРАВЛЕНИЯ В ПРИЛОЖЕНИЯХ VBA.

Кнопки как основа выполнения действий Наиболее простой путь обеспечить взаимодействие пользователя с приложением — предусмотреть наличие кнопок, нажатие которых будет вызывать необходимые действия. Для этих целей можно использовать элемент управления Command Button (Кнопка управления), предоставляемый системой VBA, или разработать собственную «кнопку», используя элемент управления Image (Изображение), содержащий графику (значок).

Кнопки управления Большинство приложений VBA имеет кнопки управления, простым нажатием которых пользователь может выполнять разнообразные действия. Когда пользователь нажимает кнопку, то не только выполняется соответствующее ей действие, но и она сама выглядит так, как будто ее вдавливают, а потом отпускают. При щелчке на кнопке вызывается событие click (Щелчок). Для выполнения определенных действий при щелчке на кнопке в процедуру обработки события click помещается соответствующий код.

Существует много способов «нажать» кнопку управления во время выполнения:

  • — Использовать мышь, щелкнув на кнопке
  • — Переместить фокус на кнопку, нажимая клавишу ТаЬ, и затем выбрать эту кнопку, нажав клавишу Spacebar (пробел) или Enter (ввод) .
  • — Нажать клавишу доступа (Аlt+) к данной для кнопки управления.
  • — Нажать кнопку управления программным путем, для чего любым способом (вручную с помощью окна свойств или с помощью оператора в программе) установить значение свойства value (Значение) кнопки управления равным True (Истина), а затем с помощью оператора в программе вызвать процедуру обраьотки события click для этой кнопки.
  • — Если кнопка управления является кнопкой управления по умолчанию, выбрать эту кнопку, нажав клавишу Enter даже если в фокусе в данный момент оказывается другой элемент управления.
  • — Если кнопка управления no умолчанию является кнопкой отказа (cancel button), то, где бы не находился фокус, выбрать эту кнопку можно, нажав клавишу Esc.

Все эти действия заставляют систему VBA вызывать процедуру обработки события click.

Элементы управления для отображения и ввода текста Элементы управления Label (Метка) и TextBox (Текстовое поле) применяются для отображения или ввода текста. Метки используются для отображения текста на форме, а текстовые поля — когда необходимо предоставить пользователю возможность вводить текст. Текст в метках можно только читать, тогда как текст в текстовых полях можно редактировать. Назначение элементов управления поясняет табл.

Таблица — Назначение элементов управления для отображения и ввода текста.

Элемент управления.

Назначение.

Текстовое поле (TextBox).

Ввод и отображение текста. Текст может редактироваться (изменяться) пользователем.

Метка (Label).

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

Метки Элемент управления Label отображает текст, который пользователь не может изменять. Метки можно использовать для идентификации элементов управления, например, текстовых полей и полос прокрутки, не имеющих собственного свойства caption (Надпись). Текст, отображаемый в элементе Label (метка), задается свойством Caption этого элемента. Оно может быть установлено во время разработки в окне Properties или во время выполнения оператором присваивания в программном коде.

По умолчанию надпись — единственная видимая часть элемента управления Label. Однако, если значение свойства BorderStyle установлено равным 1 (это можно сделать во время разработки), то метка появляется вместе с границей, что придает ей вид, похожий на вид текстового поля. Изменить внешний вид метки можно установкой свойств BackColor (цвет фона), BackStyle (Стиль фона), ForeColor (цвет букв) и Font (Шрифт).

Подгонка размеров метки к ее содержимому Однострочные надписи в метке можно задавать во время выполнения в окне Properties. Но что делать, если необходимо вывести более длинные надписи, или надпись будет меняться во время выполнения? Метки имеют два свойства, которые помогают подгонять их размер для отображения надписей переменной длины. Это свойства AutoSize (авторазмер) и Wordwrap (ПереносСлов).

Свойство AutoSize определяет, следует ли автоматически изменять размер элемента управления, чтобы он соответствовал выводимым данным. Если значение этого свойства равно True, то горизонтальный размер метки увеличивается, чтобы на ней поместилась надпись. Свойство wordwrap увеличивает высоту метки, при этом ее ширина не меняется.

Текстовые поля Текстовые поля являются гибкими элементами управления и применяются как для получения вводимых пользователем данных, так и для отображения текста. Их не следует использовать для отображения текста, который пользователь не должен изменять, если только значение свойства Locked (Заблокирован) не установлено равным True.

Текст, отображаемый в текстовом поле, управляется свойством Text (Текст). Его можно установить тремя различными способами: во время разработки в окне Properties, во время выполнения из программного кода или во время выполнения на основании данных, введенных пользователем. Текущее содержимое текстового поля можно получить во время выполнения, считывая значение свойства Text.

Многострочные текстовые окна и перенос слов По умолчанию в текстовом поле отображается одна строка текста, полосы прокрутки не отображаются. Если текст длиннее доступного пространства, будет видна только часть текста. Вид и поведение текстового поля можно изменить, установив значения свойств Multi-Line и scroliBars, которые доступны только во время разработки.

Примечание Свойство ScrcllEars не следует путать с элементом управления Scroll Bar (Полоса прокрутки), который не присоединяется к текстовым полям и имеет свой собственный набор свойств.

Установка значения свойства MultiLine равным True позволяет текстовому полю принимать и отображать много строк текста во время выполнения. Так как в многострочном текстовом поле нет горизонтальной полосы прокрутки, то оно автоматически управляет переходом на новую строку, если текст не помещается. По умолчанию значение свойства ScroliBars равно None (Нет). Автоматический переход на новую строку избавляет пользователя от необходимости вводить в конце строк символ разрыва строки. Если строка текста длиннее строки текстового поля, то текстовое поле переносит вывод строки на следующую строку.

Символ разрыва строки нельзя вводить в окне Properties во время разработки. В процедуре разрыв строки моделируется вводом символа возврата каретки, за которым следует символ перевода строки (символы с кодами ANSI 13 и 10 соответственно). Можно также использовать константу vbCrLf для ввода комбинации символов возврат каретки/перевод строки. Например, следующая процедура обработки события вводит две строки текста в многострочное текстовое поле (Textl) при загрузке формы:

Sub Fom_Load (}.

Textl.Text = «Here are two lines» & vbCrLf & «in a text box» End Sub.

Работа с текстом в текстовом поле Управлять точкой ввода и поведением выделенного фрагмента (selection behavior) в текстовом поле можно с помощью свойств selstart, SelLength и SelText. Эти свойства доступны только во время выполнения.

Когда текстовое окно впервые получает фокус, по умолчанию точка ввода (положение курсора) в текстовом поле находится слева от текста, находящегося в поле. Пользователь может его изменить с клавиатуры или с помощью мыши. Если текстовое окно теряет и затем снова приобретает фокус, точка ввода будет находиться там, где пользователь установил ее в последний раз.

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

Значением свойства selStart является число, которое указывает место вставки в строке текста, причем 0 соответствует крайней левой позиции. Если значением свойства selStart является число, равное или больше, чем число символов в текстовом окне, точка ввода находится сразу за последним символом.

Число, равное значению свойства SelLength, задает ширину точки ввода. Если это число больше 0, то равное ему количество символов, начиная от текущей точки ввода, выбирается и выделяется.

Если пользователь начинает печатать при выделенном блоке текста, то последний будет замещен вводимым текстом. При необходимости можно заменить выделенный текст новым с помощью команды Paste (Вставить) меню Edit (Правка). Значением свойства SelText является строка текста, кото рую можно присвоить во время выполнения и которая заменит выделенный текст. Если такового нет, то в текущую точку ввода будет помещено значение свойства SelText.

Элементы управления, организующие выбор пользователя В большинстве приложений пользователю предоставляется возможность выбора, начиная от простейшего «да/нет», до сложного выбора из списка, состоящего из сотен возможностей. VBA содержит несколько стандартных элементов управления для организации выбора.

Таблица — Элементы управления для организации выбора.

Элемент управления.

Возможности.

Check boxes (Флажки).

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

Option buttons.

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

List box (Список).

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

Combo box (Комбинированное окно).

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

Флажки Флажок показывает, включено или нет определенное условие. В приложении флажки используются, чтобы дать пользователю возможность выбора типа «правда/ложь» или «да/нет». Так как флажки работают независимо друг от друга, пользователь может установить любое их число одновременно.

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

Создание групп переключателей Все переключатели, размещенные непосредственно на форме (те. не внутри рамки (frame) или графического окна (picture)), составляют одну группу. Если необходимо создать дополнительные группы переключателей, некоторые из них надо поместить внутрь рамок или графических окон.

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

Пользователь может выбрать только один переключатель в группе внутри рамки.

Для группирования элементов управления с помощью рамки следует:

  • 1. Выбрать элемент управления Frame (Рамка) на Панели элементов управления (Toolbox), нарисовать рамку и поместить ее на форму.
  • 2. Выбрать переключатель на Панели элементов управления и нарисовать его внутри рамки.
  • 3. Повторить шаг 2 для остальных переключателей, добавляемых в группу.

Соблюдение последовательности создания группы элементов управления (сначала рисуется рамка, а затем внутри нее рисуется каждый элемеш управления из группы) позволяет работать с ними как с группой. При перемещении рамки вместе с ней будут перемещаться и все элементы внутри нее. Если переместить существующий на форме элемент управления внутрь рамки, то он при перемещении рамки останется неподвижным, т. к. нарушена процедура создания группы.

Примечание Чтобы сгруппировать существующие элементы управления, следует выбрать все элементы, которые будут составлять группу, вырезать их и вставить в рамку или графическое окно.

Контейнеры для элементов управления Элементы управления являются независимыми объектами, однако между ними и формами существуют отношения подчиненности (parent and child relationships).

Для понимания идеи контейнеров необходимо четко осознавать, что все элементы управления являются подчиненными по отношению к форме, на которой они нарисованы. Фактически большинство элементов управления поддерживает свойство parent (Родитель) в режиме «только чтение» (readonly), т. е. значением этого свойства является форма, на которой расположен элемент управления, и это значение невозможно изменить. Положение элемента управления ограничено родительской формой, по отношению к которой он является подчиненным. Свойства Left и тор элемента управления связаны с родительской формой, и поэтому элемент управления нельзя переместить за границы этой формы. Перемещение контейнера также перемещает и элементы управления, и не изменяет значений свойств Left и тор элемента управления.

Выбор переключателей Переключатель можно выбрать:

  • — Щелчком на нем кнопкой мыши во время выполнения
  • — Клавишей выбрать группу переключателей и затем клавишами со стрелками выбрать переключатель в группе
  • — Установив значение его свойства value равным True в программном коде: optChoice. Value = True
  • — С помощью клавиши быстрого доступа, определенной в надписи метки

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

Можно сделать переключатель недоступным, установив значение его свойства Enabled (Доступный) равным False. При выполнении программы такой переключатель выделен серым цветом, и это означает, что он не доступен пользователю.

Комбинированные окна и списки Списки и комбинированные окна предоставляют пользователю список возможных вариантов выбора, по умолчанию отображаемых вертикально в одну колонку, хотя возможно отображение и в несколько колонок. Если число элементов превышает возможности отображения в комбинированном окне или списке, автоматически появляется полоса прокрутки. Пользователь в этом случае может просматривать список элементов, прокручивая его вверх и вниз или влево и вправо.

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

По сравнению с другими элементами управления, которые содержат одно значение, например, значение свойства caption метки или значение свойства Text текстового поля, списки и комбинированные окна содержат набор значений. Для них существуют встроенные методы добавления, удаления и получения значений из этого набора во время выполнения. Программный код для добавления нескольких элементов в список с именем Listi мог бы выглядеть следующим образом:

Listl.Addltem «Paris» Listl. AddItem «New York» Listl. AddICem «San Francisco» .

Списки и комбинированные окна — это эффективный способ представления большого числа вариантов выбора для пользователя в ограниченном пространстве на форме.

Полосы прокрутки как устройства ввода В основном полосы прокрутки используются в текстовых полях или окнах, но иногда их применяют в качестве устройств ввода. Полосы прокрутки показывают текущую позицию на масштабной линейке, поэтому их можно использовать самостоятельно для управления вводом в программу, например, регулировать цветовую палитру в картинке или уровень громкости. Элементы управления HScrollBar (Горизонтальная полоса прокрутки) и VScrollBar (Вертикальная полоса прокрутки) функционируют независимо от других элементов управления и имеют собственные наборы событий, свойств и методов. Элементы управления «Полоса прокрутки» — это не то же самое, что встроенные полосы прокрутки, присоединяемые к текстовым полям, спискам, комбинированным окнам.

Руководящие принципы построения интерфейса Windows теперь предлагают применять полосы-регуляторы (slider controls) вместо полос прокрутки (scroll bars). Примеры регуляторов можно увидеть в панели управления Windows 95. Элемент управления «Регулятор» в стиле Windows 95 включен в версии VBA Professional и Enterprise.

Графические элементы управления. Отображение картинок и графики В состав VBA включен объект для работу с графикой: image (Изображение).

Примечание Объекты Form также имеют свойство Picture, которое можно установить для отображения картинки непосредственно в виде фона (заднего плана) формы.

Для отображения или замены картинки во время выполнения следует установить значение свойства picture при помощи функции LoadPicture. Ей передается только имя (с необязательным путем) файла картинки, и далее эта функция управляет деталями загрузки и отображения картинки:

picMain.Picture = LoadPicture («VAHGOSH.BMP»).

Объект picture имеет свойство AutoSize, которое, если его значение равно True, автоматически изменяет размеры окна вывода картинки, чтобы оно соответствовало размерам выводимой картинки. Следует быть очень внимательным при разработке формы, если ее свойство AutoSize равно True. Размеры окна вывода картинки изменяются независимо от других элементов управления на форме. В результате картинка может, например, закрыть другие элементы управления. Во время разработки следует протестировать вывод каждой картинки, которую предполагается использовать в приложении.

Графическое окно в качестве контейнера Графическое окно может также выполнять функции контейнера для других элементов управления. Как и в случае с рамкой (frame control) можно поместить другие элементы управления в графическое окно. Помещенные элементы управления будут перемещаться вместе с графическим окном, а их свойства тор и Left будут подчинены ему, а не форме, Обыкновенно графическое окно в качестве контейнера используют для того, чтобы создать панель инструментов или строку состояния. Туда можно поместить элементы управления Image, чтобы они выступали в качестве кнопок, или добавить метки для отображения сообщений о состоянии. Устанавливая значение свойства Align (Выровнять) равным тор (Верх), Bottom (Низ), Left (Лево) или Right (Право) можно «прикрепить» графическое окно к соответствующему краю формы.

Элемент управления Image.

Картинки загружаются в объект image: во время разработки — назначением имени файла и пути свойству picture, во Время выполнения — посредством функции LoadPicture.

При изменении размеров элементы управления Image и Picture ведут себя по-разному. Установка значения свойства Autosize объекта picture равным True приводит к тому, что размеры Графического окна изменяются в соответствии с размерами выводимой картинки; если значение этого свойства равно False, то картинка усекается (видна только ее часть). Объект Image не имеет свойства Autosize, а обладает свойством Stretch (Растягивание). Присвоение этому свойству значения False (значение по умолчанию) приводит к тому, что размеры элемента управления изменяются в соответствии с размерами картинки. Если свойство stretch равно True, то размеры картинки изменяются до размеров элемента управления Image, что может привести к искажению картинки при ее отображении.

Создание кнопок Объект image распознает событие click, что предоставляет удобный способ создания кнопок с картинками вместо кнопок с надписями. Объединение нескольких элементов управления Image в горизонтальном направлении вверху экрана (обычно внут ри графического окна) в группу позволяет создавать панели инструментов приложения.

Примечание В отличие от кнопок управления, элементы управления image не вдавливаются, если на них выполняется щелчок.

Другие элементы управления В Панель элементов управления VBA включены несколько других стандартных элементов управления. Некоторые из них полезны для работы с большим объемом данных, содержащихся во внешних базах данных. Другие полезны для доступа к файловой системе Windows. Третьи элементы управления не подходят ни под одну из категорий, однако достаточно полезны при разработке приложений.

В приложениях VBA можно использовать элементы управления АсtiveX, называвшихся ранее элементами управления OLE, точно таким же образом, как используются и стандартные элементами управления. В версии VB Professional и Enterprise включены некоторые элементы управления ActiveX, а также возможность построения собственных элементов управления программиста. Дополнительные элементы управления ActiveX для любых вообразимых целей можно приобрести у многочисленных поставщиков этого продукта.

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

  • — Элемент управления Timer (Таймер) можно использовать для создания в приложении события через повторяющийся интервал времени. Это удобно для выполнения кода без взаимодействия с пользователем.
  • — Элемент управления OLE Container (Контейнер OLE) обеспечивает легкий способ добавления в приложение возможностей связывания (linking) и внедрения (embedding). Посредством этого элемента управления можно обеспечить доступ к выполняемым функциям любого приложения, поддерживающего OLE технологию, например Microsoft Excel, Word и многих других.
  • — Элемент управления Common dialog (Общий диалог) добавляет в приложение встроенные диалоговые оюна (built-in dialog boxes) для выбора файлов, цветов, шрифтов, функций печати.

Что такое фокус?

Объект, имеющий фокус, может получать вводимую пользователем с помощью мыши и клавиатуры информацию. В системе Microsoft Windows одновременно могут выполняться несколько приложений, но только у приложения, имеющего фокус, будет активный заголовок окна (active title bar) (выделен повышенной яркостью), и только оно может взаимодействовать с пользователем. На форме приложения VBA с несколькими полями ввода только поле ввода, имеющее фокус, будет отображать вводимый с клавиатуры текст.

Когда объект получает или теряет фокус, происходят соответственно события GotFocus и LostFocus. Формы и большинство элементов управления поддерживают эти события.

Объекту можно передать фокус несколькими способами:

  • — Выбрать объект с помощью мыши во время выполнения
  • — Выбрать объект с помощью клавиши доступа во время выполнения
  • — Из программного кода с помощью метода set Focus

Всегда можно определить, имеет ли объект фокус. Например, когда кнопка управления имеет фокус, обрамление ее надписи отображается с повышенной яркостью.

Объект может получить фокус, только если его свойства Enabled (Разрешено) и visible (Видимый) установлены в True. Свойство Enabled (Разрешено) позволяет объекту реагировать на инициированные пользователем события, например, ввод с клавиатуры и нажатие кнопок мыши. Свойство visible (Видимый) определяет, виден ли объект на экране;

Событие Validate элементов управления Элементы управления имеют событие validate (Проверка достоверности), которое происходит перед тем, как элемент управления теряет фокус. Однако это событие возникает, только если свойство CausesValidation элемента управления перед получением фокуса имеет значение True. Событие Validate происходит перед потерей фокуса, поэтому во многих случаях оно более подходит для проверки достоверности данных (data validation), чем событие LostFocus.

Элементы управления, которые не могут получить фокус Некоторые элементы управления не могут получать фокус. К ним относятся облегченные графические элементы управления:

  • — Frame (Рамка)
  • — Image (Изображение)
  • — Label (Метка)

Кроме этих элементов управления не могут получить фокус и неотображаемые элементы управления.

Установка последовательности перехода Последовательность перехода (tab order) — это последовательность перехода от одного элемента управления к другому при нажатии клавиши ТаЬ. У каждой формы своя последовательность перехода. Обычно она соответствует последовательности создания элементов управления.

Пусть создаются два поля ввода, Textl и Text2, а затем — кнопка управления Commandl. При запуске приложения поле ввода Textl имеет фокус.

Нажатие клавиши Tab перемещает фокус между элементами управления в той последовательности, в которой они создавались.

Для изменения последовательности перехода необходимо установить свойство TabIndex элемента управления, которое определяет его позицию в последовательности перехода при нажатии клавиши Таb. По умолчанию значение свойства Tabindex элемента управления, созданного на форме первым, равно 0, элемента, созданного вторым — 1 и т. д. При изменении позиции элемента управления в последовательности переходов VBA автоматически перенумеровывает позиции других элементов управления, отражая вставку в другую позицию или удаление из последовательности перехода элемента управления. Например, если кнопка управления command1 в предыдущем примере становится первой в последовательности переходов, то значения свойства TabIndex других элементов управления автоматически перенумеровываются.

Наибольшее значение свойства Tabindex всегда на единицу меньше числа элементов в последовательности перехода, так как нумерация начинается с нуля. Даже если случайно значение свойства Tabindex окажется больше числа элементов управления, VBA переустановит это значение так, чтобы оно было на единицу меньше числа элементов управления.

Примечание Элементы управления, которые не могут получить фокус, как и недоступные и невидимые элементы управления, не имеют свойства Tabindex и не могут быть включены в последовательность перехода. Когда пользователь нажимает клавишу, эти элементы управления пропускаются.

Удаление элемента управления из последовательности перехода Обычно последовательное нажатие клавиши Таb во время выполнения выбирает каждый элемент управления из заданной последовательности перехода. Можно убрать элемент управления из последовательности перехода, установив значение его свойства TabStop равным False (или 0).

Элемент управления, свойство TabStop которого равно False, сохраняет свою позицию в последовательности перехода, хотя при переходе от одного элемента управления к другому по клавише Таb он пропускается.

Примечание Группа переключателей имеет один табуляторный ограничитель (tab stop) Для выбранной кнопки, т. е. кнопки, значение свойства Value которой равно True, значение свойства TabStop автоматически равно True, тогда как значение этого свойства для других кнопок равно False.

ПРОГРАММИРОВАНИЕ ОБЪЕКТОВ ПРИЛОЖЕНИЯ Освоив, как работают объекты, можно рассмотреть, как использовать их в программах VBA. Однако сначала полезно обсудить программирование объектов приложений. Рассмотрим следующие четыре этапа:

  • — Определение требований.
  • — Добавление ссылок на проект.
  • — Изучение модели объектов.
  • — Написание кода.

Определение требований. Данный этап весьма прост: требуется понять задачу, которую необходимо решить с помощью VBA. При этом следует максимально точно определить требования, предъявляемые к создаваемому проекту. При детальной разработке необходимо определить назначение конкретных процедур.

Располагая требованиями, можно определить необходимые инструменты. Например, если следует вывести данные в таблице Ехсеl, то требуется работать в Ехсеl. Всестороннее понимание назначения процедур и проекта позволяет сэкономить время и избежать большинства ошибок.

Использование ссылок Определив используемые в проекте приложения, требуется убедиться, что ним имеется доступ из проекта VВА. Чтобы использовать объекты не только из основного приложения, необходимо добавить ссылки на другие программы в проект VВА.

Чтобы вставить ссылку на библиотеку объектов другого приложения: I.

  • 1. Выберите в окне редактора VВА команду СервисСсылки (ТооlsRеfегеnсеs). В появляющемся диалоговом окне Ссылки выводятся названия доступных библиотек объектов. Имена библиотек, уже используемых в проекте, отмечаются галочкой.
  • 2. Установите флажок напротив имени требуемой библиотеки объектов, чтобы добавить ссылки на нее.
  • 3. Если требуемая библиотека объектов отсутствует в списке, надо нажать на кнопку Обзор (Вгоwsе), чтобы отыскать нужную библиотеку и поместить ее в список.
  • 4. Нажмите кнопку ОК.

Примечание Объекты хранятся в файлах с расширениями DLL, ТLВ, OLВ, OCX (элементы управления АсtiveХ) и ЕХЕ.

Модель объектов приложения Для большинства приложений, поддерживающих механизм ОLЕ, число объектов, используемых для поддержки их функциональных возможностей и данных, весьма велико. Простой документ Мicrosoft Wоrd или Microsoft Excel, можно при программировании разделить на множество элементов. Поэтому, прежде чем приступать к написанию программ, которые, например, автоматизируют работу со средствами приложения или обеспечивают доступ к данным, сохраненным в документе, необходимо ознакомиться с моделью объектов (иерархией классов) приложения.

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

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

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

Использование окна просмотра объектов Количество приложений, использующих ОLЕ Automation, непрерывно растет. К сожалению, обычно доступен только ограниченный объем справочной информации по работе с объектами этих программ. По этой причине легко понять назначение и использовать средства окна просмотра объектов. Окно Просмотр объектов (Objесt: Вrоwser) — средство VВА, которое позволяет вывести список компонентов требуемой библиотеки, а также свойства и методы заданного объекта.

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

Чтобы просмотреть объекты и вывести их свойства и методы:

  • 1. Выберите команду ВидПросмотр объектов (ViewObject Browser), либо на жмите клавишу. Выводится окно Просмотр объектов.
  • 2. Выберите требуемую библиотеку в списке, расположенном в верхнем правом углу окна. Чтобы просмотреть все библиотеки, участвующие в проекте, выделите в списке элемент Все библиотеки (Аll Libraries). Если нужная библиотека отсутствует в списке, требуется добавить на неё ссылку .
  • 3. Выделите в списке Классы (Class) требуемый класс. Для этого либо щелкните по имени класса, либо несколько раз нажмите клавишу для перемещения к списку Классы, а затем используйте клавиши, ,, , чтобы передвигаться по списку. После выбора класса просмотрите в списке, расположенном в правой части окна просмотра, компоненты класса, т. е. его свойства, константы и методы. Если щелкнуть по элементу, то в нижней части диалогового окна выводится дополнительная информация.
  • 4. Для поиска определенного объекта, метода или свойства, введите их название в списке, расположенном под списком библиотек, а затем нажмите кнопку Поиск (Search). Результаты поиска отображаются в окне Результаты поиска (Search Results).

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

  • 5. Чтобы увеличить или уменьшить пространство, отведенное для вывода описания объекта, свойства или метода, перетащите полосу, разделяющую списки и дополнительную информацию.
  • 6. Чтобы последовательно перемещаться назад по списку выбранных в ходе работы элементов, нажмите кнопку Назад (Back). Для перемещения вперед по этому списку нажмите кнопку Вперед (Forward).

Написание кода Описание и создание экземпляров объектов. Чтобы работать с объектами, требуется описать их. Как уже отмечалось ранее, для описания переменных используется инструкция Dim. Экземпляр класса описывается точно так же:

Dim объект as класс Например, чтобы использовать экземпляр класса Datafile с именем WorkFile, требуется задать следующую инструкцию:

Dim WorkFile as Datafile.

Рассмотрим описание экземпляра объекта презентации PowerPoint:

Dim BudgetPresentation as Presentation.

С помощью явного задания класса объекта можно ускорить компиляцию программы, т. к. при этом не требуется выполнять дополнительную проверку, которая производится в случае неявного описания:

Dim BudgetPresentation as Object.

Dim BudgetPresentation as Variant.

Dim BudgetPresentation.

Dim WorkingFile as Object.

Dim WorkingFile as Variant.

Dim WorkingFile.

Кроме того, при явном описании нового объекта можно также использовать ключевые слова Private, Public или Static.

Однако явное описание типа указывает только на то, что объект WorkingFile имеет тип DataFile. Чтобы действительно создать экземпляр класса Datafile, необходимо использовать инструкцию Set:

Set объект = New класс Например, чтобы явно описать объект WorkingEile, а затем создать экземпляр класса Datafile:

Dim WorkFile as Datafile.

Set WorkingFile = New Datafile.

Чтобы явно описать объект BudgetPresentation, а затем создать экземпляр презентации PowerPoint:

Dim BudgetPresentation as Presentation.

Set BudgetPresentation = New Presentation.

В данном примере ключевое слово New используется для создания экземпляра объекта Presentation с именем BudgetPresentation.

Присваивание переменной ссылки на объект. Присваивание переменной ссылки на объект всегда выполняется с помощью инструкции Set:

Set ObjectVariable = SomeObject.

Например, чтобы присвоить переменной MyNewTemplate ссылку на объект шаблона Microsoft Word, используйте следующую инструкцию:

Set MyNewTenvplate = Template.

Кроме того, некоторые методы возвращают ссылки на объекты. В этом случае также требуется использовать инструкцию Set. Например, метод New класса Microsoft Excel Workbook возвращает ссылку на объект рабочего листа:

Set MyNewWorksheet = ThisWorkbook.new.

Удаление объектов. В некоторых случаях требуется удалить как сам экземпляр класса, так и все относящиеся к нему данные. Для этого используется инструкция Set и ключевое слово Nothing:

Set объект = Nothing.

Например, чтобы удалить объект WorkingFile, введите следующую инструкцию:

Set WorkingFile = Nothing.

Создание модулей класса Одно из наиболее мощных средств VBA — это возможность создавать собственные классы. Таким образом можно сократить текст программ и многократно использовать методы созданных объектов, что обычно позволяет исключить множество ошибок.

Разработка объектов Объектно-ориентированное программирование требует от программиста принципиально другого способа мышления, чем при использовании процедурных языков. При разработке структуры объектов необходимо предварительно провести тщательное планирование, т. к. без детального анализа создать класс чрезвычайно трудно, а иногда и весьма долго. Для создания модели объекта можно использовать следующие программы: Rational Rose, Logic Works OOwin/CRT, OMT. Такие же возможности имеет программа Visual Modeler фирмы. Rational Rose, входящая в пакет Visual Studio 6.0.

Создание свойств Для создания свойства требуется предусмотреть возможность выполнения двух операций:

  • — Получение текущего значения свойства.
  • — Установка значения свойства.

Эти две операции выполняются с помощью двух взаимодополняющих друг друга процедур Property Let и Property Get, которые необходимо написать программисту.

Процедура Property Let. Процедура Property Let используется для установки значения свойства, например, для примера с объектом WorkingFile:

WorkingFile.delimiter = «@» .

Одна из наиболее важных функций процедуры Property Let заключается в проверке того, является ли устанавливаемое значение допустимым или нет, и если нет, то требуется вывести сообщение об ошибке.

Устанавливаемое значение всегда является в инструкции Property Let пoследним параметром. В следующем примере переменная vNewValue передает значение, которое присваивается свойству Description: I.

Public Property Let Description (ByVal vNewValue As Variant).

Description = vNewValue.

End Property.

Возвращаясь к примеру с объектом Datafile, допустим, что записи содержат числа, буквы, а также точки, поэтому требуется, чтобы разделителем не был ни один из символов, который входит в содержимое полей. Для этого напишем следующую процедуру Property Let, которая перед присваиванием проверяет устанавливаемое значение:

Public Property Let Delimiter (ByVal vNewValue As Variant).

Dim AscChar as integer.

AscChar = Asc (ucase (str$(vNewValue))).

If (IsNumeric (vNewValue)) Or (vNewValue = «.») _.

[Or ((AscChar > 64) And (AscChar < 91)) Then.

Err.Raise 5, «Datafile object: Delimiter Property», «Invalid value» .

Else.

Delimiter = vNewValue.

End If.

End Property.

Процедура Property Get. Процедура Property Get используется для получения значения свойства, например, для примера с объектом WorkingFile:

MyFilename = WorkingFile.name.

Текущее значение свойства обычно хранится в переменной уровня модуля, поэтому процедура Property Get должна присвоить требуемому свойству значение, равное значению этой переменной.

Предположим, что текущее значение свойства Filename хранится в переменной уровня модуля m_filename, поэтому она доступна в любой процедуре класса. Процедура Property Get просто присваивает свойству значение переменной m_filename:

Public Property Get Filename () As Variant.

Filename = m_filename.

End Property.

Процедуру Property Get, как и любую другую подпрограмму, можно описать с помощью ключевых слов Public, Private или Static.

Автоматическое создание свойств С помощью диалогового окна Вставка процедуры (Add Procedure), редактор VBA автоматически создает первую и последнюю инструкции процедур Property Let и Property Get. Затем требуется самостоятельно написать код для установки и получения значений свойства.

Чтобы создать свойство объекта:

  • 1. Откройте окно требуемого модуля класса.
  • 2. Выберите команду ВставкаПроцедура (InsertProcedure). Появляется диалоговое окно Вставка процедуры.
  • 3. Введите имя свойства в поле Имя (Name).
  • 4. Выберите переключатель Свойство (Property).
  • 5. Если свойство имеет общую область определения, т. е. доступно программисту, использующему объект, выберите переключатель Общая (Public). Если же свойство предполагается использовать только в модуле класса, выберите переключатель Личная (Private).

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

6. Нажмите кнопку ОК. В модуле класса создается описание процедур

Property Let и Property Get, например, для свойства Inuse:

Public roperty Get Inuse () As Variant.

End Property.

Public Property Let Inuse (ByVal vNewValue As Variant).

End Property.

Создание методов Создание методов объектов осуществляется просто. Если метод возвращает данные, то необходимо написать функцию. В обратном случае, требуется подпрограмма. Так или иначе, эти функции или подпрограммы ничем не отличаются от процедур в модулях формы или в простых модулях. Покажем реализацию метода Delete для объекта Datafile. Обратите внимание, что в подпрограмме используется переменная уровня модуля для хранения имени файла. Кроме того, процедура проверяет, используется ли файл другим пользователем или нет.

Public Sub Delete ().

If Not (Inuse (m_filename)) Then.

Kill m_filename.

End If.

End Sub.

Пример создания объекта Покажем, как можно создать объекты на примере объекта pedometer. Этот объект используется для вычисления расстояния, которое пешеход может пройти при заданной величине шага и указанном числе шагов. Свойствами объекта pedometer являются число шагов, средняя величина шага, а также используемая при расчетах система мер (метрическая или английская).

Для создания объекта pedometer:

  • 1. Выберите команду ВставкаМодуль класса (InsertClass Module). Открывается окно нового модуля класса.
  • 2. Нажмите клавишу и введите имя класса в окне свойств.
  • 3. В разделе описаний модуля опишите переменные уровня модуля, которые используются для хранения текущего значения числа шагов, их величины и выбранной системы мер, продуманно выбирая типы данных.

Например:

Dim m_steps As Long Dim m_size As Single Dim m_system As Integer.

4. Чтобы повысить восприятие текста программ, задайте две константы, соответствующие типу используемой системы мер, например:

Const METRIC =1.

Const USE = 2.

5. Создайте процедуры Property Let и Property Get для свойства Steps (число шагов). В процедурах требуется проверить, что заданный параметр является числом, и, если так, то он больше или равен 0:

Public Property Get Steps () As Integer.

Steps = vNewSteps.

End Property.

Public Property Let Steps (ByVal vNewSteps As Integer).

If IsNumeric (vNewSteps) Then.

If vNewSteps > -1 Then.

m_steps = vNewSteps.

Else.

Err.Raise 5, «Pedometer: свойство Steps» ," Значение должно быть больше или равно 0″ .

Else.

Err.Raise 5, «Pedometer: свойство Steps», «Параметр не является числом» .

End If.

End Property.

6. Создайте процедуры Property Let и Property Get для свойства Size (величина шага). В процедурах требуется проверить, что заданный параметр является числом:

Public Property Get Size () As Variant.

Size = m_size.

End Property.

Public Property Let Size (ByVal vNewValue As Variant).

If Not (IsNumeric (vNewValue)) Then.

Err.Raise 5, «Pedometer: свойство Size «, «Параметр не является числом» .

Exit Property.

End If.

m_size = vNewValue.

End Property.

7. Создайте процедуры Property Let и Property Get для свойства System (система мер). В процедурах требуется проверить, что заданный параметр имеет допустимое значение:

Public Property Get System () As Variant.

System = m_system.

End Property.

Public Property Let System (ByVal vNewSystem As Variant).

If vNewSystem METRIC And vNewSystem USE Then.

Err.Raise 5, «Pedometer: свойство System», «Недопустимое значение» .

Exit Property.

End If.

m_system = vNewSystem.

End Property.

8. Создайте метод, который вычисляет пройденное расстояние. При расчете требуется учесть различия в системах измерений:

Public Function CalculateDistance () As Single.

If m_system = USE Then.

CalculateDistance = ((m_steps * m_size) * 3) / 1760.

Else.

CalculateDistance = (m_steps * m_size) / 1000.

End If.

End Function.

МОДЕЛЬ ОБЪЕКТОВ EXCEL.

Необходимость применения Visual Basic для приложений в Excel продиктована тем, что в Excel имеется множество средств. Используя возможности Excel, например, по работе с диаграммами, финансовыми функциями и сводными таблицами, можно создать сложные приложения. VBA позволяет шить Excel новыми средствами и упростить его интерфейс.

Далее рассмотрим:

  • — Модель объектов Excel
  • — Работа с основными объектами Excel
  • — Создание и использование форм

Модель объектов Excel.

Из всех моделей объектов Microsoft Office модель объектов Excel является наиболее зрелой. Excel 5.0 был первым офисным приложением, в котором VBA использовался как язык разработки приложений. Модель объектов Excel совершенствуется в течение нескольких лет, а теперь она стала более удобной и полной. По сравнению с Excel 5.0 в Excel 97 добавлено несколько новых объектов.

Если вы работали с предыдущими версиями Excel, то некоторые объекты будут вам знакомы. Однако некоторые элементы, например, объекты WorksheetFunction, VBE и Assistant являются новыми.

В модели объектов Excel имеются более 100 объектов и семейств. Не следует пугаться этого. Вероятно окажется, что приблизительно 10 процентов объектов и семейств достаточно, чтобы выполнить 90 процентов всех возможных действий. Примерами наиболее часто используемых объектов и семейств объекты Application, Workbook и Workbooks, Worksheet Worksheets, а также объект Range. С помощью только этих объектов и семейств можно произвести огромное множество операций.

Использование объекта Application.

Исходным элементом любой модели объектов Office является объект Application. Он представляет все приложение в целом. С помощью свойств и методов элемента Application, можно установить параметры работы программы, такие как задаваемые с помощью команды СервисПараметры (ToolsOptions). В свойствах объекта Application, например, ActiveWorkbook, ActiveSheet и ActiveCell хранится информация об объекте, с которым в текущий момент работает пользователь. Кроме того, данный объект имеет полезные методы, например, метод Application. InputBox, который удобнее, чем стандартная функция VBA InputBox ().

Использование свойств объекта Application.

Как уже отмечалось выше, свойства объекта Application позволяют задавать общие параметры работы приложения Excel. Рассмотрим некоторые свойства элемента Application.

Свойства ActiveWorkbook, ActiveSheet и ActiveCell. В данных свойствах хранится информация об активном объекте. Активный объект — это объект, с которым в текущий момент взаимодействует пользователь. Значение свойства ActiveCell хранится в свойстве ActiveSheet, а величина свойства ActiveSheet — в свойстве ActiveWorkbook. Приведем пример использования свойства ActiveCell:

With ActiveCell.

.FontBold = True.

.Value = «Отчет о продажах» .

End With.

Свойство Caption. В свойстве Caption объекта Application хранится имя, которое появляется в заголовке окна приложения Excel. Данное свойство доступно как для чтения, так и для установки. Если требуется скрыть, что приложение в действительности работает в Excel, то можно вместо значения «Microsoft Excel» указать другую строку:

Application.Caption = «Корпорация АБВ. Продажи» .

Чтобы вернуть заголовок «Microsoft Excel», укажите ключевое слово Empty:

Application.Caption = Empty.

Свойство Cursor. Свойство Cursor используется для задания внешнего вида указателя мыши во время выполнения макроса. При задании значения данного свойства можно указать одну из четырех констант Excel:

  • — Константа XlDefault определяет использование указателя, заданного по умолчанию в приложении Excel. *
  • — Константа xlWait определяет использование указателя мыши в виде песочных часов. Рекомендуется присвоить свойству Cursor это значение в начале обработки данных (например, извлечения информации), чтобы сообщить пользователю, что ему требуется подождать завершения операции.
  • — Константа XlNorthwestArrow используется реже. Она определяет вывод указателя мыши в виде стрелки основного режима.
  • — Константа xlBeam используется также не очень часто. Она определяет вывод указателя мыши в виде стрелки выделения текста.

Необходимо отметить, что после изменения свойства Cursor необходимо восстановить исходный вид мыши, присвоив свойству Cursor значение xlDefault, т. к. это не производится автоматически по завершении работы Свойство DisplayAlerts. Если требуется отключить вывод встроенных подсказок и предупреждений при выполнении макроса, необходимо присвоить значение False свойству DisplayAlerts. В этом случае Excel производит стандартные действия, выбирая применяемый по умолчанию ответ на сообщения. Исходное значение свойства DisplayAlerts равно True.

Если макрос изменяет значение свойства DisplayAlerts, то перед окончанием его работы требуется присвоить данному свойству значение Тrue. В предыдущих версиях Excel это производилось автоматически, а в нас щейнеобходимо делать вручную. Таким образом, чтобы использовать макросы предыдущих версий Excel в Excel 97, требуется во избежание нежелательного поведения приложения добавить в программу следующую строку кода:

Application.DisplayAlerts = True.

Свойства DisplayFormulaBar, DisplayScrollBars и DisplayStatus:

Чтобы скрыть строку формулы, полосы прокрутки или строку состояния, требуется присвоить значение False свойству DisplayFormulaBar, DisplayScrollBars или DisplayStatusBar соответственно. И наоборот, для вывода требуемого элемента интерфейса, необходимо присвоить True соответствующему свойству. Значение по умолчанию для данных свойств равно True.

Свойство ЕпаblеСаnсelКеу. Обычно прерывание выполнения макроса осуществляется с помощью комбинации клавиш +. По умолчанию свойство EnableCancelKey равно значению xlInterrupt, которое допускает остановку процедуры пользователем для ее отладки или завершения. Если же требуется запретить прерывание выполнения, присвойте значение xlDisabled или xlErrorHandler свойству EnableCancelKey. Hеобходимо отметить, что константу xlDisabled следует использовать с особой осторожностью. Если свойство EnableCancelKey имеет данное значение, то выход из бесконечного цикла или прерывание макроса невозможно. Таким образом, перед установкой свойства требуется убедиться, что процедура полностью и тщательно отлажена.

Вместо константы xlDisable можно указать константу xlErrorHandler. Если свойство EnableCancelKey равно данному значению, то в выполняемой процедуре осуществляется переход к процедуре обработки ошибки. При использовании константы xlErrorHandler необходимо включить в макрос подпрограмму обработки ошибки, указав инструкцию On Error Goto. Номер ошибки, возникающей в результате нажатия комбинации клавиш +, равен 18.

По завершении работы макроса свойству EnableCancelKey автоматически присваивается значение xlInterrupt.

Свойство ScreenUpdating. Одним из способов ускорить выполнение программы заключается в том, чтобы присвоить значение False свойству ScreenUpdating. Обычно этот метод применяется для макросов, которые отображают большое количество текста на рабочий лист. Если свойство ScreenUpdating равно False, то при выполнении макроса отключается на экран. В конце процедуры требуется присвоить значение True свойству ScreenUpdating.

В предыдущих версиях Excel свойству ScreenUpdating автоматически присваивалось значение True, а в настоящей версии это необходимо делать вручную. Таким образом, чтобы использовать макросы предыдущих версий в Excel 97, требуется добавить в конец макроса инструкцию, которая восстанавливает значение свойства ScreenUpdating.

Свойство StatusBar. Свойство statusBar позволяет задать текст строки состояния. Рекомендуется применять данное свойство совместно со свойством Cursor:

'Присвоить значение True свойству DisplayStatusBar, чтобы вывести строку состояния.

Application. DisplayStatusBar = True.

'Установка текста строки состояния.

Application.StatusBar = «Обработка, пожалуйста, подождите… «.

'Замена обычного указателя мыши на песочные часы.

Application.Cursor = xlWait.

'Вызов процедуры.

GetSalesData.

'Восстановление указателя мыши и строки состояния.

Application.Cursor = xlDefault.

Application.StatusBar = False.

Свойтсво ThisWorkBook. В этом свойстве хранится ссылка на объект Workbook, являющийся рабочей книгой, в которой содержится выполняемый макрос. Значение этого свойства и свойства ActiveWorkBook не обязательно совпадают. Если в Excel открыто несколько рабочих книг, то возможно, что в свойстве ActiveWorkBook содерится ссылка на одну рабочую книгу, а в свойстве ThisWorkBook — на другую, которая и содержит выполняющийся макрос. Использование методов объекта Application.

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

Метод Calculate. Если в Excel установлен режим вычислений вручную, можно использовать метод Calculate объекта Application для принудительного выполнения вычислений во всех открытых рабочих книгах. Метод имеет следующий синтаксис:

Application.Calculate.

Метод Goto. Метод Goto позволяет выбрать требуемый диапазон или процедуру VBA в любой рабочей книге. Отличие данного метода от рассматриваемого ниже метода Select заключается в том, что метод Goto активизирует связанную с диапазоном или процедурой рабочую книгу, если она не активна. Метод имеет следующий синтаксис:

Application.Goto Reference, Scroll.

Параметр Reference — необязательный аргумент, который используется для указания требуемого диапазона в формате R1C1 или для задания имени процедуры VBA. Если данный параметр опущен, то подставляется последний диапазон, который указывался в методе Goto.

Параметp Scroll также не обязателен. Если он равен True, то после выполнения метода левый верхний угол заданного в методе диапазона выводится в левом верхнем углу окна.

Метод InputBox. Функция inputBox () рассмотрена выше. Метод ох хотя и кажется похожим, на самом деле имеет большие отличия. Функция InputBox () возвращает только строку. Метод InputBox имеет необязательный параметр type, который позволяет задать тип введенных пользователем данных. Метод имеет следующий синтаксис:

Application.InputBox (prompt, title, default, left, top, _ helpFile, helpContextID, type).

Параметр prompt — обязательный аргумент, определяющий сообщение, которое требуется отобразить в окне ввода. Параметр title — дополнительный аргумент, который задает заголовок окна. По умолчанию выводится заголовок «Ввод» (Input). Другим необязательным параметром является аргумент default. Он определяет значение по умолчанию, которое нужно вывести в окне. Параметры left и top — дополнительные параметры, которые определяют положение окна ввода по горизонтали и по вертикали относительно левого верхнего угла экрана. Параметры helpFile и helpContextID — имена файла справки и контекстного идентификатора в этом файле. Аргумент type определяет тип данных, возвращаемый методом. Если аргумент type не задан, то возвращается текст. В качестве значения данного apгумента можно использовать значения, перечисленные в таблице:

Значение.

Тип.

Формула.

Номер

Текст (строка).

Логическое значение (True или False).

Ссылка на ячейки, например, на объект Range.

Значение ошибки, например, #Н/А.

Массив.

Значения параметра type не являются последовательными, поскольку в программе можно использовать их комбинацию. Например, если необходимо задать ввод либо текста, либо чисел, следует присвоить данному параметру значение 1 + 2.

При нажатии кнопки ОК метод InputBox возвращает значение, введенное в окно, при нажатии кнопки Отмена (Cancel) — значение False. Приведем пример использования метода InputBox, в котором показано, как данный макрос реагирует на ввод текста или на нажатие кнопки Отмена:

Sub Input_example ().

Dim hourly_wage As Currency.

Dim num_of_hours As Single.

Dim error_text As String.

'Параметр Type получает значение 1 (число).

hourly_wage = Application. InputBox («Введите ставку почасовой_.

оплаты:", «Почасовая _ оплата», 3.75, 1).

'Обратите внимание на использование значения False.

If hourly_wage = False Then.

MsgBox «Операция отменена.» .

End.

End If.

num_of_hours = Application. InputBox («Введите количество_.

отработанных часов:", _ «Отработанные часы», 40, 1).

If num_of_hours = False Then.

MsgBox «Операция отменена.» .

End sub.

Else.

MsgBox «К оплате «& Format ((num_of_hours *_ hourly_wage), «$##,##0.00»).

End If.

End Sub.

Предупреждение При проверке нажатия кнопки Отмена следует сравнить возвращаемый методом InputBox результат со значением False, а не со строкой «False» .

Методы OnKey, OnRepeat, OnTime и OnUndo. В предыдущих версиях не поддерживались события. Чтобы устранить это ограничение, в объект Application были добавлены методы OnKey, OnRepeat, OnTime и OnUndo. Они обычно используются в процедуре Auto_Open, которая автоматически выполняется при открытии рабочей книги.

Метод OnKey выполняет заданную процедуру при нажатии определенной клавиши или комбинации клавиш. Метод имеет следующий синтаксис:

Application.OnKey Key, Procedure.

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

Код клавиш для метода OnKey.

Клавиша.

Код.

{BACKSPACE} или {BS}.

{BREAK}.

{CAPSLOCK}.

{CLEAR}.

{DELETE} или {DEL}.

{END}.

(цифровая клавиатура).

{ENTER}.

~.

{ESCAPE} или {ESC}.

;

{F1}-{F15}.

{HOME}.

{INSERT}.

<

{LEFT}.

{NUMLOCK}.

{PGDN}.

{PGUP}.

>

{RIGHT}.

{SCROLLLOCK}.

{TAB}.

Если требуется задать сочетание одновременно нажимаемых клавиш, используйте следующие:

Коды специальных клавиш для метода OnKey.

Специальная клавиша.

Код.

Alt или Option.

%.

Shift.

Ctrl.

^.

Параметр Procedure — необязательный строковый аргумент, который определяет имя процедуры, запускаемой при нажатии клавиши или комбинации клавиш. Если требуется отключить исполнение макроса при нажатии комбинации, присвойте данному параметру пустую строку (««). Если требуется восстановить исходную функцию сочетания клавиш, выполните OnKey, не указывая параметр Procedure. Приведем пример использования ОпКеу:

Назначение комбинации клавиш + процедуре GetSalesData.

Application.OnKey «^{RIGHT}», «GetSalesData» .

'Отмена назначения комбинации клавиш +.

Application.ОпКеу «^{RIGHT}», «» .

'Восстановление функции комбинации клавиш +.

Application.OnKey «^{RIGHT}» .

Метод OnRepeat определяет процедуру, которая выполняется при выборе команды ПравкаПовторить (EditRepeat). Метод имеет следующий синтаксис:

Application.OnRepeat Text, Procedure.

Параметр Text — обязательный аргумент, задающий текст команды ПравкаПовторить. Параметр Procedure — обязательный аргумент, содержащий имя процедуры, которая выполняется при выборе команды ПравкаПовторить.

Приведем пример использования данного метода. Следующая инструкция устанавливает текст команды ПравкаПовторить равным «Повторить чтение данных по сбыту» и связывает процедуру GetSalesData с данной командой:

Application.OnRepeat «Повторить чтение данных по сбыту», «SaleData.xls!GetSalesData» .

Метод OnTime позволяет назначить выполнение процедуры на заданное время. Метод имеет следующий синтаксис:

Application.OnTime (EarliestTime, Procedure, LatestTime, Schedule).

Обязательный параметр EarliestTime — момент запуска процедуры. Параметр Procedure также обязателен. Он содержит имя выполняемой процедуры. Следует отметить, что для ввода значения параметра EarliestTime можно использовать функцию TimeValue ().

Если на момент, заданный параметром EarliestTime, Excel не может запустить указанную процедуру из-за того, что выполняет другую операцию, то дополнительный параметр LatestTime определяет последний момент запуска этой процедуры. Если по прошествии указанного времени Excel так и не освободился, то процедура не исполняется.

Параметр Schedule — необязательный аргумент. Если он равен значению True (по умолчанию), то выполнение процедуры откладывается на сутки. Приведем пример использования метода OnTime:

'Выполнение процедуры GetSalesData по прошествии 1 минуты с текущего момента.

Application.OnTime Now + TimeValue («00:01:00»), «GetSalesData» .

'Выполнение процедуры UpdateSalesData в 14:00.

Application.OnTime TimeValue («14:00:00 «), «UpdateSalesData» .

Метод OnUndo позволяет установить текст команды ПравкаОтменить (EditUndo) и связать с этой командой процедуру. Синтаксис метода напоминает синтаксис метода OnRepeat:

Application.OnUndo (Text, Procedure).

Параметр Text устанавливает текст команды Правкатменить. Аргумент Procedure определяет процедуру, связанную с этой командой.

Метод Quit. Чтобы выйти из Excel, не запуская макросы Auto_Close, используется метод Quit объекта Application. При выходе выводится запрос на запись не сохраненных открытых рабочих книг. Метод имеет следующий синтаксис:

Application.Quit.

Примечание.

Если требуется выйти из Excel, не отображая запрос на сохранение открытых рабочих книг, присвойте значение False свойству Application.DisplayAlerts. Однако при этом следует быть крайне осторожным. Не забудьте, что без сохранения закрываются все открытые рабочие книги, и не только открытые вашим приложением.

Использование событий объекта Application.

В предыдущих версиях VBA у каждого объекта поддерживалось только одно событие, в большинстве случаев — событие Click. В VBA 5.0 объекты, включая элемент Application, имеют множество событий. Чтобы обработать событие с помощью объекта Application, необходимо создать новый модуль класса и объявить в нем переменную, используя ключевое слово WithEvents:

Public WithEvents oApp As Application.

Ключевое слово WithEvents определяет, что переменная oApp используется для обработки события объекта. Данное ключевое слово допускается только в модулях класса и описывает только переменные уровня модуля. Теперь требуется связать описанный в модуле класса объект с элементом Application. Это можно сделать в любом модуле, указав следующий код:

'Инструкция Dim располагается в разделе описаний модуля.

'Имя EventClassModule — имя модуля класса.

Dim X As New EventClassModule.

Sub InitializeAppEvents ().

Set X. oApp = Application.

End Sub.

После выполнения процедуры initializeAppEvents объект оАрр в модуле пасса указывает на объект Excel Application, что позволяет использовать процедуры обработки в модуле класса при возникновении событий. Если необходимо включить или отключить обработку событий, в программе следует изменить значение свойства Application.EnableEvents. Если данное свойство имеет значение True, то процедуры обработки доступны.

Ниже описываются некоторые события объекта Application. Следует отметить, что именем объекта для события object_ИмяСобытия (например, object_NewWorkbook) — является имя переменной, которая описана с помощью ключевого слова WithEvents.

Private Sub object_NewWorkbook (ByVal Wb As Workbook).

Параметр Wb — ссылка на рабочую книгу, создание которой вызвало событие.

Событие WorkbookActivate. Событие WorkbookActivate возникает при активизации любой рабочей книги. Процедура обработки события имеет следующий синтаксис:

Private Sub object_WorkbookActivate (ByVal Wb As Workbook).

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

Private Sub oApp_WorkbookActivate (ByVal Wb As Workbook).

Application. Calculate.

End Sub.

Событие WorkbookBeforeClose. Событие WorkbookBeforeClose возникает непосредственно перед закрытием открытой рабочей книги. Синтаксис процедуры обработки является следующим:

Private Sub object_WorkbookBeforeClose (ByVal Wb As Workbook, _ ByVal Cancel As Boolean).

Параметр Wb — ссылка на рабочую книгу, которую требуется закрыть. Параметр Cancel имеет значение False при возникновении события. Если процедура обработки события присваивает значение True данному параметру, то рабочая книга не закрывается по завершении выполнения процедуры. Данное событие используется, например, для выполнения метода Calculate или для исполнения подпрограммы проверки условий на значение:

Private Sub oApp_WorkbookBeforeClose (ByVal Wb As Workbook, ByVal Cancel As Boolean) Application.Calculate.

'Вызов внешней подпрограммы проверки условий на значение.

ValidateEntries.

End Sub.

Событие WorkbookBeforePrint. Событие WorkbookBeforePrint возникает непосредственно перед печатью открытой рабочей книги. Синтаксис процедуры обработки является следующим:

Private Sub object_WorkbookBeforePrint (ByVal Wb As Workbook, _ ByVal Cancel As Boolean).

Параметр Wb — ссылка на рабочую книгу, которую требуется напечатать. Параметр Cancel имеет значение False при возникновении события. Если требуется отменить печать документа, присвойте данному параметру в процедуре обработки значение True.

Событие WorkbookBeforeSave. Событие WorkbookBeforeSave возникает непосредственно перед сохранением открытой рабочей книги. Синтаксис процедуры обработки является следующим:

Private Sub object_WorkbookBeforeSave{ByVal Wb As Workbook, _.

ByVal SaveAsUi As Boolean, ByVal Cancel As Boolean).

Параметр Wb — ссылка на сохраняемую рабочую книгу. Если требуется отобразить диалоговое окно Сохранение документа (Save As), присвойте параметру SaveAsUi значение True. Параметр Cancel имеет значение False при возникновении события. Если требуется отменить сохранение документа, присвойте данному параметру значение True.

Событие WorkbookDeactivate. Событие WorkbookDeactivate возникает, когда открытая рабочая книга теряет фокус. Синтаксис процедуры обработки является следующим:

Private Sub object_WorkbookDeactivate (ByVal Wb As Workbook).

Параметр wb — ссылка на рабочую книгу, которая теряет фокус.

Событие WorkbookNewSheet. Событие WorkbookNewSheet возникает при добавлении нового листа в открытую рабочую книгу. Синтаксис процедуры обработки таков:

Private Sub object_WorkbookNewSheet (ByVal Wb As Workbook, _ ByVal Sh As Object).

Параметр wb — ссылка на рабочую книгу, в которую добавлен лист. Аргумент Sh — вновь созданный лист.

Данное событие можно использовать, чтобы удалить вновь созданный рабочий лист, если количество листов в рабочей книге больше заданного:

Private Sub object_WorkbookNewSheet (ByVal Wb As Workbook, _ ByVal Sh As Object).

If Wb.Worksheets.Count > 6 Then.

MsgBox «Максимальное число листов в рабочей книге равно 5.» .

Wb.Sh.Delete.

End If.

End Sub.

Событие WorkbookOpen. Событие WorkbookOpen возникает при открытии рабочей книги. Синтаксис процедуры обработки является следующим:

Private Sub object__WorkbookOpen (ByVal Wb As Workbook).

Параметр Wb — ссылка на открываемую рабочую книгу.

Показать весь текст
Заполнить форму текущей работой