- •Содержание
- •Раздел 1. Быстрый старт 2
- •Раздел 2. Редактор Visual Basic 11
- •Immediate Window (окно проверки) 15
- •Раздел 3. Переменные и типы данных 27
- •Раздел 4. Операторы управления 51
- •Раздел 5. Процедуры, подпрограммы и функции 66
- •Раздел 6. Объекты ms Excel 101
- •Раздел 7. Пользовательские формы 139
- •Immediate Window (окно проверки) 177
- •Введение
- •Раздел 1.Быстрый старт Использование макрорекордера
- •Запись макроса
- •Запуск макроса
- •Абсолютные и относительные ссылки Запись формулы на рабочем листе
- •Макрорекордер
- •Диалоговые окна для ввода/вывода данных
- •Функция InputBox
- •Функция MsgBox
- •Раздел 2.Редактор Visual Basic
- •Окна редактора vb
- •Project Window (окно проекта)
- •Properties Window (Окно свойств)
- •Code (окно программы)
- •Immediate Window (окно проверки)
- •Получение справки
- •Запись процедур
- •Режимы работы с программой
- •Ошибки и их обнаружение
- •Отладка
- •Меню и панели инструментов Visual Basic
- •Панели инструментов Стандартная панель инструментов
- •Панель инструментов отладки
- •Раздел 3.Переменные и типы данных Объявление переменных
- •Важность объявления переменных
- •Область видимости переменных
- •Время жизни переменных
- •Инициализация переменных
- •Операции с элементарными данными
- •Оператор присваивания
- •Выполнение операций
- •Арифметические операции
- •Операции сравнения
- •Оператор Like
- •Логические операции
- •Символьные операции
- •Приоритет операций
- •Операции с другими типами данных
- •Объектные переменные
- •Массивы
- •Динамические массивы
- •Пользовательский тип
- •Раздел 4.Операторы управления
- •Условный оператор If
- •Оператор выбора Select Case
- •Операторы цикла
- •Цикл For…Next
- •Цикл For Each…Next
- •Оператор Set
- •Цикл Do…Loop
- •Цикл While…Wend
- •Раздел 5.Процедуры, подпрограммы и функции
- •Классификация процедур
- •Структура и объявление процедуры
- •Синтаксис объявления процедуры общего типа
- •Синтаксис объявления функции
- •Вызов процедуры
- •Параметры и аргументы
- •Возврат значения функции
- •Использование процедур-функций на рабочем листе
- •Поименованные аргументы
- •Использование необязательных аргументов
- •Использование параметра ParamArray
- •Вызов процедур другого проекта
- •Автопроцедуры
- •Событийные процедуры
- •Рекурсивные процедуры
- •Встроенные функции Классы функций
- •Использование табличных функций
- •Организация интерфейса при помощи встроенных функций
- •Функция MsgBox
- •Функция InputBox
- •Строковые функции
- •Примеры на использование различных строковых функций Функция Format
- •Функция Val
- •Функции Len, Mid
- •Функция Left
- •Функция Instr
- •Функция Chr
- •Математические функции
- •Функции Int и Fix
- •Функция Log
- •Функции Randomize и Rnd
- •Функции даты и времени
- •Примеры функций даты и времени Функции Day, Month, Year, DateSerial
- •Функции Now, Time, Timer
- •Функция WeekDay
- •Функции Hour, Minute, Second
- •Раздел 6.Объекты ms Excel
- •Свойства объектов
- •Методы объектов
- •Модель объектов
- •Коллекции объектов
- •Обращение к объекту Контейнеры
- •Ссылка на объект
- •Оператор With
- •Использование объектных переменных
- •Объект Application
- •Активные объекты
- •Свойства, влияющие на высвечивание на экране Свойство DisplayAlerts (r/w Boolean)
- •Свойства DisplayFormulaBar (r/w Boolean), DisplayStatusBar (r/w Boolean)
- •Свойство ScreenUpdating (r/w Boolean)
- •Свойства Top, Left, Height, Width, UsableWidth, WindowState
- •Свойство Visible (r/w Boolean)
- •Другие свойства объекта Application
- •Методы Метод Calculate
- •Метод CheckSpelling
- •Метод OnTime
- •Метод Wait
- •Коллекции объектов
- •Объекты Workbooks и Workbook
- •Событийные процедуры
- •Объекты Sheets, WorkSheets и WorkSheet
- •Свойства Свойство Name (r/w String)
- •Свойство Type (r/o String)
- •Свойство UsedRange
- •Свойства Next и Previous
- •Свойство Parent
- •Свойство Visible (r/w Boolean)
- •Методы Метод Add
- •Методы Move и Select
- •Событийные процедуры
- •Объект Range
- •Свойства Cвойство Range
- •Свойство Cells
- •Свойство Offset
- •Метод Union и свойство Areas
- •Свойства Column и Row (r/o Integer)
- •Свойства Columns и Rows
- •Свойство CurrentRegion
- •Cвойства, связанные с шириной и высотой ячейки
- •Методы Методы Select и Activate
- •Метод Clear
- •Цветовое оформление объекта Range Свойство ColorIndex
- •Свойство Color
- •Раздел 7.Пользовательские формы
- •Режимы работы с формой
- •Режим конструктора
- •Элементы управления
- •Событийные процедуры
- •Режим выполнения
- •Объекты UserForm и Controls
- •Разработка приложения
- •Приложение 1
- •Конструирование начальной формы
- •Свойства формы и элементов управления
- •Создание событийных процедур
- •Конструирование формы для выбора рабочего листа
- •Создание событийных процедур
- •Элемент ListBox
- •Событийная процедура инициализации формы
- •Завершение разработки приложения
- •Связь формы с ячейками рабочего листа
- •Элемент TextBox
- •Элемент ListBox
- •Приложение 2
- •Конструирование форм
- •Процедуры
- •Приложение a. Справочная система Просмотр объектов, их свойств и методов (Object Browser)
- •Окно Object Browser
- •Панель инструментов Object Browser
- •Выход из Object Browser
- •Интерактивная подсказка
- •Приложение b. Инструментальные средства отладки программ
- •Контрольные точки или точки останова
- •Трассировка или пошаговое выполнение программы
- •Использование объекта Debug
- •Окна отладчика
- •Immediate Window (окно проверки)
- •Окно значения переменной
- •Locals Window (окно локальных переменных)
- •Окно контрольных значений (Watches)
- •Приложение c. Основные формы записи алгоритмов
- •Понятие "алгоритм"
- •Классификация алгоритмов
- •Способы записи алгоритмов
- •Запись на естественном языке
- •Изображение алгоритма в виде графических символов
- •Представление основных типов алгоритмов в виде блок-схем
Цикл Do…Loop
Этот цикл является логически прерываемым циклом. Цикл, организованный при помощи этой структуры, повторяет набор инструкций, пока выполнено некоторое условие. Такую форму цикла чаще всего используют в условиях неопределенности, когда нельзя заранее установить, сколько раз потребуется повторять действия. Например, если заранее неизвестно, скольким сотрудниками следует рассчитать зарплату, можно использовать оператор Do…Loop при условии, что значение некоторой переменной будет свидетельствовать об окончании расчета.
Синтаксис оператора
Do [(While|Until) condition]
[statements] [Exit Do] [statements]
Loop [(While | Until) condition]
condition – тестируемое выражение со значением True или False;
While|Until1 – ключевые слова, которые определяют, до каких пор будут выполняться команды, составляющие тело цикла:
While – повтор операторов, пока условие (condition) истинно;
Until – повтор операторов, пока условие ложно (пока условие не станет истинным).
Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит Not:
While condition = Until Not condition
Exit Do – оператор немедленного выхода из цикла;
statements – последовательность операторов, выполняемых в цикле.
По сути, оператор имеет пять вариантов синтаксиса. В первых двух вариантах While|Until condition проверяется в начале цикла. В следующих двух вариантах While|Until condition проверяется в конце цикла. Пятый вариант – оператор цикла без задания условия.
Замечания
Если While|Until condition отсутствует, то в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен стоять оператор немедленного выхода из цикла Exit Do.
Если условие выполнения цикла проверяется в начале, то команды внутри цикла не выполнятся ни разу, если при входе в цикл условие нарушено.
Команды тела цикла выполняются хотя бы один раз при проверке условия продолжения цикла в конце оператора цикла.
Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
Примеры
Поиск первой непустой ячейки в первой строке рабочего листа.
Рассмотрим два способа записи оператора Do…Loop: с условием в начале оператора цикла (предусловие) и с условием в конце оператора цикла (постусловие).
Public Sub notempty_cell_While() Dim i As Integer i = 1 Do While IsEmpty(ActiveSheet.Cells(1, i)) i = i + 1 If i = 257 Then MsgBox "Все ячейки первой строки пусты" i=1 Exit Sub End If Loop ActiveSheet.Cells(1, i).Select End Sub |
Public Sub notempty_cell_Until() Dim i As Integer Do i = i + 1 If i = 257 Then MsgBox "Все ячейки первой строки пусты" I=1 Exit Sub End If Loop Until Not IsEmpty(ActiveSheet.Cells(1, i))
ActiveSheet.Cells(1, i).Select End Sub |
Аргумент ActiveSheet.Cells(1,i) функции IsEmpty определяет очередную ячейку первой строки активного листа. Оператор Exit Sub немедленно завершает процедуру, если просмотрены все 256 ячеек первой строки и непустая ячейка не найдена (i=257).
После нормального выхода из цикла значение переменной i указывает на номер столбца, в первой строке которого обнаружена непустая ячейка. Последний оператор процедуры выделяет найденную ячейку.
В первом случае цикл выполняется до тех пор, пока ячейка пуста. Тестирование выполняется до входа в цикл. Во втором случае цикл выполняется до тех пор, пока ячейка не станет непустой. Тестирование выполняется в конце цикла.
Процедуру salary_cycle расчета заработной платы, записанную с использованием оператора For…Next, можно переписать, применив оператор Do…Loop.
Sub salary_while_start() Dim h As Long, r As Long, s As Double, Dim Fund As Long, id As Integer h = 1 r = 1 Do While h > 0 And r > 0 id=Val(InputBox("Код сотрудника")) h = Val(InputBox("Количество отработанных часов")) r = Val(InputBox("Почасовая оплата")) If h = 0 Or r = 0 Then Exit Do End If s = h * r Fund = s * 0.13 s = s – Fund MsgBox "Код сотрудника " & id & ", сумма на руки " & s Loop End Sub |
Оператор Do While h>0 And r>0 разрешает выполнение тела цикла, до тех пор, пока количество отработанных часов и почасовая ставка ненулевые.
Расчет зарплаты завершается, если введено нулевое значение хотя бы для одного показателя.
Чтобы избежать установки фиктивных начальных значений, в данном случае лучше задавать условие в конце цикла: Loop While h > 0 And r > 0, а с использованием ключевого слова Until оператор будет выглядеть так: Loop Until h = 0 Or r = 0.
Вообще говоря, в этом примере можно было бы не задавать условие, так как внутри цикла введенные значения сравниваются с нулем и осуществляется немедленный выход из цикла, если такие значения обнаружены.