Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Игнорирование результата функции ⇐ ПредыдущаяСтр 3 из 3
Возвращаемое значение функции, как правило, используется в дальнейших вычислениях программы. Однако в некоторых случаях можно не использовать возвращаемое функцией значение. Именно так используется в вышеприведенном листинге функция MsgBox, хотя здесь она используется в качестве процедуры (т.к. не использует возвращаемые значения). В действительности же, VBA предоставляет несколько встроенных констант для определения кнопок в окне сообщения MsgBox.
Однако, результат выбора пользователя опять никаким образом не возвращается и не используется в дальнейшем коде программы. Исправим этот нюанс.
При выполнении последнего листинга VBA после ответа пользователя (который нажал на одну из трех кнопок) закрывает окно и в переменной Otvet сохраняет число, соответствующее выбранной кнопке. Два последних примера использования MsgBox показывают важный факт, касающийся функций: опуская круглые скобки вокруг списка аргументов функции, мы тем самым игнорируем результат функции. В этом случае VBA интерпретирует вызов функции, как вызов процедуры, и не возвращает результат. В то же время VBA запрещает игнорирование результата функции, имя которой является ключевым словом VBA (например, CStr ), и тех функций, единственным назначением которых является предоставление некоторого возвращаемого значения, например, математических. Именованные аргументы функции Аргументы функции необходимо перечислять в определенном порядке. Так для функции MsgBox первый аргумент является сообщением для отображения, второй - это число и тип кнопок для диалогового окна, третий - заголовок диалогового окна. Об этом подсказывает всплывающее окно " Краткие сведения", появляющееся при вводе имени функции. Аргументы функции необходимо перечислять в определенном порядке. Так для функции MsgBox первый аргумент является сообщением для отображения, второй - это число и тип кнопок для диалогового окна, третий - заголовок диалогового окна. Об этом подсказывает всплывающее окно " Краткие сведения", появляющееся при вводе имени функции.
Следует обратить внимание, что если второй (необязательный) аргумент опустить, все же необходимо включать отмечающие запятые для второго аргумента в список аргументов. При пропуске или перестановке аргументов в списке аргументов функции можно получить ошибки несовпадения типов или, еще хуже, не получить никакой ошибки вообще. В результате программа может работать неправильно, а вам будет трудно найти причину " неисправности". Чтобы предотвратить подобные ошибки, VBA дает возможность использования именованных аргументов функций. Обратите внимание на следующий листинг.
Обе строки имеют один и тот же результат. Первый оператор использует обычный метод перечисления аргументов, а второй - метод именованных аргументов. Причем, обратите, внимание, во втором случае порядок следования аргументов изменен. В методе именованных аргументов это допускается. Полный синтаксис функции MsgBox следующий:
MsgBox (Prompt [, Buttons] [, Title] [, HelpFile, Context])
Единственным обязательным аргументом является аргумент Prompt, который может быть любым строковым выражением и содержит информацию, которая выводится в диалоговом окне. Все остальные аргументы - необязательные. Аргумент Title - строка для заголовка диалогового окна. Аргумент HelpFile - строковое выражение, содержащее имя справочного файла Windows (который уже должен быть создан). Аргумент Context - численное выражение, указывающее раздел в справочном файле, относящийся к отображаемому диалоговому окну. Аргумент Buttons - численное выражение, которое задает количество и тип кнопок в диалоговом окне. Также указывает кнопку по умолчанию и, содержит ли это диалоговое окно стандартные значки Windows для предупредительных сообщений и запросов пользователя. Функция InputBox InputBox - еще одна довольно часто используемая функция для обмена данными с пользователем. Полный синтаксис функции InputBox следующий:
InputBox (Prompt [, Title] [, Default] [, XPos] [, YPos] [, HelpFile, Context]) Аргументы Prompt (единственный обязательный аргумент), Title, HelpFile, Context - аналогичны уже рассмотренным одноименным аргументам функции MsgBox. Аргумент Default - строковое выражение, использующееся как значение по умолчанию для пользовательского ввода. Аргументы XPos , YPos - любые численные выражения. Эти аргументы задают координаты вывода диалогового окна на экране монитора. XPos - горизонтальное расстояние от левого края окна. YPos - вертикальное расстояние от верхнего края окна. Оба расстояния измеряются в твипах (1 твип = 1/20 точки = 0, 0007 дюйма). Следует быть внимательным при использовании этих аргументов, т.к. при их больших значениях диалоговое окно может " уехать" за пределы экрана монитора. В качестве примера использования функции InputBox приведен нижеследующий листинг, который запрашивает пользователя ввести имя файла, и предлагает имя по умолчанию.
При вызове InputBox можно использовать именованные аргументы. Нельзя смешивать именованные аргументы с обычным списком аргументов в одном и том же вызове функции ФУНКЦИИ VBA Ниже представлены таблицы с кратким описанием наиболее часто используемых функций VBA. Математические функции N - означает любое численное выражение. Все аргументы функций являются обязательными, если не указано иначе.
ОПЕРАТОРЫ ВЕТВЛЕНИЯ VBA До сих пор рассматривались процедуры и функции, которые VBA выполняет в линейном порядке - VBA начинает выполнение кода с первого оператора после строки объявления процедуры (функции) и продолжает выполнять каждый оператор построчно до тех пор, пока не будет достигнут оператор End Sub (End Function). Такой линейный алгоритм можно представить нижеследующей блок-схемой: Однако довольно часто встречаются ситуации, когда необходимо, чтобы процедуры или функции выполняли различные действия при разных условиях. Такую ситуацию иллюстрируют следующие блок-схемы:
Операторы, выполняющие роль ветвления программы на основании какого-либо условия, называются операторами условного перехода. Простейшими операторами условного перехода являются операторы If..Then; If..Then..Else. Первый оператор позволяет выбирать единственную ветвь процедуры (левая блок-схема), тогда как второй дает возможность выбирать из двух альтернативных ветвей кода процедуры (правая блок-схема) на основе оценки того, является ли условие равным True или False.
СИНТАКСИС IF..THEN Вариант 1: If Condition Then Statements Вариант 2: If Condition Then Statements End If Condition - логическое выражение; Statements - один, несколько или ни одного оператора VBA.
Первый вариант требует написания оператора в одну строку, при этом в секции Statements можно указывать несколько операторов, разделяя их двоеточием. Второй вариант позволяет указывать несколько операторов в разных строках. Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в секции Condition; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements; затем VBA продолжает выполнение кода следующего за строкой If..Then (Вариант 1) или за ключевыми словами End If (Вариант 2). Если же логическое выражение равно False, то операторы секции Statements пропускаются и выполняется код, следующий за этой секцией. Ниже приведен листинг элементарного использования первого варианта написания If..Then: А теперь - второй вариант:
Обратите внимание, что операторы секции Statements написаны с использованием отступа (используется табуляция). Это важный момент. Следует сразу приучать себя к подобному оформлению программного кода - это повышает его удобочитаемость и значительно облегчает поиск ошибок. Синтаксис If..Then..Else
Вариант 1: If Condition Then Statements Else ElseStatements
Вариант 2: If Condition Then Statements Else ElseStatements End If
Condition - логическое выражение; Statements, ElseStatements - один, несколько или ни одного оператора VBA. По аналогии с If..Then - первый вариант требует написания оператора в одну строку, при этом в секциях Statements и ElseStatements можно указывать несколько операторов, разделяя их двоеточием. Второй вариант позволяет указывать несколько операторов в разных строках. Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в секции Condition; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements; затем VBA продолжает выполнение кода следующего за строкой If..Then (Вариант 1) или за ключевыми словами End If (Вариант 2). Если же логическое выражение равно False, то выполняются операторы секции ElseStatements. Следует сказать, что блок операторов If..Then..Else (Вариант 2) легче читать и понимать. Поэтому, советую использовать именно этот вариант, даже если в секциях Statements и ElseStatements будет находиться по одному оператору. Если требуется реализовать более сложное ветвление используется следующая запись оператора выбора If..Then..ElseIf..End If:
СИНТАКСИС: If Condition Then Statements ElseIf Condition1 Then Statements1 ………………………… …………………………. ElseIf ConditionN Then StatementsN Else ElseStatements End If Логика работы следующая: VBA сначала оценивает логическое выражение, представленное в секции Condition; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements; затем VBA продолжает выполнение кода следующего ключевым словом End If. Если же логическое выражение равно False, то выполняются проверка условия Condition1; если это логическое выражение равно True то выполняется оператор (операторы) секции Statements1; затем VBA продолжает выполнение кода следующего ключевым словом End If. В противном случае проверяется условие Condition2 и т.д. пока не будет выполнена проверка условия ConditionN; если это логическое выражение равно True то выполняется оператор (операторы) секции StatementsN; затем VBA продолжает выполнение кода следующего ключевым словом End If. Если же логическое выражение равно False, то выполняются операторы секции ElseStatements. Sub sample3() Dim value As Long Const MSG = " Вы ввели число, " value = InputBox(prompt: =" Введите число", Title: =" Пример 4" ) If value = 0 Then MsgBox (MSG & " равное 0" ) ElseIf value > 0 Then MsgBox (MSG & " большее 0" ) Else MsgBox (MSG & " меньшее 0" ) End If End Sub
ЦИКЛЫ VBA Какие либо действия процедуры повторяющиеся заданное количество раз или пока выполняется или не выполняется некоторое условие называют циклом. Процесс выполнения все операторов, заключенных в структуру цикла, один раз называется итерацией цикла. Структуры цикла, всегда выполняющиеся заданное количество раз, называются циклами с фиксированным числом итераций. Другие типы структур цикла повторяются переменное количество раз в зависимости от некоторого набора условий. Такие циклы называются неопределенными циклами. Блок операторов, находящийся между началом и концом цикла называется " тело цикла ". Самой простой структурой цикла является фиксированный цикл. Цикл For..Next Синтаксис For counter = Start To End [Step StepSize ] Statements Next [ counter ] Counter - любая численная переменная VBA Start - любое численное выражение, определяет начальное значение для переменной counter End - численное выражение, определяет конечное значение для переменной counter Statements - один, несколько или ни одного оператора VBA (тело цикла). По умолчанию VBA увеличивает переменную counter на 1 каждый раз при выполнении операторов в цикле. Можно задать другое значение (SterSize - любое численное выражение), на которое будет изменяться counter. Ключевое слово Next сообщает VBA о том, что достигнут конец цикла. Необязательная переменная counter после ключевого слова Next должна быть той же самой переменной counter, которая была задана после ключевого слова For в начале структуры цикла. Ниже представлен листинг простейшего цикла For..Next, который считает сумму цифр от 1 до 10: А теперь два варианта цикла For..Next с использованием шага цикла отличного от единицы: Обратите внимание! При уменьшении счетчика цикла For..Next цикл выполняется, пока переменная счетчика больше или равна конечному значению, а когда счетчик цикла увеличивается, цикл выполняется, пока переменная счетчика меньше или равна конечному значению. Цикл For Each..Next Цикл For Each..Next не использует счетчик цикла. Циклы For Each..Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив (которые будут рассматриваться позже). Проще говоря, цикл For Each..Next выполняется один раз для каждого элемента в группе. СИНТАКСИС: For Each Element In Group Statements Next [ Element ] Element - переменная, используемая для итерации по всем элементам в определенной группе Group - это объект коллекции или массив Statements - один, несколько или ни одного оператора VBA (тело цикла). Цикл For Each..Next всегда выполняется столько раз, сколько имеется элементов в определенной группе. В нижеприведенном листинге показана функция SheetExists, использующая цикл For Each..Next для определения того, существует ли определенный лист в рабочей книге Excel: Цикл Do.. While Конструкция цикла, тестирующая свое условие детерминанта до выполнения цикла. СИНТАКСИС: Do While Condition Statements Loop Condition - логическое выражение для детерминанта цикла Statements - один, ни одного или несколько операторов, которые составляют тело цикла Loop - ключевое слово, указывает на окончание тела цикла и обозначает место, из которого VBA возвращается в начало цикла для проверки условия VBA выполняет цикл пока логическое выражение, представленное с помощью Condition, равно True. При выполнении цикла Do While сначала тестируется логическое выражение (Condition); если оно равно True - выполняется тело цикла. При достижении ключевого слова Loop управление опять передается в начало цикла и снова проверяется логическое выражение. Так происходит до тех пор, пока логическое выражение не станет False. Когда логическое выражение становится False - управление передается оператору, следующему за ключевым словом Loop. Обратите внимание! Если логическое выражение равно False при первом выполнении цикла Do While, то управление сразу передается оператору, следующему за Loop, а операторы, находящиеся в теле цикла соответственно пропускаются. Другими словами говоря, цикл Do While позволяет ни разу не выполнять операторы внутри него. В нижеприведенном листинге представлен элементарный цикл Do While, подсчитывающий сумму цифр от 1 до 10: Цикл Do.. Until Еще один цикл, тестирующий условие детерминанта до выполнения цикла. СИНТАКСИС: Do Until Condition Statements Loop Condition - логическое выражение для детерминанта цикла Statements - один, ни одного или несколько операторов, которые составляют тело цикла Loop - ключевое слово, указывает на окончание тела цикла и обозначает место, из которого VBA возвращается в начало цикла для проверки условия VBA выполняет цикл пока логическое выражение, представленное с помощью Condition, равно False. В остальном цикл Do Until полностью аналогичен циклу Do While. Листинг, использующий цикл Do Until для подсчета цифр от 1 до 10, будет выглядеть так: Для тестирования условий после выполнения тела цикла надо поместить логическое выражение в конец блока операторов, составляющих тело цикла, после ключевого слова Loop , которое сообщает о конце цикла.
Цикл Do.. Loop While Конструкция цикла, тестирующая свое условие детерминанта после выполнения цикла. СИНТАКСИС: Do Statements Loop While Condition Condition - логическое выражение для детерминанта цикла Statements - один, ни одного или несколько операторов, которые составляют тело цикла Loop While - ключевое слово, указывает на окончание тела цикла и обозначает место, из которого VBA возвращается в начало цикла после проверки условия VBA выполняет цикл пока логическое выражение, представленное с помощью Condition, равно True. При выполнении цикла Do Loop While сначала выполняются операторы тела цикла, затем по достижении ключевого слова Loop тестируется логическое выражение (Condition); если оно равно True - управление передается в начало тела цикла и цикл повторяется снова. Так происходит до тех пор, пока логическое выражение не станет False. Когда логическое выражение становится False - управление передается оператору, следующему за строкой Loop While... Обратите внимание! Даже если при первом выполнении цикла Do Loop While логическое выражение равно False тело цикла всё равно будет выполнено. Другими словами говоря, независимо от значения логического выражения, представленного с помощью Condition, этот цикл всегда выполняется, по крайней мере, один раз. Листинг, использующий цикл Do Loop While для подсчета цифр от 1 до 10, будет выглядеть так: Цикл Do.. Loop Until Еще один цикл, тестирующий условие детерминанта после выполнения цикла. Синтаксис: Do Statements Loop Until Condition Condition - логическое выражение для детерминанта цикла Statements - один, ни одного или несколько операторов, которые составляют тело цикла Loop - ключевое слово, указывает на окончание тела цикла и обозначает место, из которого VBA возвращается в начало цикла после проверки условия VBA выполняет цикл пока логическое выражение, представленное с помощью Condition, равно False. В остальном цикл Do Loop Until полностью аналогичен циклу Do Loop While. Листинг, использующий цикл Do Loop Until для подсчета цифр от 1 до 10, будет выглядеть так: Следует сказать, что представленные выше примеры даны чисто в познавательных целях, чтобы можно было понять саму суть организации неопределенных циклов с проверкой условий до и после выполнения тела цикла. Сама же гибкость неопределенных циклов здесь явно не просматривается. Вложенные циклы Циклы можно помещать внутрь друг друга. Помещение одной структуры цикла в другую называется вложением циклов. Можно делать вложение структур циклов разного типа. При вложении циклов надо соблюдать определенные правила: При вложении циклов For..Next каждый цикл должен иметь свою уникальную переменную счетчика; При вложении циклов For Each..Next каждый цикл должен иметь свою уникальную element-переменную; Если используется оператор Exit For или Exit Do во вложенном цикле, этим оператором заканчивается только выполняемый в данный момент цикл. VBA продолжает выполнение следующего цикла более высокого уровня. В нижеприведенном листинге показан простейший пример использования вложенных циклов For..Next: МАССИВЫ VBA Массив - это коллекция переменных, которые имеют общие имя и базовый тип. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип. Информация, сохраненная в массиве, может быть доступна в любом порядке. Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Обработку массивов значительно упрощает использование циклов. Одномерные массивы Одномерный массив - это самый простой вариант массива, использующий обыкновенный список данных. Например:
Вася, Петя, Коля, Миша, Ваня, Слава, Игорь, Юра, Саша, Вова
Это строковый массив, состоящий из 10 элементов. Дадим ему название My_Array. Нумерация элементов в массиве начинается с 0. Такая система нумерации довольно распространена в программировании и называется нумерацией с нулевой базой. Для доступа к данным, хранящимся в определенном элементе массива, следует указывать имя массива с последующим числом, называемым индексом элемента. Индекс всегда заключается в круглые скобки. Например: My_Array(3) - этому элементу нашего массива соответствует " Миша" (не забывайте, что по умолчанию нумерация элементов массива начинается с 0). Поскольку нумерация с нулевой базой не очень удобна (т.к. мы привыкли считать с 1, а не с 0), то в VBA имеется директива компилятора, позволяющая исправить это " неудобство": Option Base. Директива компилятора имеет два варианта написания: Option Base 0 - индексы массивов начинаются с 0 (установка по умолчанию) Option Base 1 - индексы массивов начинаются с 1
Данная директива компилятора помещается в область объявлений модуля перед объявлениями любых переменных, констант или процедур. Нельзя помещать Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле, который влияет на все массивы, объявляемые в модуле. Многомерные массивы Одномерные массивы хорошо подходят для представления простых списков данных. Однако часто бывает необходимо представить таблицы данных в программах с организацией данных в формате строк и столбцов, подобно ячейкам в рабочих листах Excel. Для этого необходимо использовать многомерные массивы. Так адрес каждой ячейки листа состоит из двух чисел, одно из которых (номер строки) является первым индексом, а второе (номер столбца) - вторым индексом массива. Такой массив называется двумерным массивом. Добавив еще номер листа, получим трехмерный массив. VBA позволяет создавать массивы, имеющие до 60 измерений. Статические и динамические массивы Массивы, не меняющие число своих элементов, называются статическими массивами. Примером такого массива может служить вышеприведенный массив My_Array, содержащий 10 элементов. Однако бывают ситуации, когда изначально неизвестно количество элементов в массиве, или же, в процессе работы это количество может изменяться. Такие массивы называются динамическими массивами. Динамический массив может увеличиваться или сжиматься, чтобы вмещать точно необходимое число элементов без напрасного расходования памяти. Объявление массивов Объявление массива с использованием оператора Dim имеет следующий синтаксис: Dim VarName([Subscripts]) [As Type] VarName - любое имя массива, использующее допустимый идентификатор имени; Subscripts - измерение массива. Если размерность массива больше единицы, то Subscripts разделяются запятыми. Оператор Subscripts имеет следующий синтаксис: [lower To] upper [, [lower To] upper].. Lower - определяет нижний диапазон допустимых индексов для массива (необязательный аргумент); upper - определяет верхний предел для индексов массива (обязательный аргумент). Примеры правильного объявления массивов: Dim Array_Str (1 To 10) As String- одномерный статический строковый массив, включающий 10 элементов; Dim Array_Var() - динамический массив; Dim Array_Mult (0 To 5, 0 To 7) As Integer - двумерный статический массив целых чисел, включающий 6*8=48 элементов. При объявлении массивов следует помнить, что включение оператора Subscripts в объявлении массива создает статический массив с фиксированным числом элементов, пропуск оператора Subscripts в объявлении массива создает динамический массив, а установка директивы компилятора Option Base влияет на общее число элементов в массиве. Использование массивов Для доступа к элементу массива необходимо указывать имя массива, за которым следует значение индекса, заключенное в круглые скобки. Нижеприведенный листинг показывает элементарное объявление и использование массива (в качестве элементов массива используется факториал номера элемента массива): При помощи вложенных циклов довольно легко можно организовать инициализацию двумерного массива:
Популярное:
|
Последнее изменение этой страницы: 2017-03-11; Просмотров: 598; Нарушение авторского права страницы