Введение в программные системы и их разработку

Основы программирования

Разбить на страницы
Показывать лекцию целиком

16.1. Процедуры, подпрограммы и функции

Процедуры записываются в стандартных модулях и на процедурных листах, связанных с объектами проекта. Команда Insert-Procedure вызывает диалог для добавления процедуры в текущий модуль (рис.16.1). Выполнение этого диалога приводит к появлению в тексте модуля двух строк Public Sub MyProc() и End Sub.

(рис 16.1) Добавление процедуры

После записи оператора начала процедуры Sub вручную и нажатия клавиши Enter конец процедуры записывается автоматически. Для переименования процедуры достаточно изменить ее идентификатор в операторе объявления процедуры Sub.

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

Операторы и комментарии записываются в процедурах. Операторы представляют собой команды обработки объектов приложения и команды языка Visual Basic, а комментарии – некоторый свободный текст, который вводится в программу в качестве пояснений. Текст комментария начинается с одинарной кавычки (‘)Следует отличать одинарную кавычку (‘)от апострофа (').. Применение комментариев значительно облегчает чтение и модификацию программы, в том числе и самому автору программы через некоторое время.

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

  • команда Complete Word из меню Edit или клавиши Ctrl+пробел ускоряют набор ключевых слов;
  • нажатие клавиши Точка (.) после имени объекта высвечивает список свойств и методов, из которого можно выбрать нужное;
  • нажатие на клавишу Открывающая скобка после имени процедуры или функции высвечивает подсказку по формальным параметрам процедур и функций.
  • Можно импортировать (команда Import File из меню File) текст модуля из файлов с расширениями .frm (формы), .bas (модули), .cls (классы). Также можно экспортировать (команда Export File из меню File) текст модуля в файлы с расширениями .frm, .bas, .cls. Возможности экспорта и импорта позволяют легко переносить приложение на VBA из одного документа в другой.

    Все исполняемые операторы программы размещаются в процедурах. Вне процедур в начале модуля могут находиться только опции (например, Option Explicit), объявления модульных, глобальных переменных и переменных пользовательского типа.

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

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

    Классификация процедур

    Существуют следующие типы процедур:

  • основная процедура, которая вызывает другие процедуры. Это самостоятельно используемая процедура;
  • вызываемые процедуры, реализующие конкретные задачи проекта;
  • процедуры обработки событий.
  • В качестве вызываемых процедур применяются процедуры общего типа (подпрограммы) и процедуры-функции. Функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения функции присваивается значение, которое доступно вызвавшей ее процедуре.

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

    Удобно написать автоматически запускаемые процедуры со специальными именами, например, Auto_Open – процедура, выполняемая при открытии документа.

    Структура и объявление процедуры

    Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими парными операторами, составляют тело процедуры (функции).

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

    Выход из процедуры обычно происходит естественным образом – при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.

    Синтаксис объявления процедуры общего типа

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

    [Private|Public][Static] Sub name ([arglist])
    
  • Private или Public (указывается одно из двух) определяют область видимости процедуры;
  • Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры;
  • name – имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля;
  • 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 (кнопка Создать) или записать новый макрос в режиме макрорекордера (кнопка Записать).

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

    16.2. Переменные и типы данных

    Объявление переменных

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

  • Идентификатор состоит из букв, цифр или знаков, причем первый символ идентификатора – всегда буква.
  • Не рекомендуется использовать в идентификаторе буквы русского языка, несмотря на то, что это допускается в локализованных версиях MS Office. Применение нелатинских символов в идентификаторах может привести к проблемам с переносимостью приложения на другие компьютеры.
  • Нельзя использовать в качестве идентификаторов служебные или ключевые слова и стандартные имена.
  • Нельзя использовать пробелы и точки в качестве разделителей частей идентификаторов. Для разделения обычно применяется нижнее подчеркивание или написание каждой части идентификатора с прописной буквы.
  • Символы объявления типа, например, "#", можно использовать только как последний символ идентификатора – суффикс.
  • Строчные и прописные буквы в идентификаторе равнозначны.
  • Длина идентификатора не может превышать 255 символов. Длина имен объектов не должна превышать 40 символов.
  • Переменная – это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная имеет тип, который соответствует типу данных, сохраняемых в ней.

    Константа – постоянное значение, используемое в программе. Символьные константы заключаются в двойные кавычки, а для констант, представляющих даты, вместо кавычек используются символы решетка ("#"). Например, #1.12.2006#.

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

    Const name=expression, например, Const pi=3.14
    

    В языке имеются встроенные константы, идентификаторы которых зарезервированы. Идентификаторы констант VB начинаются с префикса "vb". Например, для перехода на новую строку часто задействуют константы vbLf, vbCr, vbCrLf.

    В дополнение к константам VB используются константы приложения, начальные буквы которых определяются приложением, например, константы Excel VBA начинаются с префикса "xl". Для просмотра полного перечня встроенных констант в Object Browser применяется строка поиска Constants.

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

  • Объявление переменных поможет избежать самого распространенного типа ошибок – ошибок, связанных с неправильным написанием имен переменных, например, вместо идентификатора wbkVar в операторе может быть записано wkbVar.
  • Если переменная объявлена, Visual Basic проверяет, используется ли правильный тип данных в операциях с этой переменной.
  • Объявление переменных исключает преобразование значений переменных при вычислении выражений из типа Variant в другой.
  • Применение переменных различных типов уменьшает объем памяти, занимаемый переменными, и сокращает время выполняемых вычислений, благодаря чему программы становятся более эффективными.
  • Объявление переменных позволяет использовать одни и те же переменные в нескольких процедурах или модулях (модульные и глобальные переменные). Можно определять переменные, сохраняющие свои значения после выхода из процедуры.
  • (рис 16.5) Сообщение о необъявленной переменной

    Чтобы избежать использования переменных без объявления, достаточно поместить в область Declarations инструкцию Option Explicit. Тогда обращение к не объявленной ранее переменной вызовет сообщение об ошибке компиляции (рис.16.5).

    Чтобы принудительно следовать стратегии объявления переменных, в окне команды Tools-Options (рис. 15.4) отмечается опция Require Variable Declaration, и тогда инструкция Option Explicit будет автоматически вставляться во все модули и процедурные листы проекта.

    Типы данных

    В VBA, как и в любом языке, используются данные элементарных типов: Boolean, Byte, Integer, Long, Single, Double, Currency, Date, String, Object, Variant, а также данные пользовательского типа User-defined data type (см. таблицу 16.2).

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

    Элементарные типы данных
    Тип данных Размер в байтах Разрядность Диапазон значений
    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 символов
    User-defined data type (пользовательскийтип данных) Размер определяется элементами Разрядность и диапазон каждого элемента, входящего в пользова тельский тип, определяется типом данных элемента

    Для объявления переменных используются операторы Dim, Private, Public и Static.

    Синтаксис оператора Dim:

    Dim VariableName [As DataType]
  • VariableName – идентификатор переменной;
  • DataType – тип данных. Необязательный параметр, по умолчанию – Variant.
  • Например, Dim p As Integer.

    Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim.

    VBA предусматривает включение в идентификаторы переменных суффиксов, определяющих тип переменной – %, , !, #, @, $. Например, Dim Name$ определяет переменную Name$ как символьную (стринговую).

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

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

    Тип Variant

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

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

    Объектные переменные

    Синтаксис объявления объектной переменной:

    Dim varname As type,
    
  • type – тип объекта.
  • Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.

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

    Оператор Set

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

    Синтаксис оператора:

    Set objectvar = objectexpression|Nothing
    
  • objectvar – объектная переменная;
  • objectexpression – объектное выражение;
  • Nothing – ключевое слово, указывающее на отсутствие ссылки на объект.
  • В качестве объектного выражения можно применять свойство, функцию или метод, возвращающие объект нужного типа. Типы объектного выражения и объектной переменной должны совпадать. Например, Set rng=Range("A1:B10"). Чтобы очистить объектную переменную, в операторе присваивания используется значение Nothing, которое аннулирует ссылку на объект и освобождает ресурсы. Например, Set rng= Nothing.

    Массивы

    Массив – это совокупность переменных одного типа. Элементы массива имеют одинаковые характеристики (тип, размер и т.д.). Каждому массиву при объявлении присваивается имя – идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается именем массива с индексом, например, A(5), где А – имя массива, 5 – индекс. Другими словами, отдельный элемент массива определяется его позицией (индексом) в массиве. Можно сказать, что массив – это именованная совокупность переменных одного типа, которые различаются значениями своих индексов. Некоторые операторы позволяют осуществлять групповую обработку элементов массива, например, оператор Join. Элементы массива могут участвовать во всех конструкциях языка, в которых допускается использование обычных переменных.

    С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массивы (матрицы). Максимальное количество измерений массива – 60. Например, ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12*31*2.

    Индекс элемента массива – это число (положительное, отрицательное или 0). Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс – второму и т. д. Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до целого числа.

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

    Dim varname(subscripts) As type
    
  • varname – имя массива;
  • subscripts – индексы измерений массива;
  • type – тип элемента массива.
  • Для каждого измерения (subscripts) можно указать нижнюю и верхнюю границы индекса (граничная пара) в виде lower to upper, где обе границы суть целые числа или выражения, результат вычисления которых есть число. Нижняя граница может быть опущена, тогда она предполагается нулевой, если инструкция Option Base не указывает на другое. Например, размещенная в области Declarations инструкция Option Base 1 устанавливает нижний индекс всех массивов в единицу.

    Рекомендуется предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление 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 – ключевое слово, позволяющее сохранить существующие элементы массива;
  • varname – идентификатор массива;
  • subscripts – индексы массива;
  • type – тип элементов массива.
  • Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения. Попытка изменения нижней границы индекса приведет к ошибке. При переопределении динамического массива без ключевого слова Preserve все элементы массива уничтожаются. Если размерность массива увеличивается, то включение Preserve в оператор ReDim сохраняет существующие элементы массива. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива, теряются.

    Для определения границ динамического массива применяются функции LBound и UBound . Синтаксис:

    LBound (arrayname [,dimension]) UBound (arrayname [,dimension])
    
  • arrayname – имя массива,
  • dimension – номер измерения массива.
  • Пользовательский тип

    Пользовательский тип (User-Defined Data Type) представляет собой структуру данных, состоящую из нескольких логически связанных между собой элементов. Каждый пользовательский тип описывается с помощью инструкции Type в области Declarations (рис.16.6). Завершение определения пользовательского типа данных – инструкция End Type. В блоке Type...End Type не допускаются номера строк и метки строк. Например:

    (рис 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 Local variables as Static (рис.16.1), то при вставке новой процедуры командой Insert Procedure все локальные переменные процедуры будут статическими.

    Инициализация переменных

    При входе в процедуру локальные переменные (за исключением переменных, объявленных как Static) автоматически получают начальные значения в соответствии с типом переменной (см. таблицу 16.4). Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные – при первом входе в процедуру, в которой они объявлены. На практике для того, чтобы избежать неясностей, рекомендуется явным образом инициализировать переменную (присваивать ей начальное значение), прежде чем использовать ее в выражении.

    Инициализация переменных
    Тип Начальное значение
    Integer, Long, Single, Double 0
    String (переменная длина) Пустая строка (кол-во символов равно нулю)
    String (фиксированная длина) Заполняется символами, имеющими нулевой ASCII-код, иными словами Chr(0)
    Variant Empty
    Object Nothing

    16.3. Операторы управления

    Как было сказано ранее, любая процедура – это последовательность операторов. Стандартный порядок выполнения операторов – последовательный, сверху-вниз или слева-направо, если несколько операторов записаны в одной строке и разделены двоеточием. Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности команд (циклы), позволяют изменить этот порядок.

    Управляющие операторы ограничивают операторными скобками совокупность команд, выполняемых в цикле или при ветвлении.

    Условный оператор If

    Оператор организует ветвление программы, т. е. выполнение различных действий в зависимости от истинности условия. Это может быть условие, налагаемое на значения переменных, или условие относительно текущего состояния приложения. Например, если необходим ввод данных в ячейки таблицы 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
    
  • сondition-n – тестируемые выражения со значением True или False. Обязательный элемент;
  • statements, elseifstatements-2, elsestatements – последовательности операторов, необязательные элементы;
  • ElseIf – ключевое слово (записывается в одно слово), используемое для задания дополнительных условий (их может быть несколько). Необязательный элемент;
  • End If – оператор, играющий роль закрывающей операторной скобки.
  • Если условие (condition) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements. Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.

    После выполнения одной последовательности операторов управление передается оператору, следующему за условным оператором, а в случае блочной структуры – за End If. Оператор End If обязателен при записи условного оператора блоком и не используется при записи условного оператора в строку.

    (рис 16.7) Блочная структура условного оператора

    Приведенный на рис.16.7 оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.

    Оператор выбора Select Case

    При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case. Оператор Select Case – это оператор выбора ветви в зависимости от значения тестируемого выражения.

    Синтаксис оператора:

    Select Case testexpression 
    Case expressionlist-n 
    statements-n
    ...
    Case Else 
    Elsestatements 
    End Select
    
  • testexpression – тестируемое выражение. Обязательный элемент;
  • строки Case задают возможные значения тестируемого выражения;
  • expressionlist – список значений тестируемого выражения, который определяет выполняемую последовательность операторов: если значение тестируемого выражения найдено в списке expressionlist-1, то выполняются операторы statements-1 и т. д.;
  • строка Case Else определяет операторы, которые выполняются, если значение не найдено ни в одном списке;
  • statements-n, elsestatements – последовательности операторов. Хотя бы одна из совокупностей операторов должна быть непустой.
  • Значения списка могут быть представлены константами или выражениями c числовыми или символьными значениями. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:

  • expression To expression задает диапазон значений списка: "от" и "до";
  • Is comparisonoperator задает условие на значение тестируемого выражения, при справедливости которого выполняются последующие операторы.
  • Тестируемое выражение может быть задано формулой. По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.

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

    На рис.16.8 условный оператор, приведенный на рис.16.7, записан при помощи оператора Select Case.

    (рис 16.8) Оператор выбора Select Case

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

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

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

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

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

  • вычисляемые циклы повторяют набор команд определенное (вычисляемое) число раз;
  • объектные циклы выполняют набор команд для каждого объекта группы;
  • логически прерываемые циклы повторяют команды, пока условие имеет истинное значение или пока значение условия не станет таковым.
  • Цикл For…Next

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

    Синтаксис оператора:

    For counter = start To end [Step step] 
    [statements]
    [Exit For] 
    [statements] 
    Next [counter]
  • counter – переменная цикла (счетчик цикла);
  • start – начальное значение переменной цикла;
  • end – конечное значение переменной цикла;
  • step – шаг цикла. Необязательное значение. По умолчанию шаг цикла равен единице;
  • Exit For – оператор немедленного выхода из цикла;
  • statements – набор повторяемых команд (тело цикла);
  • Next – оператор окончания цикла.
  • На рис.16.9 приведен пример оператора вычисляемого цикла, в котором подсчитывается сумма первых десяти натуральных чисел. При первом входе в цикл счетчик цикла устанавливается в начальное значение (start=1). При каждом повторе к счетчику цикла прибавляется шаг цикла (step, по умолчанию 1). Как только значение переменной цикла превысит конечное значение (end=10), цикл завершается. Можно подсчитать, сколько раз выполнится цикл. Например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.

    (рис 16.9) Вычисляемый цикл

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

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

    Цикл For Each…Next

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

    Синтаксис оператора:

    For Each element In group
    [statements] 
    [Exit For] 
    [statements] 
    Next [element]
    
  • element – переменная, значения которой суть элементы из группы;
  • group – массив данных или коллекция объектов;
  • statements – последовательность операторов, выполняемая для каждого элемента;
  • Exit For – оператор, осуществляющий немедленный выход из цикла.
  • Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant. Если цикл записан для коллекции объектов, то тип переменной element – Object, или должен совпадать с типом элементов коллекции объектов. Не рекомендуется внутри цикла изменять количество элементов массива или коллекции, так как команды тела цикла могут не обработать новый элемент. Цикл For Each для коллекции объектов более эффективен, чем цикл For Next.

    На рис.16.10 в цикле суммируются ячейки интервала A1:B10.

    (рис 16.10) Цикл объектного типа

    Цикл Do…Loop

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

    Синтаксис оператора:

    Do [(While|Until) condition] 
    [statements]
    [Exit Do] 
    [statements]
    Loop [(While|Until) condition]
    
  • condition – тестируемое выражение со значением True или False;
  • While|Until – ключевые слова (используется одно из двух), которые определяют, до каких пор будут выполняться команды, составляющие тело цикла: While – повтор операторов, пока условие (condition) истинно; Until – повтор операторов, пока условие ложно (пока условие не станет истинным). Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит отрицание Not: While condition = Until Not condition;
  • Exit Do – оператор немедленного выхода из цикла;
  • statements – последовательность операторов, выполняемых в цикле.
  • По сути, оператор имеет пять вариантов синтаксиса: запись условия While|Untilперед входом в цикл (предусловие), запись условия While|Until1 в конце цикла (постусловие) и запись оператора без задания условия. В последнем случае в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен присутствовать оператор немедленного выхода из цикла Exit Do (рис.16.11).

    Если условие выполнения цикла нарушено при входе в цикл, то в случае предусловия тело цикла не выполнится ни разу, а в случае постусловия операторы тела цикла выполнятся один раз.

    Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.

    (рис 16.11) Выход из цикла Do … Loop при помощи оператора Exit Do

    На рис.16.11 представлена процедура и результат расчета суммы социальных выплат. Предполагается, что данные о зарплате размещены в ячейках колонки A. Цикл выполняется, пока очередная ячейка не окажется пустой или нулевой.

    Выход из цикла производится оператором Exit Do. Процедура на рис.16.12 выполняет те же действия, но в операторе цикла задано предусловие с ключевым словом While.

    Цикл While…Wend

    Этот способ организации цикла повторяет команды тела цикла, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора (сравни рис.16.12 и рис.16.13). При таком способе организации цикла не применяется оператор немедленного завершения цикла.

    (рис 16.12) Оператор цикла Do…Loop с предусловием

    Синтаксис оператора:

    While condition
    Statements
    Wend
    
  • condition – тестируемое выражение со значением True или False;
  • statements – последовательность операторов, выполняемых в цикле.
  • (рис 16.13) Оператор цикла While…Wend
    Страницы:

    16.1. Процедуры, подпрограммы и функции

    Процедуры записываются в стандартных модулях и на процедурных листах, связанных с объектами проекта. Команда Insert-Procedure вызывает диалог для добавления процедуры в текущий модуль (рис.16.1). Выполнение этого диалога приводит к появлению в тексте модуля двух строк Public Sub MyProc() и End Sub.

    (рис 16.1) Добавление процедуры

    После записи оператора начала процедуры Sub вручную и нажатия клавиши Enter конец процедуры записывается автоматически. Для переименования процедуры достаточно изменить ее идентификатор в операторе объявления процедуры Sub.

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

    Операторы и комментарии записываются в процедурах. Операторы представляют собой команды обработки объектов приложения и команды языка Visual Basic, а комментарии – некоторый свободный текст, который вводится в программу в качестве пояснений. Текст комментария начинается с одинарной кавычки (‘)Следует отличать одинарную кавычку (‘)от апострофа (').. Применение комментариев значительно облегчает чтение и модификацию программы, в том числе и самому автору программы через некоторое время.

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

  • команда Complete Word из меню Edit или клавиши Ctrl+пробел ускоряют набор ключевых слов;
  • нажатие клавиши Точка (.) после имени объекта высвечивает список свойств и методов, из которого можно выбрать нужное;
  • нажатие на клавишу Открывающая скобка после имени процедуры или функции высвечивает подсказку по формальным параметрам процедур и функций.
  • Можно импортировать (команда Import File из меню File) текст модуля из файлов с расширениями .frm (формы), .bas (модули), .cls (классы). Также можно экспортировать (команда Export File из меню File) текст модуля в файлы с расширениями .frm, .bas, .cls. Возможности экспорта и импорта позволяют легко переносить приложение на VBA из одного документа в другой.

    Все исполняемые операторы программы размещаются в процедурах. Вне процедур в начале модуля могут находиться только опции (например, Option Explicit), объявления модульных, глобальных переменных и переменных пользовательского типа.

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

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

    Классификация процедур

    Существуют следующие типы процедур:

  • основная процедура, которая вызывает другие процедуры. Это самостоятельно используемая процедура;
  • вызываемые процедуры, реализующие конкретные задачи проекта;
  • процедуры обработки событий.
  • В качестве вызываемых процедур применяются процедуры общего типа (подпрограммы) и процедуры-функции. Функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения функции присваивается значение, которое доступно вызвавшей ее процедуре.

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

    Удобно написать автоматически запускаемые процедуры со специальными именами, например, Auto_Open – процедура, выполняемая при открытии документа.

    Структура и объявление процедуры

    Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими парными операторами, составляют тело процедуры (функции).

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

    Выход из процедуры обычно происходит естественным образом – при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.

    Синтаксис объявления процедуры общего типа

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

    [Private|Public][Static] Sub name ([arglist])
    
  • Private или Public (указывается одно из двух) определяют область видимости процедуры;
  • Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры;
  • name – имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля;
  • 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 (кнопка Создать) или записать новый макрос в режиме макрорекордера (кнопка Записать).

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

    16.2. Переменные и типы данных

    Объявление переменных

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

  • Идентификатор состоит из букв, цифр или знаков, причем первый символ идентификатора – всегда буква.
  • Не рекомендуется использовать в идентификаторе буквы русского языка, несмотря на то, что это допускается в локализованных версиях MS Office. Применение нелатинских символов в идентификаторах может привести к проблемам с переносимостью приложения на другие компьютеры.
  • Нельзя использовать в качестве идентификаторов служебные или ключевые слова и стандартные имена.
  • Нельзя использовать пробелы и точки в качестве разделителей частей идентификаторов. Для разделения обычно применяется нижнее подчеркивание или написание каждой части идентификатора с прописной буквы.
  • Символы объявления типа, например, "#", можно использовать только как последний символ идентификатора – суффикс.
  • Строчные и прописные буквы в идентификаторе равнозначны.
  • Длина идентификатора не может превышать 255 символов. Длина имен объектов не должна превышать 40 символов.
  • Переменная – это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная имеет тип, который соответствует типу данных, сохраняемых в ней.

    Константа – постоянное значение, используемое в программе. Символьные константы заключаются в двойные кавычки, а для констант, представляющих даты, вместо кавычек используются символы решетка ("#"). Например, #1.12.2006#.

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

    Const name=expression, например, Const pi=3.14
    

    В языке имеются встроенные константы, идентификаторы которых зарезервированы. Идентификаторы констант VB начинаются с префикса "vb". Например, для перехода на новую строку часто задействуют константы vbLf, vbCr, vbCrLf.

    В дополнение к константам VB используются константы приложения, начальные буквы которых определяются приложением, например, константы Excel VBA начинаются с префикса "xl". Для просмотра полного перечня встроенных констант в Object Browser применяется строка поиска Constants.

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

  • Объявление переменных поможет избежать самого распространенного типа ошибок – ошибок, связанных с неправильным написанием имен переменных, например, вместо идентификатора wbkVar в операторе может быть записано wkbVar.
  • Если переменная объявлена, Visual Basic проверяет, используется ли правильный тип данных в операциях с этой переменной.
  • Объявление переменных исключает преобразование значений переменных при вычислении выражений из типа Variant в другой.
  • Применение переменных различных типов уменьшает объем памяти, занимаемый переменными, и сокращает время выполняемых вычислений, благодаря чему программы становятся более эффективными.
  • Объявление переменных позволяет использовать одни и те же переменные в нескольких процедурах или модулях (модульные и глобальные переменные). Можно определять переменные, сохраняющие свои значения после выхода из процедуры.
  • (рис 16.5) Сообщение о необъявленной переменной

    Чтобы избежать использования переменных без объявления, достаточно поместить в область Declarations инструкцию Option Explicit. Тогда обращение к не объявленной ранее переменной вызовет сообщение об ошибке компиляции (рис.16.5).

    Чтобы принудительно следовать стратегии объявления переменных, в окне команды Tools-Options (рис. 15.4) отмечается опция Require Variable Declaration, и тогда инструкция Option Explicit будет автоматически вставляться во все модули и процедурные листы проекта.

    Типы данных

    В VBA, как и в любом языке, используются данные элементарных типов: Boolean, Byte, Integer, Long, Single, Double, Currency, Date, String, Object, Variant, а также данные пользовательского типа User-defined data type (см. таблицу 16.2).

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

    Элементарные типы данных
    Тип данных Размер в байтах Разрядность Диапазон значений
    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 символов
    User-defined data type (пользовательскийтип данных) Размер определяется элементами Разрядность и диапазон каждого элемента, входящего в пользова тельский тип, определяется типом данных элемента

    Для объявления переменных используются операторы Dim, Private, Public и Static.

    Синтаксис оператора Dim:

    Dim VariableName [As DataType]
  • VariableName – идентификатор переменной;
  • DataType – тип данных. Необязательный параметр, по умолчанию – Variant.
  • Например, Dim p As Integer.

    Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim.

    VBA предусматривает включение в идентификаторы переменных суффиксов, определяющих тип переменной – %, , !, #, @, $. Например, Dim Name$ определяет переменную Name$ как символьную (стринговую).

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

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

    Тип Variant

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

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

    Объектные переменные

    Синтаксис объявления объектной переменной:

    Dim varname As type,
    
  • type – тип объекта.
  • Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.

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

    Оператор Set

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

    Синтаксис оператора:

    Set objectvar = objectexpression|Nothing
    
  • objectvar – объектная переменная;
  • objectexpression – объектное выражение;
  • Nothing – ключевое слово, указывающее на отсутствие ссылки на объект.
  • В качестве объектного выражения можно применять свойство, функцию или метод, возвращающие объект нужного типа. Типы объектного выражения и объектной переменной должны совпадать. Например, Set rng=Range("A1:B10"). Чтобы очистить объектную переменную, в операторе присваивания используется значение Nothing, которое аннулирует ссылку на объект и освобождает ресурсы. Например, Set rng= Nothing.

    Массивы

    Массив – это совокупность переменных одного типа. Элементы массива имеют одинаковые характеристики (тип, размер и т.д.). Каждому массиву при объявлении присваивается имя – идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается именем массива с индексом, например, A(5), где А – имя массива, 5 – индекс. Другими словами, отдельный элемент массива определяется его позицией (индексом) в массиве. Можно сказать, что массив – это именованная совокупность переменных одного типа, которые различаются значениями своих индексов. Некоторые операторы позволяют осуществлять групповую обработку элементов массива, например, оператор Join. Элементы массива могут участвовать во всех конструкциях языка, в которых допускается использование обычных переменных.

    С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массивы (матрицы). Максимальное количество измерений массива – 60. Например, ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12*31*2.

    Индекс элемента массива – это число (положительное, отрицательное или 0). Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс – второму и т. д. Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до целого числа.

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

    Dim varname(subscripts) As type
    
  • varname – имя массива;
  • subscripts – индексы измерений массива;
  • type – тип элемента массива.
  • Для каждого измерения (subscripts) можно указать нижнюю и верхнюю границы индекса (граничная пара) в виде lower to upper, где обе границы суть целые числа или выражения, результат вычисления которых есть число. Нижняя граница может быть опущена, тогда она предполагается нулевой, если инструкция Option Base не указывает на другое. Например, размещенная в области Declarations инструкция Option Base 1 устанавливает нижний индекс всех массивов в единицу.

    Рекомендуется предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление 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 – ключевое слово, позволяющее сохранить существующие элементы массива;
  • varname – идентификатор массива;
  • subscripts – индексы массива;
  • type – тип элементов массива.
  • Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения. Попытка изменения нижней границы индекса приведет к ошибке. При переопределении динамического массива без ключевого слова Preserve все элементы массива уничтожаются. Если размерность массива увеличивается, то включение Preserve в оператор ReDim сохраняет существующие элементы массива. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива, теряются.

    Для определения границ динамического массива применяются функции LBound и UBound . Синтаксис:

    LBound (arrayname [,dimension]) UBound (arrayname [,dimension])
    
  • arrayname – имя массива,
  • dimension – номер измерения массива.
  • Пользовательский тип

    Пользовательский тип (User-Defined Data Type) представляет собой структуру данных, состоящую из нескольких логически связанных между собой элементов. Каждый пользовательский тип описывается с помощью инструкции Type в области Declarations (рис.16.6). Завершение определения пользовательского типа данных – инструкция End Type. В блоке Type...End Type не допускаются номера строк и метки строк. Например:

    (рис 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 Local variables as Static (рис.16.1), то при вставке новой процедуры командой Insert Procedure все локальные переменные процедуры будут статическими.

    Инициализация переменных

    При входе в процедуру локальные переменные (за исключением переменных, объявленных как Static) автоматически получают начальные значения в соответствии с типом переменной (см. таблицу 16.4). Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные – при первом входе в процедуру, в которой они объявлены. На практике для того, чтобы избежать неясностей, рекомендуется явным образом инициализировать переменную (присваивать ей начальное значение), прежде чем использовать ее в выражении.

    Инициализация переменных
    Тип Начальное значение
    Integer, Long, Single, Double 0
    String (переменная длина) Пустая строка (кол-во символов равно нулю)
    String (фиксированная длина) Заполняется символами, имеющими нулевой ASCII-код, иными словами Chr(0)
    Variant Empty
    Object Nothing

    16.3. Операторы управления

    Как было сказано ранее, любая процедура – это последовательность операторов. Стандартный порядок выполнения операторов – последовательный, сверху-вниз или слева-направо, если несколько операторов записаны в одной строке и разделены двоеточием. Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности команд (циклы), позволяют изменить этот порядок.

    Управляющие операторы ограничивают операторными скобками совокупность команд, выполняемых в цикле или при ветвлении.

    Условный оператор If

    Оператор организует ветвление программы, т. е. выполнение различных действий в зависимости от истинности условия. Это может быть условие, налагаемое на значения переменных, или условие относительно текущего состояния приложения. Например, если необходим ввод данных в ячейки таблицы 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
    
  • сondition-n – тестируемые выражения со значением True или False. Обязательный элемент;
  • statements, elseifstatements-2, elsestatements – последовательности операторов, необязательные элементы;
  • ElseIf – ключевое слово (записывается в одно слово), используемое для задания дополнительных условий (их может быть несколько). Необязательный элемент;
  • End If – оператор, играющий роль закрывающей операторной скобки.
  • Если условие (condition) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements. Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.

    После выполнения одной последовательности операторов управление передается оператору, следующему за условным оператором, а в случае блочной структуры – за End If. Оператор End If обязателен при записи условного оператора блоком и не используется при записи условного оператора в строку.

    (рис 16.7) Блочная структура условного оператора

    Приведенный на рис.16.7 оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.

    Оператор выбора Select Case

    При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case. Оператор Select Case – это оператор выбора ветви в зависимости от значения тестируемого выражения.

    Синтаксис оператора:

    Select Case testexpression 
    Case expressionlist-n 
    statements-n
    ...
    Case Else 
    Elsestatements 
    End Select
    
  • testexpression – тестируемое выражение. Обязательный элемент;
  • строки Case задают возможные значения тестируемого выражения;
  • expressionlist – список значений тестируемого выражения, который определяет выполняемую последовательность операторов: если значение тестируемого выражения найдено в списке expressionlist-1, то выполняются операторы statements-1 и т. д.;
  • строка Case Else определяет операторы, которые выполняются, если значение не найдено ни в одном списке;
  • statements-n, elsestatements – последовательности операторов. Хотя бы одна из совокупностей операторов должна быть непустой.
  • Значения списка могут быть представлены константами или выражениями c числовыми или символьными значениями. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:

  • expression To expression задает диапазон значений списка: "от" и "до";
  • Is comparisonoperator задает условие на значение тестируемого выражения, при справедливости которого выполняются последующие операторы.
  • Тестируемое выражение может быть задано формулой. По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.

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

    На рис.16.8 условный оператор, приведенный на рис.16.7, записан при помощи оператора Select Case.

    (рис 16.8) Оператор выбора Select Case

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

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

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

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

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

  • вычисляемые циклы повторяют набор команд определенное (вычисляемое) число раз;
  • объектные циклы выполняют набор команд для каждого объекта группы;
  • логически прерываемые циклы повторяют команды, пока условие имеет истинное значение или пока значение условия не станет таковым.
  • Цикл For…Next

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

    Синтаксис оператора:

    For counter = start To end [Step step] 
    [statements]
    [Exit For] 
    [statements] 
    Next [counter]
  • counter – переменная цикла (счетчик цикла);
  • start – начальное значение переменной цикла;
  • end – конечное значение переменной цикла;
  • step – шаг цикла. Необязательное значение. По умолчанию шаг цикла равен единице;
  • Exit For – оператор немедленного выхода из цикла;
  • statements – набор повторяемых команд (тело цикла);
  • Next – оператор окончания цикла.
  • На рис.16.9 приведен пример оператора вычисляемого цикла, в котором подсчитывается сумма первых десяти натуральных чисел. При первом входе в цикл счетчик цикла устанавливается в начальное значение (start=1). При каждом повторе к счетчику цикла прибавляется шаг цикла (step, по умолчанию 1). Как только значение переменной цикла превысит конечное значение (end=10), цикл завершается. Можно подсчитать, сколько раз выполнится цикл. Например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.

    (рис 16.9) Вычисляемый цикл

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

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

    Цикл For Each…Next

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

    Синтаксис оператора:

    For Each element In group
    [statements] 
    [Exit For] 
    [statements] 
    Next [element]
    
  • element – переменная, значения которой суть элементы из группы;
  • group – массив данных или коллекция объектов;
  • statements – последовательность операторов, выполняемая для каждого элемента;
  • Exit For – оператор, осуществляющий немедленный выход из цикла.
  • Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant. Если цикл записан для коллекции объектов, то тип переменной element – Object, или должен совпадать с типом элементов коллекции объектов. Не рекомендуется внутри цикла изменять количество элементов массива или коллекции, так как команды тела цикла могут не обработать новый элемент. Цикл For Each для коллекции объектов более эффективен, чем цикл For Next.

    На рис.16.10 в цикле суммируются ячейки интервала A1:B10.

    (рис 16.10) Цикл объектного типа

    Цикл Do…Loop

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

    Синтаксис оператора:

    Do [(While|Until) condition] 
    [statements]
    [Exit Do] 
    [statements]
    Loop [(While|Until) condition]
    
  • condition – тестируемое выражение со значением True или False;
  • While|Until – ключевые слова (используется одно из двух), которые определяют, до каких пор будут выполняться команды, составляющие тело цикла: While – повтор операторов, пока условие (condition) истинно; Until – повтор операторов, пока условие ложно (пока условие не станет истинным). Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит отрицание Not: While condition = Until Not condition;
  • Exit Do – оператор немедленного выхода из цикла;
  • statements – последовательность операторов, выполняемых в цикле.
  • По сути, оператор имеет пять вариантов синтаксиса: запись условия While|Untilперед входом в цикл (предусловие), запись условия While|Until1 в конце цикла (постусловие) и запись оператора без задания условия. В последнем случае в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен присутствовать оператор немедленного выхода из цикла Exit Do (рис.16.11).

    Если условие выполнения цикла нарушено при входе в цикл, то в случае предусловия тело цикла не выполнится ни разу, а в случае постусловия операторы тела цикла выполнятся один раз.

    Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.

    (рис 16.11) Выход из цикла Do … Loop при помощи оператора Exit Do

    На рис.16.11 представлена процедура и результат расчета суммы социальных выплат. Предполагается, что данные о зарплате размещены в ячейках колонки A. Цикл выполняется, пока очередная ячейка не окажется пустой или нулевой.

    Выход из цикла производится оператором Exit Do. Процедура на рис.16.12 выполняет те же действия, но в операторе цикла задано предусловие с ключевым словом While.

    Цикл While…Wend

    Этот способ организации цикла повторяет команды тела цикла, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора (сравни рис.16.12 и рис.16.13). При таком способе организации цикла не применяется оператор немедленного завершения цикла.

    (рис 16.12) Оператор цикла Do…Loop с предусловием

    Синтаксис оператора:

    While condition
    Statements
    Wend
    
  • condition – тестируемое выражение со значением True или False;
  • statements – последовательность операторов, выполняемых в цикле.
  • (рис 16.13) Оператор цикла While…Wend
    Вернуться к учебному плану