Процедуры записываются в стандартных модулях и на процедурных листах, связанных с объектами проекта. Команда Insert-Procedure вызывает диалог для добавления процедуры в текущий модуль (рис.16.1). Выполнение этого диалога приводит к появлению в тексте модуля двух строк Public Sub MyProc() и End Sub.
(рис 16.1) Добавление процедуры
После записи оператора начала процедуры Sub вручную и нажатия клавиши Enter конец процедуры записывается автоматически. Для переименования процедуры достаточно изменить ее идентификатор в операторе объявления процедуры Sub.
В редакторе VB можно записать любой оператор языка. Удобно воспользоваться справочной системой и скопировать в процедуру примеры, иллюстрирующие выбранную справку. Как и любой язык программирования, VBA имеет свои ключевые слова и синтаксис, нарушение правил которого вызывает ошибки.
Операторы и комментарии записываются в процедурах. Операторы представляют собой команды обработки объектов приложения и команды языка Visual Basic, а комментарии – некоторый свободный текст, который вводится в программу в качестве пояснений. Текст комментария начинается с одинарной кавычки
Операторы записываются на отдельных строках программы. Для разделения операторов, записанных на одной строке, используется знак двоеточия (:). Допускается перенос длинного оператора на следующую строку при помощи символа продолжения строки (_). Для облегчения записи операторов можно использовать разные приемы:
Можно импортировать (команда Import File из меню File) текст модуля из файлов с расширениями .frm (формы), .
Все исполняемые операторы программы размещаются в процедурах. Вне процедур в начале модуля могут находиться только опции (например, Option Explicit), объявления модульных, глобальных переменных и переменных пользовательского типа.
Процедуры представляют собой логические сегменты программы, которые реализуют часть общего алгоритма решения задачи. Процедуры могут вызываться другими процедурами.
При использовании процедур отпадает необходимость дублировать участки программы, заменив их многократным вызовом процедуры, которая выполняет необходимые действия. Можно использовать разработанную процедуру в нескольких проектах. Программы, разбитые на процедуры, легче читаются и легче модифицируются. Легко можно локализовать часть программы, в которой произошла ошибка.
Существуют следующие типы процедур:
В качестве вызываемых процедур применяются процедуры общего типа (подпрограммы) и процедуры-функции. Функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения функции присваивается значение, которое доступно вызвавшей ее процедуре.
Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями объектов. Если установлена связь процедуры с событием объекта приложения, то процедура является событийной. Особенность событийных процедур в том, что они запускаются автоматически, если происходит некоторое событие.
Удобно написать автоматически запускаемые процедуры со специальными именами, например, Auto_Open – процедура, выполняемая при открытии документа.
Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими парными операторами, составляют тело процедуры (функции).
Процедуры определяются только на модульном уровне. Внутри процедуры не может располагаться объявление другой процедуры.
Выход из процедуры обычно происходит естественным образом – при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.
Оператор объявления процедуры присваивает ей имя и перечисляет формальные параметры процедуры. Синтаксис:
[Private|Public][Static] Sub name ([arglist])
Ключевое слово Private определяет закрытую процедуру, т. е. процедуру, доступную только в том модуле, в котором она объявлена. Ключевое слово Public объявляет процедуру открытой, т. е. доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.
Если Private и Public опущены, то процедура считается открытой – Public. Если в модуле присутствует инструкция Option Private, то процедуры этого модуля не доступны вне проекта.
Оператор объявления функции присваивает ей имя, перечисляет ее параметры и устанавливает тип возвращаемого значения. Синтаксис:
[Private|Public][Static] Function name ([arglist]) [As Type]
Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным указанием типа Type возвращаемого функцией значения. Если тип возвращаемого значения не указан, то VBA трактует его как Variant. Определение типа передаваемого значения позволяет повысить эффективность программы.
Для вызова процедуры можно, находясь в окне документа, нажать кнопку Макросы
(рис. 15.10 , рис.16.1) или, находясь в окне VB, выполнить команду Tools-Macros. В новом диалоге (рис.16.2) задается или выбирается имя выполняемого макроса из списка имеющихся макросов. Нажатие на командную кнопку Выполнить этого диалога активизирует выбранную процедуру.
Нажатие стрелки ниже кнопки Макросы, расположенной на вкладке Вид (рис.16.3) высвечивает дополнительные команды, первая из которых также открывает диалог со списком доступных макросов.
Диалог Макросы высвечивается при нажатии кнопки Run Macro
на панели инструментов Visual Basic или Debug (рис. 15.7 или рис. 15.8), если точка вставки не установлена внутри какой-либо процедуры.
(рис 16.2) Выбор запускаемого макроса
(рис 16.3) Команды группы "Макросы"
Любую процедуру, расположенную в стандартном модуле, можно запускать из диалогового окна Макрос. Процедуры, которые расположены на процедурных листах, связанных с объектами рабочей книги или с пользовательскими формами, недоступны в этом окне.
Для быстрого запуска процедуры можно применять "горячие" клавиши (Shortcut), заданные при записи макроса (рис. 15.9 ) или в параметрах процедуры, которые изменяются после нажатия на кнопку Параметры в диалоге на рис.16.2. Это нецифровая клавиша, нажатие на которую в сочетании с клавишей Ctrl запустит макрос. Дополнительно можно использовать клавишу Shift. Не рекомендуется использование комбинаций клавиш, задействованных для других целей, так как новое назначение будет приоритетным и отменит существовавшее ранее.
При задании "горячих" клавиш в макросе автоматически появляется комментарий – сообщение о наличии таких клавиш (например, сообщение вида "сочетание клавиш: Ctrl+t").
Удобно связать макрос или любую процедуру VBA с объектами рабочей книги или рабочего листа. Для запуска макроса можно:
Первая возможность реализуется при помощи настройки панели быстрого доступа
. Можно нажать последнюю пиктограмму этой панели или выбрать категорию Настройка в параметрах MS Excel.
(рис 16.4) Добавление кнопки макроса на панель быстрого доступа
Далее необходимо выбрать из списка команд (список слева) необходимую команду и нажать кнопку Добавить. Команда появится в списке справа, который соответствует кнопкам на панели быстрого доступа. Выбор строки Разделитель разместит на панели вертикальную линию. Добавление строки Макросы поместит одноименную кнопку на панель быстрого доступа. Для размещения кнопки, соответствующей определенному макросу, необходимо раскрыть список Часто используемые команды и выбрать Макросы. Тогда в левом списке появится перечень доступных процедур. Нужно выбрать процедуру и перенести ее в список справа. Для добавления строк в правый список можно использовать двойной щелчок на названии команды или процедуры.
Привязка к графическому объекту выполняется командой Назначить макрос из контекстного меню для объекта. При выборе этой команды открывается диалог с перечнем макросов, аналогичный диалогу на рис.16.2. Можно выбрать макрос и нажать кнопку OK. Дополнительно в этом диалоге можно создать новую процедуру в редакторе VB (кнопка Создать) или записать новый макрос в режиме
Привязка процедуры к кнопке рабочего листа подразумевает выполнение событийной процедуры нажатия на кнопку.
Данные, используемые в процедурах, разделяются на два основных вида: константы и переменные. Для обозначения констант и переменных служит идентификатор (имя). Существуют правила, согласно которым формируются идентификаторы переменных.
Переменная – это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная имеет тип, который соответствует типу данных, сохраняемых в ней.
Константа – постоянное значение, используемое в программе. Символьные константы заключаются в двойные кавычки, а для констант, представляющих даты, вместо кавычек используются символы решетка ("#"). Например, #1.12.2006#.
Константы, которым присвоен идентификатор, применяются в качестве переменных, имеющих постоянные значения. Применение констант улучшает читабельность программы и уменьшает вероятность ошибок при использовании постоянных значений. Синтаксис объявления константы:
Const name=expression, например, Const pi=3.14
В языке имеются встроенные константы, идентификаторы которых зарезервированы. Идентификаторы констант VB начинаются с префикса "vb". Например, для перехода на новую строку часто задействуют константы vbLf, vbCr, vbCrLf.
В дополнение к константам VB используются константы приложения, начальные буквы которых определяются приложением, например, константы Excel VBA начинаются с префикса "xl". Для просмотра полного перечня встроенных констант в Object Browser применяется строка поиска Constants.
Рекомендуется объявлять используемые в программе переменные. Можно привести много аргументов в пользу объявления переменных.
(рис 16.5) Сообщение о необъявленной переменной
Чтобы избежать использования переменных без объявления, достаточно поместить в область Declarations инструкцию Option Explicit. Тогда обращение к не объявленной ранее переменной вызовет сообщение об ошибке компиляции (рис.16.5).
Чтобы принудительно следовать стратегии объявления переменных, в окне команды Tools-Options (рис. 15.4) отмечается опция Require
В VBA, как и в любом языке, используются данные элементарных типов: Boolean, Byte, Integer, Long, Single, Double, Currency, Date,
Переменная может принимать значения только одного типа, который указывается при ее описании или предполагается по умолчанию. Тип переменной накладывает ограничения на ее возможные значения и определяет разрешенные операции. Присвоение переменной значения, не соответствующего ее типу, вызывает преобразование значения или может привести к ошибке.
| Тип данных | Размер в байтах | Разрядность | Диапазон значений |
|---|---|---|---|
| Boolean (логическое) | 2 | 5 | True, False |
| Byte (байт) | 1 | 3 | от 0 до 255 |
| Integer (целое) | 2 | 5 | от –32768 до 32767 |
| Long (длинное целое) | 4 | 10 | от –2147483648 до 2147483647 |
| Single (действительное, одинарная точность) | 4 | 7 | от –3.402823E+38 до –1.401298E-45 и от 1.401298E-45 до 3.402823E+38 |
| Double (действительное, двойная точность) | 8 | 15 | от –1.79769313486232 E+308 до –4.94065645841247E-324 и от 4.94065645841247 E-324 до 1.79769313486232E+308 |
| Currency (фиксированная точка) | 8 | 10 | от –922337203685477.5808 до 922337203685477.5807 |
| Date (дата, время) | 8 | от 01.01.100 до 31.12.9999 | |
| String (символьная строка) | 10 байт + 1 байт на символ для строк переменной длины Длина строки для строк фиксированной длины | до 65400 символов | |
| Object (объект) | 4 | Указатель на любой объект | |
| Variant (любое значение) | 16 байт для числовых значений | См. диапазон значений для Double | |
| 22 байта плюс длина строки для символьных значений | до 65400 символов | ||
| Размер определяется элементами | Разрядность и диапазон каждого элемента, входящего в пользова тельский тип, определяется типом данных элемента | ||
Для объявления переменных используются операторы Dim, Private, Public и Static.
Синтаксис оператора Dim:
Dim VariableName [As DataType]
Например, Dim p As Integer.
Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim.
VBA предусматривает включение в идентификаторы переменных суффиксов, определяющих тип переменной – %, , !, #, @, $. Например, Dim Name$ определяет переменную Name$ как символьную (стринговую).
Операторы объявления переменных относятся к неисполняемым операторам, т. е. они содержат некоторую информацию для VB, не выполняют никаких действий, могут стоять в любом месте программы, но непременно раньше использования определяемой переменной. Рекомендуется объявлять переменные в начале процедуры или модуля, это улучшает читабельность программы.
Локальные переменные могут быть объявлены неявно (контекстуально). Обычно это происходит, если имя переменной присутствует слева в операторе присваивания или используется в качестве переменной цикла. Переменная, объявленная неявно, всегда имеет тип Variant.
Тип Variant применяется для переменных, которые во время выполнения программы могут принимать значения любого типа, за исключением пользовательских типов данных.
При вычислении арифметических выражений переменные типа Variant, содержащие числовые значения, преобразуются в другой тип в сторону увеличения длины результата. Использование переменной типа Variant поглощает больше ресурсов компьютера, чем использование переменной другого
Синтаксис объявления объектной переменной:
Dim varname As type,
Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.
Объектная переменная занимает четыре байта и хранит адрес, указывающий на объект. Обычно в программах используют объектную переменную при создании собственного объекта или в циклах объектного типа.
При работе с объектами часто требуется устанавливать значение объектной переменной. В отличие от переменных других типов присвоение значения объектной переменной выполняется при помощи оператора Set, который только устанавливает ссылку на объект.
Синтаксис оператора:
Set objectvar = objectexpression|Nothing
В качестве объектного выражения можно применять свойство, функцию или метод, возвращающие объект нужного типа. Типы объектного выражения и объектной переменной должны совпадать. Например, Set . Чтобы очистить объектную переменную, в операторе присваивания используется значение Nothing, которое аннулирует ссылку на объект и освобождает ресурсы. Например, Set .
Массив – это совокупность переменных одного типа. Элементы массива имеют одинаковые характеристики (тип, размер и т.д.). Каждому массиву при объявлении присваивается имя – идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается именем массива с индексом, например, A(5), где А – имя массива, 5 – индекс. Другими словами, отдельный элемент массива определяется его позицией (индексом) в массиве. Можно сказать, что массив – это именованная совокупность переменных одного типа, которые различаются значениями своих индексов. Некоторые операторы позволяют осуществлять групповую обработку элементов массива, например, оператор Join. Элементы массива могут участвовать во всех конструкциях языка, в которых допускается использование обычных переменных.
С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массивы (матрицы). Максимальное количество измерений массива – 60. Например, ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12*31*2.
Индекс элемента массива – это число (положительное, отрицательное или 0). Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс – второму и т. д. Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до целого числа.
Значение каждого индекса имеет нижнюю и верхнюю границу. Массив должен быть обязательно объявлен. Синтаксис объявления массива:
Dim varname(subscripts) As type
Для каждого измерения (subscripts) можно указать нижнюю и верхнюю границы индекса (
Рекомендуется предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление Dim A (1 To 5, 2 To 17) определяет двумерный массив A из пяти строк с индексами от 1 до 5 и 16 столбцов с индексами от 2 до 17, всего 80 элементов. Запись A(3,10) указывает на девятый элемент третьей строки.
Если в момент объявления массива неизвестен его размер или же в процессе выполнения программы требуется менять размеры массива, то массив изначально необходимо объявить как динамический. При объявлении динамического массива не указывается его размерность, например, Dim A(). Далее в программе должны быть установлены размеры массива при помощи оператора Redim, синтаксис которого:
ReDim [Preserve] varname (subscripts) [As type]
Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения. Попытка изменения нижней границы индекса приведет к ошибке. При переопределении динамического массива без ключевого слова Preserve все элементы массива уничтожаются. Если размерность массива увеличивается, то включение Preserve в оператор ReDim сохраняет существующие элементы массива. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива, теряются.
Для определения границ динамического массива применяются функции LBound и UBound . Синтаксис:
LBound (arrayname [,dimension]) UBound (arrayname [,dimension])
Пользовательский тип (
(рис 16.6) Объявление переменной пользовательского типа
Определяемые пользователем типы данных могут включать в себя один или несколько элементов любого типа данных, в том числе массивы и
Обращение к элементу структуры осуществляется при помощи составного имени для исключения неоднозначности. Полное
Для структур в целом применимы только операторы присваивания, элементы структур можно использовать в выражениях, соответствующих типу элемента. Например, оператор Dim arr As sqn определяет переменную arr приведенного на рис.16.6 пользовательского типа данных sqn, состоящую из двух элементов. В следующих операторах обращение к элементам структуры выполнено с указанием названия переменной arr:
arr.sqn_unity = d arr.sqn_zero = d^2arr.sqn_unity
Все переменные обладают областью видимости и временем жизни. Область видимости переменной – это процедуры, в которых переменная может быть использована, т. е. процедуры, в которых доступно значение переменной. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры и носят название локальных переменных (Local). Область видимости таких переменных – конкретная процедура.
Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными, и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
Модульные и глобальные переменные должны быть описаны явно в области Declarations.
| Уровень объявления | Оператор объявления | Переменная | Область видимости |
|---|---|---|---|
| Процедура | Dim, Private | Локальная | Процедура |
| Уровень модуля | Dim, Private | Модульная | Все процедуры модуля |
| Уровень модуля в стандартном модуле (Module) | Public | Глобальная | Все процедуры проекта |
| Уровень модуля – обработчика событий | Public | Модульная | Все процедуры процедурного листа, в котором переменная объявлена |
Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами, в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.
Время жизни – это тот период, в течение которого значение переменной сохраняется. Локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение – Visual Basic "забывает" значения локальных переменных. Время жизни локальной переменной – процедура. Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены. Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, в которой она так объявлена, т. е. продлить время ее жизни. При выходе из этой процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в данную процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из этой процедуры. Время жизни статической переменной – модуль, в котором определена процедура, объявившая эту переменную.
Объявление Static может быть указано только для локальных переменных. Если ключевое слово Static использовано при объявлении процедуры или включена опция All
При входе в процедуру локальные переменные (за исключением переменных, объявленных как Static) автоматически получают начальные значения в соответствии с типом переменной (см. таблицу 16.4). Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные – при первом входе в процедуру, в которой они объявлены. На практике для того, чтобы избежать неясностей, рекомендуется явным образом инициализировать переменную (присваивать ей начальное значение), прежде чем использовать ее в выражении.
| Тип | Начальное значение |
|---|---|
| Integer, Long, Single, Double | 0 |
| String (переменная длина) | Пустая строка (кол-во символов равно нулю) |
| String (фиксированная длина) | Заполняется символами, имеющими нулевой ASCII-код, иными словами Chr(0) |
| Variant | Empty |
| Object | Nothing |
Как было сказано ранее, любая процедура – это последовательность операторов. Стандартный порядок выполнения операторов – последовательный, сверху-вниз или слева-направо, если несколько операторов записаны в одной строке и разделены двоеточием. Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности
Управляющие операторы ограничивают
Оператор организует ветвление программы, т. е. выполнение различных действий в зависимости от истинности условия. Это может быть условие, налагаемое на значения переменных, или условие относительно текущего состояния приложения. Например, если необходим ввод данных в ячейки таблицы Excel и окно приложения "спрятано", то его необходимо отобразить.
Условный оператор может быть записан в одну строку или блоком. Возможно использование вложенных условных операторов.
Синтаксис оператора при записи в строку:
If condition Then [statements] [Else elsestatements]
Например, оператор IF salary <9000 Then social=salary*0.2 вычисляет выплату, если зарплата менее 9000.
Синтаксис оператора при записи блоком (пример см. рис.16.7):
If condition-1 Then [statements] [ElseIf condition-2 Then [elseifstatements-2] .. [Else [elsestatements]] End If
Если условие (condition) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements. Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.
После выполнения одной последовательности операторов управление передается оператору, следующему за условным оператором, а в случае блочной структуры – за End If. Оператор End If обязателен при записи условного оператора блоком и не используется при записи условного оператора в строку.
(рис 16.7) Блочная структура условного оператора
Приведенный на рис.16.7 оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.
При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case. Оператор Select Case – это оператор выбора ветви в зависимости от значения тестируемого выражения.
Синтаксис оператора:
Select Case testexpression Case expressionlist-n statements-n ... Case Else Elsestatements End Select
Значения списка могут быть представлены константами или выражениями c числовыми или символьными значениями. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:
Тестируемое выражение может быть задано формулой. По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.
После выполнения выбранной последовательности операторов соответствие тестируемого выражения другим спискам значений не проверяется, и управление передается оператору, следующему за End Select.
На рис.16.8 условный оператор, приведенный на рис.16.7, записан при помощи оператора Select Case.
(рис 16.8) Оператор выбора Select Case
Повтор действий в процедурах достигается при помощи организации циклов. Цикл – это многократно повторяемая последовательность операторов. Существуют различные способы организации циклов, но во всех способах есть:
Условие выхода из цикла может располагаться в начале или в конце цикла. Нормальный выход из цикла производится, когда выполнено это условие. Внутри цикла можно задать дополнительные условия выхода из цикла и использовать операторы немедленного завершения цикла. После выхода из цикла управление передается оператору, следующему за оператором окончания цикла.
Нельзя передавать управление внутрь цикла и из цикла к оператору, расположенному вне цикла.
В языке Visual Basic применяется несколько форм операторов цикла. Одни и те же действия по повтору команд можно записать различными способами, но в разных ситуациях удобнее использовать определенные способы организации циклов:
Оператор используется для организации вычисляемого цикла (
Синтаксис оператора:
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]
На рис.16.9 приведен пример оператора вычисляемого цикла, в котором подсчитывается сумма первых десяти натуральных чисел. При первом входе в цикл счетчик цикла устанавливается в начальное значение (start=1). При каждом повторе к счетчику цикла прибавляется шаг цикла (step, по умолчанию 1). Как только значение переменной цикла превысит конечное значение (end=10), цикл завершается. Можно подсчитать, сколько раз выполнится цикл. Например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.
(рис 16.9) Вычисляемый цикл
Счетчик цикла – числовая переменная, которая обычно участвует в вычислениях внутри цикла. По окончании цикла значение счетчика равно конечному значению плюс шаг цикла при нормальном завершении цикла, т. е. если не было принудительного выхода из цикла по условию.
Параметры цикла start, end, step могут быть заданы числами, числовыми переменными или числовыми выражениями. Параметры цикла вычисляются при входе в цикл и не изменяются во время выполнения цикла, даже если меняются переменные, влияющие на эти значения. Параметры цикла могут иметь положительные и отрицательные значения.
Цикл объектного типа используется для массивов или коллекций объектов. Циклы объектного типа повторяют последовательность операторов ровно столько раз, сколько элементов содержится в массиве или в коллекции. В отличие от вычисляемого цикла переменная цикла не является счетчиком цикла, а содержит значение элемента массива или ссылку на объект из коллекции объектов.
Синтаксис оператора:
For Each element In group [statements] [Exit For] [statements] Next [element]
Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant. Если цикл записан для коллекции объектов, то тип переменной element – Object, или должен совпадать с типом элементов коллекции объектов. Не рекомендуется внутри цикла изменять количество элементов массива или коллекции, так как команды тела цикла могут не обработать новый
На рис.16.10 в цикле суммируются ячейки интервала A1:B10.
(рис 16.10) Цикл объектного типа
Этот цикл является логически прерываемым циклом. Цикл повторяет набор инструкций, пока выполнено некоторое условие. Такую форму цикла чаще всего применяют в условиях неопределенности, когда нельзя заранее установить, сколько раз потребуется повторять действия, например, если заранее не известно, скольким сотрудникам следует рассчитать зарплату.
Синтаксис оператора:
Do [(While|Until) condition] [statements] [Exit Do] [statements] Loop [(While|Until) condition]
По сути, оператор имеет пять вариантов синтаксиса: запись условия While|Untilперед входом в цикл (предусловие), запись условия While|Until1 в конце цикла (постусловие) и запись оператора без задания условия. В последнем случае в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен присутствовать оператор немедленного выхода из цикла Exit Do (рис.16.11).
Если условие выполнения цикла нарушено при входе в цикл, то в случае предусловия тело цикла не выполнится ни разу, а в случае постусловия операторы тела цикла выполнятся один раз.
Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
(рис 16.11) Выход из цикла Do … Loop при помощи оператора Exit Do
На рис.16.11 представлена процедура и результат расчета суммы социальных выплат. Предполагается, что данные о зарплате размещены в ячейках колонки A. Цикл выполняется, пока очередная ячейка не окажется пустой или нулевой.
Выход из цикла производится оператором Exit Do. Процедура на рис.16.12 выполняет те же действия, но в операторе цикла задано предусловие с ключевым словом While.
Этот способ организации цикла повторяет команды тела цикла, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора (сравни рис.16.12 и рис.16.13). При таком способе организации цикла не применяется оператор немедленного завершения цикла.
(рис 16.12) Оператор цикла Do…Loop с предусловием
Синтаксис оператора:
While condition Statements Wend
(рис 16.13) Оператор цикла While…Wend
Процедуры записываются в стандартных модулях и на процедурных листах, связанных с объектами проекта. Команда Insert-Procedure вызывает диалог для добавления процедуры в текущий модуль (рис.16.1). Выполнение этого диалога приводит к появлению в тексте модуля двух строк Public Sub MyProc() и End Sub.
(рис 16.1) Добавление процедуры
После записи оператора начала процедуры Sub вручную и нажатия клавиши Enter конец процедуры записывается автоматически. Для переименования процедуры достаточно изменить ее идентификатор в операторе объявления процедуры Sub.
В редакторе VB можно записать любой оператор языка. Удобно воспользоваться справочной системой и скопировать в процедуру примеры, иллюстрирующие выбранную справку. Как и любой язык программирования, VBA имеет свои ключевые слова и синтаксис, нарушение правил которого вызывает ошибки.
Операторы и комментарии записываются в процедурах. Операторы представляют собой команды обработки объектов приложения и команды языка Visual Basic, а комментарии – некоторый свободный текст, который вводится в программу в качестве пояснений. Текст комментария начинается с одинарной кавычки
Операторы записываются на отдельных строках программы. Для разделения операторов, записанных на одной строке, используется знак двоеточия (:). Допускается перенос длинного оператора на следующую строку при помощи символа продолжения строки (_). Для облегчения записи операторов можно использовать разные приемы:
Можно импортировать (команда Import File из меню File) текст модуля из файлов с расширениями .frm (формы), .
Все исполняемые операторы программы размещаются в процедурах. Вне процедур в начале модуля могут находиться только опции (например, Option Explicit), объявления модульных, глобальных переменных и переменных пользовательского типа.
Процедуры представляют собой логические сегменты программы, которые реализуют часть общего алгоритма решения задачи. Процедуры могут вызываться другими процедурами.
При использовании процедур отпадает необходимость дублировать участки программы, заменив их многократным вызовом процедуры, которая выполняет необходимые действия. Можно использовать разработанную процедуру в нескольких проектах. Программы, разбитые на процедуры, легче читаются и легче модифицируются. Легко можно локализовать часть программы, в которой произошла ошибка.
Существуют следующие типы процедур:
В качестве вызываемых процедур применяются процедуры общего типа (подпрограммы) и процедуры-функции. Функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения функции присваивается значение, которое доступно вызвавшей ее процедуре.
Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями объектов. Если установлена связь процедуры с событием объекта приложения, то процедура является событийной. Особенность событийных процедур в том, что они запускаются автоматически, если происходит некоторое событие.
Удобно написать автоматически запускаемые процедуры со специальными именами, например, Auto_Open – процедура, выполняемая при открытии документа.
Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими парными операторами, составляют тело процедуры (функции).
Процедуры определяются только на модульном уровне. Внутри процедуры не может располагаться объявление другой процедуры.
Выход из процедуры обычно происходит естественным образом – при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.
Оператор объявления процедуры присваивает ей имя и перечисляет формальные параметры процедуры. Синтаксис:
[Private|Public][Static] Sub name ([arglist])
Ключевое слово Private определяет закрытую процедуру, т. е. процедуру, доступную только в том модуле, в котором она объявлена. Ключевое слово Public объявляет процедуру открытой, т. е. доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.
Если Private и Public опущены, то процедура считается открытой – Public. Если в модуле присутствует инструкция Option Private, то процедуры этого модуля не доступны вне проекта.
Оператор объявления функции присваивает ей имя, перечисляет ее параметры и устанавливает тип возвращаемого значения. Синтаксис:
[Private|Public][Static] Function name ([arglist]) [As Type]
Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным указанием типа Type возвращаемого функцией значения. Если тип возвращаемого значения не указан, то VBA трактует его как Variant. Определение типа передаваемого значения позволяет повысить эффективность программы.
Для вызова процедуры можно, находясь в окне документа, нажать кнопку Макросы
(рис. 15.10 , рис.16.1) или, находясь в окне VB, выполнить команду Tools-Macros. В новом диалоге (рис.16.2) задается или выбирается имя выполняемого макроса из списка имеющихся макросов. Нажатие на командную кнопку Выполнить этого диалога активизирует выбранную процедуру.
Нажатие стрелки ниже кнопки Макросы, расположенной на вкладке Вид (рис.16.3) высвечивает дополнительные команды, первая из которых также открывает диалог со списком доступных макросов.
Диалог Макросы высвечивается при нажатии кнопки Run Macro
на панели инструментов Visual Basic или Debug (рис. 15.7 или рис. 15.8), если точка вставки не установлена внутри какой-либо процедуры.
(рис 16.2) Выбор запускаемого макроса
(рис 16.3) Команды группы "Макросы"
Любую процедуру, расположенную в стандартном модуле, можно запускать из диалогового окна Макрос. Процедуры, которые расположены на процедурных листах, связанных с объектами рабочей книги или с пользовательскими формами, недоступны в этом окне.
Для быстрого запуска процедуры можно применять "горячие" клавиши (Shortcut), заданные при записи макроса (рис. 15.9 ) или в параметрах процедуры, которые изменяются после нажатия на кнопку Параметры в диалоге на рис.16.2. Это нецифровая клавиша, нажатие на которую в сочетании с клавишей Ctrl запустит макрос. Дополнительно можно использовать клавишу Shift. Не рекомендуется использование комбинаций клавиш, задействованных для других целей, так как новое назначение будет приоритетным и отменит существовавшее ранее.
При задании "горячих" клавиш в макросе автоматически появляется комментарий – сообщение о наличии таких клавиш (например, сообщение вида "сочетание клавиш: Ctrl+t").
Удобно связать макрос или любую процедуру VBA с объектами рабочей книги или рабочего листа. Для запуска макроса можно:
Первая возможность реализуется при помощи настройки панели быстрого доступа
. Можно нажать последнюю пиктограмму этой панели или выбрать категорию Настройка в параметрах MS Excel.
(рис 16.4) Добавление кнопки макроса на панель быстрого доступа
Далее необходимо выбрать из списка команд (список слева) необходимую команду и нажать кнопку Добавить. Команда появится в списке справа, который соответствует кнопкам на панели быстрого доступа. Выбор строки Разделитель разместит на панели вертикальную линию. Добавление строки Макросы поместит одноименную кнопку на панель быстрого доступа. Для размещения кнопки, соответствующей определенному макросу, необходимо раскрыть список Часто используемые команды и выбрать Макросы. Тогда в левом списке появится перечень доступных процедур. Нужно выбрать процедуру и перенести ее в список справа. Для добавления строк в правый список можно использовать двойной щелчок на названии команды или процедуры.
Привязка к графическому объекту выполняется командой Назначить макрос из контекстного меню для объекта. При выборе этой команды открывается диалог с перечнем макросов, аналогичный диалогу на рис.16.2. Можно выбрать макрос и нажать кнопку OK. Дополнительно в этом диалоге можно создать новую процедуру в редакторе VB (кнопка Создать) или записать новый макрос в режиме
Привязка процедуры к кнопке рабочего листа подразумевает выполнение событийной процедуры нажатия на кнопку.
Данные, используемые в процедурах, разделяются на два основных вида: константы и переменные. Для обозначения констант и переменных служит идентификатор (имя). Существуют правила, согласно которым формируются идентификаторы переменных.
Переменная – это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная имеет тип, который соответствует типу данных, сохраняемых в ней.
Константа – постоянное значение, используемое в программе. Символьные константы заключаются в двойные кавычки, а для констант, представляющих даты, вместо кавычек используются символы решетка ("#"). Например, #1.12.2006#.
Константы, которым присвоен идентификатор, применяются в качестве переменных, имеющих постоянные значения. Применение констант улучшает читабельность программы и уменьшает вероятность ошибок при использовании постоянных значений. Синтаксис объявления константы:
Const name=expression, например, Const pi=3.14
В языке имеются встроенные константы, идентификаторы которых зарезервированы. Идентификаторы констант VB начинаются с префикса "vb". Например, для перехода на новую строку часто задействуют константы vbLf, vbCr, vbCrLf.
В дополнение к константам VB используются константы приложения, начальные буквы которых определяются приложением, например, константы Excel VBA начинаются с префикса "xl". Для просмотра полного перечня встроенных констант в Object Browser применяется строка поиска Constants.
Рекомендуется объявлять используемые в программе переменные. Можно привести много аргументов в пользу объявления переменных.
(рис 16.5) Сообщение о необъявленной переменной
Чтобы избежать использования переменных без объявления, достаточно поместить в область Declarations инструкцию Option Explicit. Тогда обращение к не объявленной ранее переменной вызовет сообщение об ошибке компиляции (рис.16.5).
Чтобы принудительно следовать стратегии объявления переменных, в окне команды Tools-Options (рис. 15.4) отмечается опция Require
В VBA, как и в любом языке, используются данные элементарных типов: Boolean, Byte, Integer, Long, Single, Double, Currency, Date,
Переменная может принимать значения только одного типа, который указывается при ее описании или предполагается по умолчанию. Тип переменной накладывает ограничения на ее возможные значения и определяет разрешенные операции. Присвоение переменной значения, не соответствующего ее типу, вызывает преобразование значения или может привести к ошибке.
| Тип данных | Размер в байтах | Разрядность | Диапазон значений |
|---|---|---|---|
| Boolean (логическое) | 2 | 5 | True, False |
| Byte (байт) | 1 | 3 | от 0 до 255 |
| Integer (целое) | 2 | 5 | от –32768 до 32767 |
| Long (длинное целое) | 4 | 10 | от –2147483648 до 2147483647 |
| Single (действительное, одинарная точность) | 4 | 7 | от –3.402823E+38 до –1.401298E-45 и от 1.401298E-45 до 3.402823E+38 |
| Double (действительное, двойная точность) | 8 | 15 | от –1.79769313486232 E+308 до –4.94065645841247E-324 и от 4.94065645841247 E-324 до 1.79769313486232E+308 |
| Currency (фиксированная точка) | 8 | 10 | от –922337203685477.5808 до 922337203685477.5807 |
| Date (дата, время) | 8 | от 01.01.100 до 31.12.9999 | |
| String (символьная строка) | 10 байт + 1 байт на символ для строк переменной длины Длина строки для строк фиксированной длины | до 65400 символов | |
| Object (объект) | 4 | Указатель на любой объект | |
| Variant (любое значение) | 16 байт для числовых значений | См. диапазон значений для Double | |
| 22 байта плюс длина строки для символьных значений | до 65400 символов | ||
| Размер определяется элементами | Разрядность и диапазон каждого элемента, входящего в пользова тельский тип, определяется типом данных элемента | ||
Для объявления переменных используются операторы Dim, Private, Public и Static.
Синтаксис оператора Dim:
Dim VariableName [As DataType]
Например, Dim p As Integer.
Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim.
VBA предусматривает включение в идентификаторы переменных суффиксов, определяющих тип переменной – %, , !, #, @, $. Например, Dim Name$ определяет переменную Name$ как символьную (стринговую).
Операторы объявления переменных относятся к неисполняемым операторам, т. е. они содержат некоторую информацию для VB, не выполняют никаких действий, могут стоять в любом месте программы, но непременно раньше использования определяемой переменной. Рекомендуется объявлять переменные в начале процедуры или модуля, это улучшает читабельность программы.
Локальные переменные могут быть объявлены неявно (контекстуально). Обычно это происходит, если имя переменной присутствует слева в операторе присваивания или используется в качестве переменной цикла. Переменная, объявленная неявно, всегда имеет тип Variant.
Тип Variant применяется для переменных, которые во время выполнения программы могут принимать значения любого типа, за исключением пользовательских типов данных.
При вычислении арифметических выражений переменные типа Variant, содержащие числовые значения, преобразуются в другой тип в сторону увеличения длины результата. Использование переменной типа Variant поглощает больше ресурсов компьютера, чем использование переменной другого
Синтаксис объявления объектной переменной:
Dim varname As type,
Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.
Объектная переменная занимает четыре байта и хранит адрес, указывающий на объект. Обычно в программах используют объектную переменную при создании собственного объекта или в циклах объектного типа.
При работе с объектами часто требуется устанавливать значение объектной переменной. В отличие от переменных других типов присвоение значения объектной переменной выполняется при помощи оператора Set, который только устанавливает ссылку на объект.
Синтаксис оператора:
Set objectvar = objectexpression|Nothing
В качестве объектного выражения можно применять свойство, функцию или метод, возвращающие объект нужного типа. Типы объектного выражения и объектной переменной должны совпадать. Например, Set . Чтобы очистить объектную переменную, в операторе присваивания используется значение Nothing, которое аннулирует ссылку на объект и освобождает ресурсы. Например, Set .
Массив – это совокупность переменных одного типа. Элементы массива имеют одинаковые характеристики (тип, размер и т.д.). Каждому массиву при объявлении присваивается имя – идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается именем массива с индексом, например, A(5), где А – имя массива, 5 – индекс. Другими словами, отдельный элемент массива определяется его позицией (индексом) в массиве. Можно сказать, что массив – это именованная совокупность переменных одного типа, которые различаются значениями своих индексов. Некоторые операторы позволяют осуществлять групповую обработку элементов массива, например, оператор Join. Элементы массива могут участвовать во всех конструкциях языка, в которых допускается использование обычных переменных.
С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массивы (матрицы). Максимальное количество измерений массива – 60. Например, ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12*31*2.
Индекс элемента массива – это число (положительное, отрицательное или 0). Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс – второму и т. д. Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до целого числа.
Значение каждого индекса имеет нижнюю и верхнюю границу. Массив должен быть обязательно объявлен. Синтаксис объявления массива:
Dim varname(subscripts) As type
Для каждого измерения (subscripts) можно указать нижнюю и верхнюю границы индекса (
Рекомендуется предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление Dim A (1 To 5, 2 To 17) определяет двумерный массив A из пяти строк с индексами от 1 до 5 и 16 столбцов с индексами от 2 до 17, всего 80 элементов. Запись A(3,10) указывает на девятый элемент третьей строки.
Если в момент объявления массива неизвестен его размер или же в процессе выполнения программы требуется менять размеры массива, то массив изначально необходимо объявить как динамический. При объявлении динамического массива не указывается его размерность, например, Dim A(). Далее в программе должны быть установлены размеры массива при помощи оператора Redim, синтаксис которого:
ReDim [Preserve] varname (subscripts) [As type]
Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения. Попытка изменения нижней границы индекса приведет к ошибке. При переопределении динамического массива без ключевого слова Preserve все элементы массива уничтожаются. Если размерность массива увеличивается, то включение Preserve в оператор ReDim сохраняет существующие элементы массива. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива, теряются.
Для определения границ динамического массива применяются функции LBound и UBound . Синтаксис:
LBound (arrayname [,dimension]) UBound (arrayname [,dimension])
Пользовательский тип (
(рис 16.6) Объявление переменной пользовательского типа
Определяемые пользователем типы данных могут включать в себя один или несколько элементов любого типа данных, в том числе массивы и
Обращение к элементу структуры осуществляется при помощи составного имени для исключения неоднозначности. Полное
Для структур в целом применимы только операторы присваивания, элементы структур можно использовать в выражениях, соответствующих типу элемента. Например, оператор Dim arr As sqn определяет переменную arr приведенного на рис.16.6 пользовательского типа данных sqn, состоящую из двух элементов. В следующих операторах обращение к элементам структуры выполнено с указанием названия переменной arr:
arr.sqn_unity = d arr.sqn_zero = d^2arr.sqn_unity
Все переменные обладают областью видимости и временем жизни. Область видимости переменной – это процедуры, в которых переменная может быть использована, т. е. процедуры, в которых доступно значение переменной. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры и носят название локальных переменных (Local). Область видимости таких переменных – конкретная процедура.
Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными, и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
Модульные и глобальные переменные должны быть описаны явно в области Declarations.
| Уровень объявления | Оператор объявления | Переменная | Область видимости |
|---|---|---|---|
| Процедура | Dim, Private | Локальная | Процедура |
| Уровень модуля | Dim, Private | Модульная | Все процедуры модуля |
| Уровень модуля в стандартном модуле (Module) | Public | Глобальная | Все процедуры проекта |
| Уровень модуля – обработчика событий | Public | Модульная | Все процедуры процедурного листа, в котором переменная объявлена |
Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами, в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.
Время жизни – это тот период, в течение которого значение переменной сохраняется. Локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение – Visual Basic "забывает" значения локальных переменных. Время жизни локальной переменной – процедура. Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены. Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, в которой она так объявлена, т. е. продлить время ее жизни. При выходе из этой процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в данную процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из этой процедуры. Время жизни статической переменной – модуль, в котором определена процедура, объявившая эту переменную.
Объявление Static может быть указано только для локальных переменных. Если ключевое слово Static использовано при объявлении процедуры или включена опция All
При входе в процедуру локальные переменные (за исключением переменных, объявленных как Static) автоматически получают начальные значения в соответствии с типом переменной (см. таблицу 16.4). Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные – при первом входе в процедуру, в которой они объявлены. На практике для того, чтобы избежать неясностей, рекомендуется явным образом инициализировать переменную (присваивать ей начальное значение), прежде чем использовать ее в выражении.
| Тип | Начальное значение |
|---|---|
| Integer, Long, Single, Double | 0 |
| String (переменная длина) | Пустая строка (кол-во символов равно нулю) |
| String (фиксированная длина) | Заполняется символами, имеющими нулевой ASCII-код, иными словами Chr(0) |
| Variant | Empty |
| Object | Nothing |
Как было сказано ранее, любая процедура – это последовательность операторов. Стандартный порядок выполнения операторов – последовательный, сверху-вниз или слева-направо, если несколько операторов записаны в одной строке и разделены двоеточием. Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности
Управляющие операторы ограничивают
Оператор организует ветвление программы, т. е. выполнение различных действий в зависимости от истинности условия. Это может быть условие, налагаемое на значения переменных, или условие относительно текущего состояния приложения. Например, если необходим ввод данных в ячейки таблицы Excel и окно приложения "спрятано", то его необходимо отобразить.
Условный оператор может быть записан в одну строку или блоком. Возможно использование вложенных условных операторов.
Синтаксис оператора при записи в строку:
If condition Then [statements] [Else elsestatements]
Например, оператор IF salary <9000 Then social=salary*0.2 вычисляет выплату, если зарплата менее 9000.
Синтаксис оператора при записи блоком (пример см. рис.16.7):
If condition-1 Then [statements] [ElseIf condition-2 Then [elseifstatements-2] .. [Else [elsestatements]] End If
Если условие (condition) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements. Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.
После выполнения одной последовательности операторов управление передается оператору, следующему за условным оператором, а в случае блочной структуры – за End If. Оператор End If обязателен при записи условного оператора блоком и не используется при записи условного оператора в строку.
(рис 16.7) Блочная структура условного оператора
Приведенный на рис.16.7 оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.
При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case. Оператор Select Case – это оператор выбора ветви в зависимости от значения тестируемого выражения.
Синтаксис оператора:
Select Case testexpression Case expressionlist-n statements-n ... Case Else Elsestatements End Select
Значения списка могут быть представлены константами или выражениями c числовыми или символьными значениями. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:
Тестируемое выражение может быть задано формулой. По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.
После выполнения выбранной последовательности операторов соответствие тестируемого выражения другим спискам значений не проверяется, и управление передается оператору, следующему за End Select.
На рис.16.8 условный оператор, приведенный на рис.16.7, записан при помощи оператора Select Case.
(рис 16.8) Оператор выбора Select Case
Повтор действий в процедурах достигается при помощи организации циклов. Цикл – это многократно повторяемая последовательность операторов. Существуют различные способы организации циклов, но во всех способах есть:
Условие выхода из цикла может располагаться в начале или в конце цикла. Нормальный выход из цикла производится, когда выполнено это условие. Внутри цикла можно задать дополнительные условия выхода из цикла и использовать операторы немедленного завершения цикла. После выхода из цикла управление передается оператору, следующему за оператором окончания цикла.
Нельзя передавать управление внутрь цикла и из цикла к оператору, расположенному вне цикла.
В языке Visual Basic применяется несколько форм операторов цикла. Одни и те же действия по повтору команд можно записать различными способами, но в разных ситуациях удобнее использовать определенные способы организации циклов:
Оператор используется для организации вычисляемого цикла (
Синтаксис оператора:
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]
На рис.16.9 приведен пример оператора вычисляемого цикла, в котором подсчитывается сумма первых десяти натуральных чисел. При первом входе в цикл счетчик цикла устанавливается в начальное значение (start=1). При каждом повторе к счетчику цикла прибавляется шаг цикла (step, по умолчанию 1). Как только значение переменной цикла превысит конечное значение (end=10), цикл завершается. Можно подсчитать, сколько раз выполнится цикл. Например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.
(рис 16.9) Вычисляемый цикл
Счетчик цикла – числовая переменная, которая обычно участвует в вычислениях внутри цикла. По окончании цикла значение счетчика равно конечному значению плюс шаг цикла при нормальном завершении цикла, т. е. если не было принудительного выхода из цикла по условию.
Параметры цикла start, end, step могут быть заданы числами, числовыми переменными или числовыми выражениями. Параметры цикла вычисляются при входе в цикл и не изменяются во время выполнения цикла, даже если меняются переменные, влияющие на эти значения. Параметры цикла могут иметь положительные и отрицательные значения.
Цикл объектного типа используется для массивов или коллекций объектов. Циклы объектного типа повторяют последовательность операторов ровно столько раз, сколько элементов содержится в массиве или в коллекции. В отличие от вычисляемого цикла переменная цикла не является счетчиком цикла, а содержит значение элемента массива или ссылку на объект из коллекции объектов.
Синтаксис оператора:
For Each element In group [statements] [Exit For] [statements] Next [element]
Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant. Если цикл записан для коллекции объектов, то тип переменной element – Object, или должен совпадать с типом элементов коллекции объектов. Не рекомендуется внутри цикла изменять количество элементов массива или коллекции, так как команды тела цикла могут не обработать новый
На рис.16.10 в цикле суммируются ячейки интервала A1:B10.
(рис 16.10) Цикл объектного типа
Этот цикл является логически прерываемым циклом. Цикл повторяет набор инструкций, пока выполнено некоторое условие. Такую форму цикла чаще всего применяют в условиях неопределенности, когда нельзя заранее установить, сколько раз потребуется повторять действия, например, если заранее не известно, скольким сотрудникам следует рассчитать зарплату.
Синтаксис оператора:
Do [(While|Until) condition] [statements] [Exit Do] [statements] Loop [(While|Until) condition]
По сути, оператор имеет пять вариантов синтаксиса: запись условия While|Untilперед входом в цикл (предусловие), запись условия While|Until1 в конце цикла (постусловие) и запись оператора без задания условия. В последнем случае в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен присутствовать оператор немедленного выхода из цикла Exit Do (рис.16.11).
Если условие выполнения цикла нарушено при входе в цикл, то в случае предусловия тело цикла не выполнится ни разу, а в случае постусловия операторы тела цикла выполнятся один раз.
Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
(рис 16.11) Выход из цикла Do … Loop при помощи оператора Exit Do
На рис.16.11 представлена процедура и результат расчета суммы социальных выплат. Предполагается, что данные о зарплате размещены в ячейках колонки A. Цикл выполняется, пока очередная ячейка не окажется пустой или нулевой.
Выход из цикла производится оператором Exit Do. Процедура на рис.16.12 выполняет те же действия, но в операторе цикла задано предусловие с ключевым словом While.
Этот способ организации цикла повторяет команды тела цикла, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора (сравни рис.16.12 и рис.16.13). При таком способе организации цикла не применяется оператор немедленного завершения цикла.
(рис 16.12) Оператор цикла Do…Loop с предусловием
Синтаксис оператора:
While condition Statements Wend
(рис 16.13) Оператор цикла While…Wend
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.