- •Что такое Visual Basic for Applications
- •Автоматизация среды Excel
- •Запись простого макроса
- •Выполнение макросов
- •Просмотр кода макроса
- •Редактирование кода макроса
- •Ограниченность макросов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Назначение макросам комбинаций клавиш
- •Где хранить макросы
- •Создание личной книги макросов
- •Сохранение макросов в личной книге макросов
- •Выполнение макросов из личной книги макросов
- •Редактирование макросов в личной книге макросов
- •Удаление макросов из личной книги макросов
- •Назначение макросов командным кнопкам
- •Назначение макроса графическим изображениям
- •Назначение макросов кнопкам панелей инструментов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Введение в процесс разработки приложений
- •Кто будет использовать приложение
- •Откуда будут поступать данные для приложения
- •Где и как будут храниться данные, полученные с помощью приложения
- •Как данные будут обрабатываться приложением
- •Вид выходных данных
- •Типы элементов управления
- •Вставка элементов управления в рабочий лист
- •Форматирование элементов управления
- •Имена элементов управления
- •Экранные формы
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Модуль: дом для кода vba
- •Обзор процедур
- •Создание процедур
- •Выполнение процедуры
- •Сохранение изменений в модуле
- •Переменные
- •Типы данных
- •Объявление переменных
- •Соглашения об именах переменных
- •Массивы
- •Присвоение значений переменным
- •Использование констант
- •Область видимости переменных и констант
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Функция MsgBox
- •Функция InputBox
- •Метод InputBox
- •Именование аргументов
- •Объединение текстовых строк
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Управление выполнением приложения
- •Оператор If
- •Оператор Select Case
- •Использование встроенных диалоговых окон Excel
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Оператор For…Next
- •Оператор Do... Loop
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое объект
- •Объекты, свойства и методы
- •Объектная модель Excel
- •Пять наиболее часто используемых объектов
- •Как понимать иерархию объектной модели
- •Ссылка на объекты в коде vba
- •Работа с объектами
- •Задание свойств объекта
- •Использование методов
- •Справочная информация о свойствах и методах
- •Переменные-объекты
- •1: Sub ПримерПеремОбъекта()
- •Коллекции
- •Метод Add
- •Свойство Count
- •1: Sub КоличРабЛистов()
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Объект Application
- •Использование встроенных функций Excel
- •Свойства и методы объекта Application
- •Объект Workbook
- •Объект Worksheet
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Описание объекта Range
- •Свойства объекта Range
- •Методы объекта Range
- •Использование оператора With
- •Оператор For Each
- •Использование объекта Range
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Панели инструментов
- •Просмотр кода
- •Использование справочной системы
- •Просмотр объектов
- •Параметры редактора Visual Basic
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Тестирование и отладка как этап разработки приложений
- •Отладка
- •Режим останова
- •Использование окна Immediate
- •Просмотр значений в окне Immediate
- •Пошаговое выполнение программ
- •Наблюдение за переменными
- •Исправление ошибок
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Понятие об обработке ошибок
- •Перехват ошибок
- •Написание процедуры обработки ошибся
- •Выход из обработчика ошибок
- •Пример обработчика ошибок
- •Централизованный обработчик ошибок
- •Вопрос и ответы
- •Практикум
- •Упражнение
- •Вставка экранных форм в приложения
- •Свойства экранной формы
- •Выполнение экранной формы
- •Вставка элементов управления в экранную форму
- •Свойства элементов управления
- •Свойства командных кнопок
- •Свойства переключателей
- •Блокировка элементов управления
- •Экранные подсказки к элементам управления
- •Задание порядка обхода элементов формы
- •Назначение быстрых клавиш элементам формы
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Инициализация значений экранной формы
- •Вызов экранной формы
- •Управление поведением формы
- •Проверка вводимых данных
- •Сохранение данных, введенных в форму
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Настройка панелей инструментов
- •Создание панелей инструментов
- •Процедуры, управляющие панелями инструментов
- •Создание панели инструментов
- •Удаление панели инструментов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Способы изменения меню
- •Программная работа с меню
- •Добавление пунктов и команд меню
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Создание диаграмм
- •Запись макроса построения диаграмм
- •Код макроса
- •Изменение кода макроса
- •Усовершенствованная процедура построения диаграмм
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Работа со сводной таблицей
- •Основы сводных таблиц
- •Запись макроса для создания сводной таблицы
- •Исследование кода макроса
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Базы данных, доступные из Excel
- •Средства доступа к внешним данным
- •Использование ms Query
- •Код записанного макроса
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое ado
- •Объекты доступа к базам данных
- •Использование ado
- •Создание ссылки на библиотеку ado
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Вставка полей в экранную форму
- •Перемещение по записям
- •Редактирование данных
- •Добавление средства поиска
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое автоматизация
- •Основы автоматизации
- •Ссылка на библиотеку объектов приложения-сервера
- •Просмотр библиотеки объектов
- •Создание экземпляра приложения-сервера
- •Использование объектов Microsoft Word
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Автоматическое выполнение процедур
- •Процедуры, выполняемые при наступлении событий
- •Создание надстроек Excel
- •Упражнение
- •Приложение. Ответы Ответы к 1-му часу Тесты
- •Ответы ко 2-му часу Тесты
- •Ответы к 3-му часу Тесты
- •Ответы к 4-му часу Тесты
- •Упражнение
- •Ответы к 5-му часу Тесты
- •Упражнение
- •Ответы к 6-му часу Тесты
- •Упражнение
- •Ответы к 7-му часу Тесты
- •Упражнение
- •Ответы к 8-му часу Тесты
- •Упражнение
- •Ответы к 9-му часу Тесты
- •Упражнение
- •Ответы к 10-му часу Тесты
- •Упражнение
- •Ответы к 11-му часу Тесты
- •Упражнение
- •Ответы к 12-му часу Тесты
- •Упражнение
- •Ответы к 13-му часу Тесты
- •Упражнение
- •Ответы к 14-му часу Тесты
- •Ответы к 15-му часу Тесты
- •Упражнение
- •Ответы к 16-му часу Тесты
- •Упражнение
- •Ответы к 17-му часу Тесты
- •Упражнение
- •Ответы к 18-му часу Тесты
- •Упражнение
- •Ответы к 19-му часу Тесты
- •Упражнение
- •Ответы к 20-му часу Тесты
- •Упражнение
- •Ответы к 21-му часу Тесты
- •Упражнение
- •Ответы к 22-му часу Тесты
- •Упражнение
- •Ответы к 23-му часу Тесты
- •Упражнение
- •Ответы к 24-му часу Тесты
- •Упражнение
Оператор Do... Loop
Для выполнения оператора For необходимо задать параметры (эти параметры могут вычисляться или задаваться во время выполнения программы, как в последней процедуре), которые точно определяют, сколько раз должен выполняться оператор цикла. Иногда это свойство оператора For является ограничительным, и в этом случае VBA предлагает другой оператор - Do... Loop, который также может организовать повторяющиеся вычисления, но момент прекращения вычислений здесь определяется с помощью логических условий. Существует два типа операторов Do: Do While и Do Until. Первый из них повторяет выполнение блока операторов до тех пор, пока заданное логическое условие истинно. Второй оператор, Do Until, выполняет циклические вычисления до тех пор, пока изначально ложное логическое условие не станет истинным. Синтаксис этих операторов следующий.
Синтаксис 1:
Do [{While | Until} условие]
[операторы]
[Exit Do]
[операторы]
Loop
Синтаксис 2:
Do
[операторы]
[Exit Do]
[операторы]
Loop [{While | Until} условие]
Различие между этими двумя синтаксисами весьма тонкое. В соответствии с синтаксисом 1 логическое условие помещается в начало цикла. В этом случае, если логическое условие не выполняется, то операторы цикла не выполняются ни разу. Во втором синтаксисе логическое условие помещено в конце цикла. Поэтому операторы цикла в любом случае будут выполнены хотя бы один раз. Оператор Exit Do используется для экстренного выхода из цикла, обычно для этого применяются условные операторы If и Select Case.
Для создания процедуры с использованием оператора Do выполните следующие действия.
-
Вставьте в текущий модуль новую процедуру и назовите ее ВводИмени. В этой процедуре пользователю предлагается ввести свое имя или выйти из программы.
-
Введите код процедуры:
Dim sName As String
Dim iResponse As Integer
sName = “”
Do While sName = “”
sName = InputBox(“Введите свое имя: “)
If sName = “” Then
iResponse = MsgBox (“Вы хотите выйти из программы?”, vbYesNo)
If iResponse = vbYes Then
Exit Do
End If
End If
Loop
Как вы помните, при щелчке на кнопке Отмена функция InputBox возвращает пустую строку, а метод Application.InputBox - значение False (Ложь).
-
Выполните процедуру.
-
В окне ввода щелкните на кнопке Отмена или, не вводя значения, нажмите клавишу <Enter>. Появится окно сообщения, спрашивающее, хотите ли вы выйти из программы.
-
Щелкните на кнопке Нет. Окно ввода появится снова. Введите свое имя и нажмите клавишу <Enter>. Процедура закончится.
В 4-м часе "Переменные и константы" мы познакомились с массивами, а также с такой их разновидностью, как динамические массивы. Динамические массивы позволяют изменять свои размеры во время выполнения программы. Их часто используют совместно с оператором Do... Loop, как показано в следующем примере.
-
Вставьте новую процедуру с именем СписокИмен. Эта процедура предназначена для ввода списка имен (количество имен заранее не известно), которые записываются в динамический массив.
-
Код процедуры СписокИмен следующий:
Dim iCount As Integer
Dim sNames() As String
Dim iResponse As Integer
Dim i As Integer
iResponse = vbYes
Do While iResponse = vbYes
iCount = iCount + 1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Введите имя")
If sNames(iCount) = "" Then
iResponse = MsgBox("Продолжить?", vbYesNo)
If iResponse = vbYes Then
sNames(iCount)= InputBox ("Введите имя")
End If
End If
Loop
For i = 1 To iCount - 1
MsgBox i & "-e имя "&" - "& sNames(i)
Next
-
Выполните процедуру. Первое окно ввода показано на рис. 7.3.
-
Введите три имени, нажимая после ввода каждого клавишу <Enter>.
-
Щелкните на кнопке Отмена. Появится окно сообщения с вопросом "Продолжим?".
-
Щелкните на кнопке Нет. Появится новое окно сообщения с первым введенным именем.
-
Щелкните на кнопке ОК. Отобразится следующее окно сообщения со вторым введенным именем.
-
Щелкните на кнопке ОК. Отобразится окно сообщения с третьим введенным именем.
-
Щелкните на кнопке ОК. Выполнение процедуры закончится.
Рис. 7.3. Первое окно ввода.
Полный код процедуры СписокИмен приведен в листинге 7.1.
Листинг 7.1. Процедура СписокИмен
1: Public Sub СписокИмен()
2: Dim iCount As Integer
3: Dim sNames() As String
4: Dim iResponse As Integer
5: Dim i As Integer
6:
7: iResponse = vbYes
8:
9: Do While iResponse = vbYes
10: iCount = iCount + 1
11: ReDim Preserve sNames(iCount) As String
12: sNames(iCount) = InputBox("Введите имя")
13: If sNames(iCount) = " " Then
14: iResponse = MsgBox("Продолжим?", vbYesNo)
15: If iResponse = vbYes Then
16: sNames(iCount) = InputBox("Введите имя")
17: End If
18: End If
19: Loop
20:
21: For i = 1 To iCount - 1
22: MsgBox i & "-e имя" & " - " & sNames(i)
23: Next
24: End Sub
Прежде всего обратите внимание в этом листинге на объявление переменных:
Dim iCount As Integer
Dim sNames() As String
Dim iResponse As Integer
Dim i As Integer
Переменная iCount используется для управления размером массива и возрастает при каждом выполнении цикла. sNames - динамический массив, который изменяет свои размеры во время выполнения цикла. Переменная iResponse следит за тем, хочет ли пользователь продолжать ввод имен. Значение этой переменной - фактор, управляющий завершением цикла. Переменная i является счетчиком цикла For при выводе окон сообщений с именами. После объявления переменных присваивается значение переменной iResponse:
iResponse = vbYes
Когда этой переменной присвоено значение, все готово к началу цикла:
Do While iResponse = vbYes
Поскольку переменной iResponse присвоено значение vbYes, то цикл Do выполнится по крайней мере один раз. При первом выполнении цикла переменная iCount принимает значение 1, при втором - 2 и т.д. Значение переменной iCount используется для задания нового размера массива sNames. Отметим, что массив изменяет свой размер без потери значений, которые уже в нем содержатся:
iCount = iCount + 1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Введите имя")
Следующая группа операторов используется для того, чтобы узнать, сознательно ли пользователь щелкнул на кнопке Отмена, чтобы прекратить ввод имен, или случайно нажал клавишу <Enter>, не введя никакого значения:
If sNames(iCount) = " " Then
iResponse = MsgBox("Продолжим?", vbYesNo)
If iResponse = vbYes Then
sNames(iCount) = InputBox("Введите имя")
End If
End If
После завершения цикла Do выполняется цикл For для вывода последовательности окон сообщений с введенными ранее именами:
For i = 1 То iCount - 1
MsgBox i & "-e имя" & " - " & sNames(i)
Next
Количество повторений цикла For задается выражением i = 1 То iCount - 1. Необходимость вычитания единицы из значения переменной iCount возникла из-за того, что эта переменная изменяет свое значение в начале цикла Do еще до проверки условий, по которым заканчивается этот цикл. Если вы хотите посмотреть, что получится, если не вычитать единицу из переменной iCount, удалите -1 в операторе For и выполните процедуру сначала. В конце выполнения процедуры вы получите лишнее окно сообщения с обычным текстом вывода имен, но без самого имени.
Резюме
В этом часе мы изучили механизмы VBA для создания циклических вычислений (операторы циклов For и Do) и на примерах показали способы их применения. Мы также рассмотрели пример совместного использования динамических массивов и операторов цикла.