Функции пользователя
На языке VBA можно создавать функции пользователя, которые, в отличие от процедуры, возвращают вычисленное значение (одно); оно может участвовать в выражениях оператора присваивания.
Заголовок функции пользователя имеет вид:
Внимание! Для функции указывается тип возвращаемой величины – As <type>. В теле функции используется оператор присваивания вычисленного значения имени функции.
Пример 19.21.Использование пользовательской функции вычисления площади прямоугольника
Текст программы | Комментарий |
Sub Proc_A () Dim S as Single Dim LL as Single Dim HH as Single LL=12 HH=23 S=Sq(LL;H)/2+1200 End Sub Function Sq (H As Single; L As Single As Single) Sq=H*L End Function | Вызывающая процедура Объявление переменных ПЛОЩАДЬ ДЛИНА ВЫСОТА Присвоение значений переменным Формула вызова функции Sq Конец процедуры Объявление функции Sqс аргументами Присвоение функции Sqрезультата вычисления Конец функции |
Управляющие структуры
VBA относится к категории языков структурного программирования и позволяет использовать стандартные управляющие структуры, к которым относятся: условный оператор, альтернативная выборка, циклы.
Условный оператор If.Оператор может использоваться в двух нотациях: в виде простой и блочной структур.
Оператор простой структуры имеет следующий формат записи:
If <выражение> Then <оператор>
Данный оператор обеспечивает проверку выражения (условия). Если условие истинно (True), выполняется простой или составной оператор, следующий за словом Then;если условие ложно (False), управление передается следующему за If оператору.
Составной оператор – последовательность операторов одной строки, разделенных знаком : (двоеточие).
При построении выражения с помощью операторов логического сравнения следует обеспечить однотипность сравниваемых величин.
Пример 19.22.
If MaxPrice > 23,000.00$ Then MaxPrice=23,500.00$
If Student_Card(100).FullName Like "Пе*" Then number=Student_Card(100).Group
При построении выражений используют специальные функции логических проверок VBA.
Логические выражения могут быть построены с помощью стандартных логических функций:
Функция | Описание | Функция | Описание |
Not And Or | Инверсия или отрицание Логическое "И" Логическое "ИЛИ" | Хоr Imp Eqv | Исключающее "Или" Импликация Эквивалентность |
Последовательно выполняется проверка истинности выражений. Если выражение 1 истинно, выполняется блок операторов 1, иначе выполняется проверка истинности выражения 2и т.д.
Если ни одно из выражений не соответствует требованиям истинности, выполняется блок операторов Else,если оно имеется, иначе – оператор, следующий за End If.
Пример 19.23.Организация проверки условия блочной структурой оператора If
Текст программы | Комментарий |
If AvgPrice > 12000 Then DiffPrice=Full(234, 45600) | Проверка условия 1 Если условие 1 истинно, вызов процедуры |
ElseIf AvgPrice > 24000 Then DiffPrice=Full( 12000, 45000) ElseIf AvgPrice > 36000 Then DiffPrice=Full(24000, 50000) Else DiffPrice=Full(36000, 70000) End If | Проверка условия 2 Если условие 2 истинно, вызов процедуры Проверка условия 3 Если условие 3 истинно, вызов процедуры Если условия 1 – 3 не выполняются, вызов процедуры Конец блока If |
Оператор выборки Select Case.Данный оператор применяется в том случае, если во всех логических условиях участвует одна и та же величина (переменная):
Выражение для сравнения может быть записано в виде: Case 45 или Case 3, 4, 5, или Case 5 То 12.
Если ни одно из сравнений не является истинным, выполняется блок операторов Else,если блок Elseотсутствует, управление передается оператору, следующему за End Case.
Пример 19.24.Организация последовательной проверки значения переменной
Текст программы | Комментарий |
Select CDemse | Начало работы оператора Select, объявление имени переменной, для которой выполняются последующие проверки – Demse |
CaseDemse21 | Первое сравнение |
Dem=21 | Если первое сравнение истинно, выполняется оператор присваивания |
Case Demse 22; 25; 28 | Второе сравнение – указан список возможных значений |
Dem=31 | Если второе сравнение истинно, выполняется оператор присваивания |
Case Demse 45 To 48 | Третье сравнение, переменная Cdemse может принимать значения от 45 до 48 |
Dem=41 | Если третье сравнение истинно, выполняется оператор присваивания |
Case Else | Если не выполнилось ни одно из указанных сравнений |
Dem=51 | Выполняется присваивание |
End Case | Конец оператора Select |
Оператор цикла For-Next.Данный оператор относится к категории вычисляемых циклов, когда известно заранее число повторений цикла, заданы начальное, конечное значения и шаг (приращение) изменения начального значения, т.е.:
Для каждого значения переменной этого цикла выполняется блок операторов, расположенных до ключевого слова Next.Затем происходит изменение переменной цикла (увеличение значения на шаг), проверяется полученное значение (не более указанного конечного значения) и повторяется выполнение блока операторов.
Если переменная цикла превысила значение конец, управление передается оператору, следующему за фразой Next.
В теле цикла может присутствовать оператор Exit For.При выполнении этого оператора прекращается цикл и управление также передается оператору, следующему за фразой Next. Цикл For-Nextможет быть вложенным.
Пример 19.25.Организация циклов с использованием счетчика повторений
Текст программы | Комментарий |
Sub stickRandom() Dim numrows As Integer; numcols As Integer Dim therow As Integer; thecol As Integer numrows = Selection.Rows.Count numcols = Selection.Columns.Count Debug. Print numrows; numcols Randomize Debug.Print Rnd For therow = 1 To numrows For thecol = 1 To numcols Selection. Cells(therow; thecol).Value = Rnd Next thecol Next therow End Sub | Объявление имени процедуры Объявление переменных Определение числа строк в выделенном блоке ячеек Определение числа столбцов в выделенном блоке ячеек Печать числа строк и столбцов в выделенном блоке ячеек Генератор случайных чисел Печать случайного числа Внешний цикл по числу строк в блоке ячеек Внутренний цикл по числу столбцов в блоке ячеек Присваивание текущей ячейке случайного числа Selection – выбор ячейки Cells – метод доступа к ячейке с определенными координатами Value – свойство "значение" Конец внутренного цикла Конец внешнего цикла Конец процедуры |
Цикл Do-Loop.Логически управляемый цикл, оператор Do – начало, оператор Loop– конец цикла; имеет 4 модификации:
1) условие True в начале цикла
Do While <условие>
<блок операторов>
Exit Do
<блок операторов>
Loop
Цикл выполняется до тех пор, пока истинно <условие>. Минимальное число повторений тела цикла – 0. Оператор Exit Doпредназначен для прекращения цикла и передачи управления оператору Loop– конец цикла.
2) условие True в конце цикла
Do
<блок операторов>
Exit Do
<блок операторов>
Loop While <условие>
Цикл выполняется хотя бы один раз, в конце выполняется проверка <условия>.
3) условие False в начале цикла
Do Until <условие>
<блок операторов>
Exit Do
<блок операторов>
Loop
Untilуказывает, что цикл выполняется до тех пор, пока <условие> не станет истинным. Минимальное число повторений тела цикла – 0.
4) условие False в конце цикла
Do
<блок операторов>
Exit Do
<блок операторов>
Loop Until <условие>
Условие проверяется в конце, цикл прекращается, когда условие станет истинным. Минимальное число повторений тела цикла – 1.
Пример 19.26.Выполнение логически прерываемых циклов
Текст программы | Комментарий | |
Option Explicit Sub Do_Rnd() Dim a As Single Dim i As Integer, Randomize Do While True a=Rnd | Обязательность объявления всех переменных перед их использованием Объявление имени процедуры без параметров Объявление переменных Вызов генератора случайных чисел Начало цикла Do. Задание условия выполнения цикла – цикл бесконечный Присвоение переменной случайного числа | |
Debug.Print a If a > 0.99 Then Exit Do Loop End Sub | Печать случайного числа Блок условия – при его выполнении выход из цикла Конец цикла Конец процедуры | |
Цикл While-Wend.Данный оператор полностью соответствует структуре Do While-Loop.Отличительной особенностью оператора является невозможность прервать выполнение цикла из тела цикла (Exit Doотсутствует), проверка условия выполняется только в начале цикла.
While <условие>
<блок операторов>
Wend
Цикл For Each.Оператор относится к категории операторов объектного типа, т.е. применяется к массивам (элементам) и наборам объектов. Выполняется фиксированное число раз, число объектов в наборе определяется автоматически. Упорядочение элементов набора – произвольное.
For Each <элемент> In <набор>
<блок операторов>
Exit For
<блок операторов>
где <элемент> представляет собой переменную типа Variant, <набор> – определенный набор объектов. Для прерывания цикла используется оператор Exit For.
РАБОТА С ФАЙЛАМИ
Основные понятия
VBA работает с хранимыми на диске файлами двух типов: последовательного и произвольного доступа.
Последовательный файл – текстовый, который обрабатывается стандартными средствами текстовых редакторов, так как содержит строки символов в формате ANSI. Все операции с последовательными файлами реализуются от начала файла: при этом одновременно нельзя читать и писать в последовательный файл.
Файл произвольного доступа имеет записи фиксированной длины: можно одновременно выполнять чтение и запись в файл записей.
Открытие файла
Открывать можно как существующие на диске, так и новые файлы. Каждый файл идентифицируется в программе определенным номером, который присваивается ему в момент открытия. Свободный номер файла можно определить с помощью встроенной функции FileFree, которая возвращает очередной свободный номер для открытия файла (номер изменяется в диапазоне 1-511).
Файл открывают в определенном режиме работы:
Open <путь_имя_файла> [For <режимы>] [Access <направление_потока>]
[<блокировка>] As [#]номер [Lеn=<длина_записи>]
где <путь_имя_файла> - строка символов, задающая местоположение и имя дискового файла;
<режимы> - режимы работы с файлом:
Append добавление записей
Binary двоичный файл
Input файл для чтения
Output файл для записи
Random файл произвольного доступа;
<направление_потока> - задает тип потока данных по отношению к файлу:
Read только чтение
Write только запись
Read Write чтение и запись одновременно;
<блокировка> - определяет возможность работы с файлом других приложений:
Shared распределенный доступ
Lock Read блокировка файла для чтения
Lock Write блокировка файла для записи
Lock Read Write блокировка файла для чтения и записи;
номер - условный идентификатор файла;
<длина_записи> - указывается для записей фиксированной длины, максимум – 32767
байт. Оптимальная длина записи кратна размеру дискового сектора (512
байт).
Для файлов произвольного доступа объявляется структура записи с помощью оператора Туре;указываются типы и длина компонентов структуры. В режимах Binary, Input, Random под разными номерами можно открыть один и тот же файл, не закрывая ранее открытых; в режимах Append, Output требуется предварительно закрыть ранее открытые файлы.
Пример 19.27. Открытие файлов
Текст программы | Комментарий |
Open "FILE" For Input As #1 Open "FILE" For Binary Access Write As #1 Type Record Define userdefined type ID As Integer Name As String * 20 End Type Dim MyRecord As Record Open "FILE" For Random As #1 Len = Len(MyRecord) Open "FILE" For Output Shared As #1 Open "FILE" For Binary Access Read Lock Read As #1 | Открытие последовательного файла для чтения Открытие двоичного файла только для записи Объявление пользовательского типа данных Открытие файла произвольного доступа. Длина записи файла определяется встроенной функцией Len Открытие последовательного файла с распределенным доступом (любые приложения могут читать и писать в файл) Открытие двоичного файла для чтения, чтение файла другим приложениям запрещено |
Закрытие файла
После завершения работы с файлом его закрывают с помощью оператора:
Close [<список_номеров_файлов>]
Если номер закрываемого файла не указан, закрываются все открытые файлы.
Пример 19.28.Закрытие файлов
Close #1; #2; #4 ' закрытие файлов, ранее открытых под номерами 1,2,4
Close ' закрытие всех открытых файлов
Дата добавления: 2021-12-14; просмотров: 332;