Если первое сравнение истинно, выполняется оператор
присваивания
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. Цикл ForNext может быть вложенным.
Пример 19.25. Организация циклов с использованием счетчика повторений
Текст программы
Комментарий
591
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
Внутренний цикл по числу столбцов в блоке ячеек
Присваивание текущей ячейке случайного числа
Selection – выбор ячейки
Cells – метод доступа к ячейке с определенными
координатами
Value – свойство "значение"
Next thecol
Конец внутренного цикла
Next therow
Конец внешнего цикла
End Sub
Конец процедуры
Цикл 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
592
<блок операторов> Loop Until <условие>
Условие проверяется в конце, цикл прекращается, когда условие станет истинным. Минимальное число повторений тела цикла – 1.
Пример 19.26. Выполнение логически прерываемых циклов
Текст программы
Комментарий
Option Explicit
Обязательность объявления всех переменных перед их
использованием
Sub Do_Rnd()
Объявление имени процедуры без параметров
Dim a As Single
Объявление переменных
Dim i As Integer,
Randomize
Вызов генератора случайных чисел
Do While True
Начало цикла Do. Задание условия выполнения цикла –
цикл бесконечный
a=Rnd
Присвоение переменной случайного числа
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. Все операции с последовательными файлами реализуются от начала файла: при этом одновременно нельзя читать и писать в последовательный файл.
Файл произвольного доступа имеет записи фиксированной длины: можно одновременно выполнять чтение и запись в файл записей.
593
Открытие файла
Открывать можно как существующие на диске, так и новые файлы. Каждый файл идентифицируется в программе определенным номером, который присваивается ему в момент открытия. Свободный номер файла можно определить с помощью встроенной функции 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)
записи файла определяется встроенной
функцией Len
Open "FILE" For Output Shared As #1
Открытие последовательного файла с
распределенным доступом (любые приложения
могут читать и писать в файл)
Open "FILE" For Binary Access
Открытие двоичного файла для чтения, чтение
Read Lock Read As #1
файла другим приложениям запрещено
Закрытие файла
594
После завершения работы с файлом его закрывают с помощью оператора:
Close [<список_номеров_файлов>]
Если номер закрываемого файла не указан, закрываются все открытые файлы.
Пример 19.28. Закрытие файлов
Close #1; #2; #4
' закрытие файлов, ранее открытых под номерами 1,2,4
Close
' закрытие всех открытых файлов
Запись информации в файл
Существует несколько операторов вывода информации в файл. 1. Печать в последовательный файл
Данный оператор обеспечивает запись форматированного вывода в последовательный файл текстового типа – по аналогии с функцией печати:
Для данных числового типа используется символ точка для десятичной точки. В отличие от оператора Print при записи в файл автоматически вставляются специальные символы-разделители:
запятая – между элементами; двойные кавычки – вокруг символьных данных.
В запись файла вставляется символ возврата каретки (переход на новую строку – запись файла).
Пример 19.30. Запись информации в последовательный файл
3. Вывод данных в файл произвольного доступа Вывод данных выполняется оператором:
Put [#номер_файла; [#записи],<переменная>
где #записи - номер записи для файла произвольного доступа либо номер байта, с которого начинается запись, для двоичного файла. Если номер не указан, используется следующий за последним использованным в операторах
Get, Put, Seek.
Пример 19.31. Запись в файл произвольного доступа
Текст программы
Комментарий
596
Type Record
Объявление пользовательского типа
ID As Integer
данных для записи
Name As String * 20
End Type
Dim MyRecord As Record
Объявление переменной на основе
пользовательского типа данных
Open "TESTFILE" For Random As
Открытие файла произвольного
#1 Len = Len(MyRecord)
доступа с длиной, соответствующей
длине объявленного типа
For RecordNumber = 1 To 5
Организация цикла для записи в файл
MyRecord.ID = RecordNumber
Формирование содержимого записи
MyRecord.Name = "Запись номер
-" & RecordNumber
Put #1, RecordNumber, MyRecord
Непосредственная запись в файл
Next RecordNumber
Конец цикла
Close #1
Закрытие файла
Ввод информации из файла
1. Чтение данных из последовательного файла Чтение выполняется оператором:
Input #номер_файла; <список_переменных>
Двойные кавычки при считывании игнорируются, выполняется проверка соответствия типов данных переменных и файла.
Пример 19.32. Запись в файл произвольного доступа
Текст программы
Комментарий
Open "FILE" For Input As #1
Открытие файла
Do While Not EOF(l)
Цикл до конца файла
Input # 1 ; MyString; MyNumber
Чтение данных записи в переменные
Debug.Print MyString; MyNumber
Печать считанных данных
Loop
Конец цикла
Close #1
Закрытие файла
Другим оператором чтения из последовательного файла является
Line Input #номер_файла; <переменная>
Оператор обеспечивает посимвольное считывание данных строки по файлу до обнаружения символа "возврат каретки" (Chr(13)) и присвоение этих данных указанной переменной символьного типа.
Пример 19.33. Построчное чтение из файла последовательного доступа
Текст программы
Комментарий
Open "TESTFILE" For Input As #1
Открытие файла
Do While Not EOF(l)
Цикл, пока не достигнут конец файла
Line Input #1, TextLine
Чтение строки в переменную
Debug.Print TextLine
Печать в окне Debug
Loop
Конец цикла
Close #1
Закрытие файла
2. Чтение данных из файла произвольного доступа
Данный оператор обеспечивает считывание записи файла произвольного доступа в указанную переменную:
597
Get Put [#номер_файла; [#записи],<переменная>
Пример 19.34. Чтение из файла произвольного доступа
Позиционирование на запись в файле
Позиция в записи (номер байта или номер записи) для очередного чтения или записи в файл устанавливается оператором:
Seek [#] номер_файла; позиция
где позиция – число в диапазоне номеров байтов (1 - 2 147 483 647) файла.
Для файла, открываемого в режиме последовательного доступа, с помощью оператора SEEK определяется байт.
Пример 19.35. Позиционирование в файле последовательного доступа
Текст программы
Комментарий
Dim MyChar As String
Объявление переменной на основе
пользовательского типа данных
Open "FILE" For Input As #1
Открытие файла произвольного доступа с длиной,
соответствующей длине объявленного типа
MaxSize = LOF(l)
Вычисление количества байтов в файле
Дня файла, открываемого в режиме произвольного доступа, определяется очередной номер записи, с которой будет работать программа.
Пример 19.36. Позиционирование в файле произвольного доступа
598
ДИАЛОГОВЫЕ ОКНА
Существует несколько типов диалоговых окон, которые необходимы для поддержания в программе интерактивного режима работы конечного пользователя (вывод сообщений пользователю, прием и интерпретация указаний, введенных пользователем, и др.).
Диалоговые окна для обмена сообщениями
Встроенная функция MsgBox() обеспечивает создание диалоговых окон различных типов. 1. Простое окно-сообщение
MsgBox ("строка_сообщения")
Если в сообщении должно присутствовать значение переменной или элемента массива переменной, элемент структуры пользовательского типа данных и т.п., следует преобразовать значения в строковый тип и обеспечить конкатенацию строк.
Пример 19.37. Вывод сообщения о значении переменной
Текст программы
Комментарий
Option Explicit
Обязательность объявления всех
переменных в модуле перед их
использованием
Sub Msg_Priim()
Объявление процедуры
Dim a As Single
Объявление переменной
Randomize
Запуск генератора случайных чисел
Присвоение переменной значения
a=rnd
случайного числа
MsgBox "Значение
Вывод сообщения
случайного числа " & Str(a)
Конец процедуры
End Sub
В результате выполнения процедуры будет выведено окно (рис. 19.23).
599
Рис. 19.23. Окно-сообщение
2. Окно-сообщение с командными кнопками Общий формат оператора:
- число, являющееся суммой кодов выбранных типов кнопок и
пиктограммы, или имена кнопок;
<заголовок_окна>
- строка символов;
<файл-подсказки>
- имя файла-подсказки для контекстно-зависимой помощи при работе в
окне, строка символов;
<контекст>
- число, которое назначено подсказке для данного окна.
Коды задания командных кнопок и пиктограмм в функции MsgBox() приведены в табл. 19.7. Функция MsgBox() возвращает код (число), соответствующий нажатой кнопке.
Таблица 19.7. Список видов командных кнопок и их кодов
Код
Константа
Описание
Коды командных кнопок
0
vbOKOnly
OK
1
vbOKCancel
OK, Отмена
2
vbAbortRetryIgnore
Прекратить, Повторить, Игнорировать
3
vbYesNoCancel
Да, Нет, Отмена
4
vbYesNo
Да, Нет
5
vbRetryCancel
Повторить, Отмена
Пример 19.38. Формирование диалогового окна с кнопками