[an error occurred while processing this directive] | |
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
7-й час. Циклические вычисленияДопустим, в приложении необходимо выполнить одну и ту же последовательность действий 15 раз. Неужели для этого необходимо 15 раз повторять запись одной и той же последовательности операторов? Нет! Но чтобы избежать такой участи, надо организовать циклические вычисления. Циклические вычисления, или просто циклы, позволяют повторять выполнение одной группы операторов любое необходимое число раз. В этом часе вы изучите операторы Do… Loop и For… Next, используемые для организации циклических вычислений. В этом часе будут рассмотрены следующие вопросы.
Оператор For…NextПри создании программ вам рано или поздно придется повторно выполнять один и тот же набор операторов заданное число раз. Для организации повторных вычислений используется оператор For... Next, имеющий следующий синтаксис:
Число выполнений этого оператора определяется параметрами начало и конец. Переменная счетчик при первом выполнении цикла имеет значение начало и каждый раз при выполнении оператора Next увеличивается на величину, заданную параметром шаг. Если этот необязательный параметр опущен, значение счетчик увеличивается на единицу. Параметр шаг может быть любым действительным числом, как целым, так и дробным, как положительным, так и отрицательным. (Отметим, что в зависимости от типа данных значений начало, конец и шаг объявляется соответствующий тип переменной счетчик.) Если параметр шаг положительный или опущен, то при превышении значения переменной счетчик значения параметра конец прекращается выполнение цикла. Необязательный оператор Exit For служит для экстренного прекращения цикла и обычно вкладывается в оператор If или Select Case. Для экспериментов с оператором For... Next откройте новую рабочую книгу и сохраните ее под именем Час7. С помощью комбинации клавиш <Alt+F11> откройте редактор Visual Basic. Выполните следующие действия для создания простого примера с использованием оператора For... Next.
В качестве эксперимента с оператором For измените число 15, например на 5 или 10000, чтобы увидеть (точнее, услышать) разницу. Если сравнить приведенный оператор For с его синтаксисом, то нетрудно заметить, что опущен элемент Step шаг. Рассмотрим еще один пример оператора For, где параметр шаг принимает отрицательное значение, осуществляя таким образом обратный счет значения переменной счетчик оператора For.
Рис. 7.1. Текст этого окна показывает, что первое значение счетчика равно 1
Рис. 7.2. В каждом последующем окне сообщения значение счетчика будет меньше, чем в предыдущем Чтобы показать другие возможности применения оператора For, создадим еще одну процедуру, вычисляющую сложные проценты на вклады и конечную величину вклада при 10% годовых. Выполните следующее.
В этой процедуре для вычисления конечного значения (переменная cSavings) используется переменная iNumberOfYears, задающая, сколько раз будет выполняться цикл. Вы, наверное, заметили новый оператор Format (cSavings, “0.00”), который преобразует значение переменной cSavings в формат с двумя десятичными разрядами. Оператор Do... LoopДля выполнения оператора For необходимо задать параметры (эти параметры могут вычисляться или задаваться во время выполнения программы, как в последней процедуре), которые точно определяют, сколько раз должен выполняться оператор цикла. Иногда это свойство оператора For является ограничительным, и в этом случае VBA предлагает другой оператор - Do... Loop, который также может организовать повторяющиеся вычисления, но момент прекращения вычислений здесь определяется с помощью логических условий. Существует два типа операторов Do: Do While и Do Until. Первый из них повторяет выполнение блока операторов до тех пор, пока заданное логическое условие истинно. Второй оператор, Do Until, выполняет циклические вычисления до тех пор, пока изначально ложное логическое условие не станет истинным. Синтаксис этих операторов следующий. Синтаксис 1:
Синтаксис 2:
Различие между этими двумя синтаксисами весьма тонкое. В соответствии с синтаксисом 1 логическое условие помещается в начало цикла. В этом случае, если логическое условие не выполняется, то операторы цикла не выполняются ни разу. Во втором синтаксисе логическое условие помещено в конце цикла. Поэтому операторы цикла в любом случае будут выполнены хотя бы один раз. Оператор Exit Do используется для экстренного выхода из цикла, обычно для этого применяются условные операторы If и Select Case. Для создания процедуры с использованием оператора Do выполните следующие действия.
Как вы помните, при щелчке на кнопке Отмена функция InputBox возвращает пустую строку, а метод Application.InputBox - значение False (Ложь).
В 4-м часе "Переменные и константы" мы познакомились с массивами, а также с такой их разновидностью, как динамические массивы. Динамические массивы позволяют изменять свои размеры во время выполнения программы. Их часто используют совместно с оператором Do... Loop, как показано в следующем примере.
Рис. 7.3. Первое окно ввода. Полный код процедуры СписокИмен приведен в листинге 7.1. Листинг 7.1. Процедура СписокИмен
Прежде всего обратите внимание в этом листинге на объявление переменных:
Переменная iCount используется для управления размером массива и возрастает при каждом выполнении цикла. sNames - динамический массив, который изменяет свои размеры во время выполнения цикла. Переменная iResponse следит за тем, хочет ли пользователь продолжать ввод имен. Значение этой переменной - фактор, управляющий завершением цикла. Переменная i является счетчиком цикла For при выводе окон сообщений с именами. После объявления переменных присваивается значение переменной iResponse:
Когда этой переменной присвоено значение, все готово к началу цикла:
Поскольку переменной iResponse присвоено значение vbYes, то цикл Do выполнится по крайней мере один раз. При первом выполнении цикла переменная iCount принимает значение 1, при втором - 2 и т.д. Значение переменной iCount используется для задания нового размера массива sNames. Отметим, что массив изменяет свой размер без потери значений, которые уже в нем содержатся:
Следующая группа операторов используется для того, чтобы узнать, сознательно ли пользователь щелкнул на кнопке Отмена, чтобы прекратить ввод имен, или случайно нажал клавишу <Enter>, не введя никакого значения:
После завершения цикла Do выполняется цикл For для вывода последовательности окон сообщений с введенными ранее именами:
Количество повторений цикла For задается выражением i = 1 То iCount - 1. Необходимость вычитания единицы из значения переменной iCount возникла из-за того, что эта переменная изменяет свое значение в начале цикла Do еще до проверки условий, по которым заканчивается этот цикл. Если вы хотите посмотреть, что получится, если не вычитать единицу из переменной iCount, удалите -1 в операторе For и выполните процедуру сначала. В конце выполнения процедуры вы получите лишнее окно сообщения с обычным текстом вывода имен, но без самого имени. РезюмеВ этом часе мы изучили механизмы VBA для создания циклических вычислений (операторы циклов For и Do) и на примерах показали способы их применения. Мы также рассмотрели пример совместного использования динамических массивов и операторов цикла. Вопросы и ответыВопрос. Каково основное назначение циклических операторов? Ответ. Многократное выполнение группы операторов. Вопрос. Как определить, помещать условия в начале оператора цикла Do... Loop или в конце? Ответ. Ответьте на такой вопрос: "Какое минимальное число раз должны выполняться операторы цикла?". Если вы ответите, что один раз, тогда условие поместите в конце цикла, если ответите, что ни одного, то в этом случае условие должно стоять в начале цикла. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеС помощью оператора For создайте процедуру с именем РабочиеЧасы, которая позволяет вводить для пяти дней недели количество часов, отработанных в эти дни. Процедура также должна выводить окно сообщения с суммарным количеством рабочих часов за неделю. Создайте другую процедуру и назовите ее Зарплата. Процедура должна считать недельную зарплату при условии почасовой оплаты. Предположим, что минимальная оплата рабочего часа составляет 6 у.е. Примените оператор Do... Loop для управления окном ввода, где пользователь должен ввести собственную почасовую ставку. Используйте суммарное количество рабочих часов в неделю, подсчитанное процедурой РабочиеЧасы. Итоговое значение выведите на экран с помощью окна сообщения. Совет: объявите переменную, содержащую суммарное количество рабочих часов в неделю, как глобальную (Public) переменную. Выполните сначала процедуру РабочиеЧасы, а затем - Зарплата. |
[an error occurred while processing this directive] |