- •Оглавление
- •Введение
- •1. Объекты ms Excel
- •1.1. Объекты, их свойства и методы
- •1.1.1. Свойства: присвоение и использование значений
- •1.1.1.1. Присвоение значений
- •1.1.1.2. Использование значений
- •1.1.2. Примеры использования методов рабочей книги Excel
- •1.1.2.1. Вызов метода
- •1.1.2.2. Передача аргумента в метод
- •1.2. Ссылки на одиночные объекты и объекты из семейств
- •1.2.1. Различия между одиночными объектами и объектами из семейств
- •1.2.2. Семейства как объекты
- •1.2.3. Ссылка на объект
- •1.3. Иерархия объектов ms Excel
- •1.3.1. Иерархическая структура
- •1.3.2. Доступ к объектам через свойства и методы
- •1.4. Объект Application
- •1.4.1. Свойства объекта Application
- •1.4.2. Методы объекта Application
- •1.5. Объект Workbook и семейство Workbooks
- •1.5.1. Свойства объекта Workbook и семейства Workbooks
- •1.5.2. Методы объекта Workbook и семейства Workbooks
- •1.5.3. Функции, используемые для работы с файлами и папками
- •1.5.4. Функция MsgBox
- •1.5.5. Функция InputBox
- •1.6. Объект Worksheet
- •1.6.1. Свойства объекта Worksheet и семейства Worksheets
- •1.6.2. Методы объекта Worksheet и семейства Worksheets
- •1.7. Объект Range
- •1.7.1. Свойства объекта Range
- •1.7.2. Методы объекта Range
- •2. Использование переменных в vba
- •2.1. Допустимые имена
- •2.2. Типы данных переменных vba
- •2.3. Описание переменной
- •2.4. Использование переменных
- •2.5. Преимущества переменных
- •2.6. Объектные переменные
- •2.6.1. Задание объектной переменной
- •2.6.2. Объектные переменные общего типа
- •2.6.3. Объектные переменные конкретных типов
- •2.6.4. Преимущества объектных переменных
- •2.7. Неявное описание переменных и тип Variant
- •2.8. Обязательное описание переменных
- •2.9. Типы данных по умолчанию
- •2.10. Пользовательские типы данных
- •3. Массивы vba
- •3.1. Размерность массива
- •3.2. Объявление массива
- •3.3. Использование массива
- •3.4. Номер первого элемента и границы массива
- •3.5. Динамические массивы
- •3.6. Сохранение данных в динамическом массиве при изменении последней размерности
- •3.7. Пять функций для работы с массивами
- •4. Константы
- •5. Вызов одной программы из другой
- •5.1. Фрагментирование кода
- •5.2. Передача данных при вызове программы
- •6. Использование функций в vba
- •7. Область видимости переменных, констант, подпрограмм и функций
- •7.1. Область видимости переменных
- •7.1.1. Переменные уровня процедуры
- •7.1.2. Переменные уровня модуля
- •7.1.3. Переменные уровня проекта
- •7.1.4. Сохраняемые переменные
- •7.1.5. Область видимости подпрограмм и функций
- •7.1.6. Сохраняемые подпрограммы и функции
- •8. Управляющие структуры
- •8.1. Управляющая инструкция If-Then-Else
- •8.2. Управляющая инструкция Select Case
- •8.3. Управляющая инструкция For-Next
- •8.4. Управляющая инструкция For-Each-Next
- •8.4.1. Инструкция For-Each-Next с многомерными массивами
- •8.4.2. Инструкция For-Each-Next с семействами
- •8.5. Управляющая инструкция While-Wend
- •8.6. Управляющая инструкция Do-Loop
- •9. Инструкция With
- •10. Встроенные функции vba
- •10.1. Математические функции
- •10.2. Функции проверки типов
- •10.3. Функции преобразования форматов
- •10.4. Функции обработки строк
- •10.5. Функции времени и даты
- •11. Обработка ошибок
- •11.1. Предотвращение ошибок программными средствами
- •11.2. Обработка ошибок, инструкция On Error
- •12. Разработка пользовательского интерфейса
- •12.1. Форма (UserForm)
- •12.1.1. Вставка формы
- •12.1.2. Основные свойства и методы формы
- •12.1.3. События формы
- •12.2. Элементы управления формы vba
- •12.2.1. Некоторые общие свойства элементов управления
- •12.2.2. Соглашения об именах
- •12.2.3. Некоторые общие методы элементов управления
- •12.2.4. Общие события элементов управления
- •12.3. Кнопка (СоmmandButton)
- •12.4. Поле (TextBox)
- •12.5. Надпись (Label)
- •Начальные условия
- •Выполнение задания:
- •12.6. Список (ListBox)
- •12.6.1. Основные свойства элемента управления ListBox
- •12.6.2. Методы ListBox
- •12.6.3. Заполнение списка
- •12.6.4. Пример создания списка
- •12.6.5. Определение выбранных элементов списка
- •12.7. Поле со списком (ComboBox)
- •12.8. Флажок (CheckBox)
- •12.9. Выключатель (ToggleButton)
- •12.10. Переключатель (OptionButton)
- •12.11. Полоса прокрутки (ScrollBar) и счетчик (SpinButton)
- •12.12. Создание нестандартных меню и панелей инструментов
- •12.12.1. Объект CommandBar и семейство CommandBars
- •12.12.2. Методы объекта CommandBar
- •12.12.3. Свойства объекта CommandBar
- •12.12.4. Семейство CommandBarControls и объект CommandBarControl
- •12.12.5. Пример создания/удаления панели инструментов
- •12.12.5.1.Создание панели инструментов
- •12.12.5.2. Удаление панели инструментов
- •12.12.6. Пример создания/удаления меню
- •12.12.6.1. Создание меню
- •12.12.6.2. Удаление меню
- •13. Обработка событий объектов Workbook и Worksheet
- •13.1. События объекта Workbook
- •13.1.1. Событие Open
- •13.1.2. Событие BeforeClose
- •13.1.3. Событие SheetActivate
- •13.2. События объекта Worksheet
- •13.2.1. Событие Activate
- •13.2.2. Событие Deactivate
- •13.2.3. Событие SelectionChange
- •Библиография
7.1.6. Сохраняемые подпрограммы и функции
Подпрограмму и функцию можно сделать сохраняемыми. В результате сохраняемыми станут все переменные в этой подпрограмме или функции, как показано в примере.
Sub ВызовСтатическойПодпрограммы()
СтатическаяПодпрограмма
СтатическаяПодпрограмма
End Sub
Static Sub СтатическаяПодпрограмма()
Dim Var1 As String
If Var1 = "" Then
Var1 = "Var1 ещё не статическая переменная "
Else
Var1 = " Var1 – статическая переменная."
End If
MsgBox Var1
End Sub
Переменная Var1 определяется и получает значение в программе СтатическаяПодпрограмма. Она является сохраняемой, поскольку подпрограмма определена с ключевым словом Static. Программа СтатическаяПодпрограмма вызывается дважды, оба раза выводит на экран информационное окно, где во второй раз подтверждается, что значение Var1 действительно сохранилось.
8. Управляющие структуры
Управляющие структуры VBA эквивалентны подобным структурам в других языках программирования, за исключение инструкции For-Each-Next.
Ниже перечислены основные управляющие структуры VBA.
Управляющая структура |
Действие |
If-Then-Else |
Выполняет группу инструкций, если соблюдено некоторое условие |
Select Case |
В зависимости от значения некоторой переменной или результата проверки условия выполняет одну из нескольких возможных групп инструкций |
For-Next |
Выполняет группу инструкций заданное число раз |
For-Each-Next |
Выполняет действие над каждым объектом семейства или элементом массива |
While-Wend |
Выполняет группу инструкций, пока соблюдается некоторое условие |
Do-Loop |
Выполняет группу инструкций, пока соблюдается или не соблюдается некоторое условие |
Функционально они делятся на две группы:
перехода и выбора (GoTo, If-Then-Else, Select Case);
повтора (For-Next, While-Wend, Do-Loop, For-Each-Next).
Рассмотрим подробнее действие этих структур.
8.1. Управляющая инструкция If-Then-Else
Условная инструкция If-Then-Else изменяет порядок выполнения программы в зависимости от результатов проверки некоторого условия.
Sub IfThenElse()
Dim Num1 As Integer
Num1 = GetRandomNumber
If Num1 = 7 Then
MsgBox "Поздравляю! Вы выиграли! Выпало число " & Num1 & "."
Else
MsgBox "Сожалею, но Вы проиграли. Выпало число " & _ Num1 & "."
End If
End Sub
Function GetRandomNumber()
GetRandomNumber = Int(10 * Rnd())
End Function
В процедуре IfThenElse вызов функции GetRandomNumber присваивает переменной Num1 случайное значение от 0 до 9. Затем в инструкции If происходит проверка условия: Num1 = 7. Если результат проверки равен True (Num1 равно 7), на экран выводится информационное окно с сообщением о выигрыше:
Если результат проверки равен False (Num1 не равно 7), на экран выводится другое окно – с сообщением о проигрыше:
Рассмотрим отдельные элементы инструкции If-Then-Else.
Элемент |
Описание |
If |
Ключевое слово, отмечающее начало инструкции If-Then-Else |
Num1 = 7 |
Условие для проверки. Первое условие всегда указано после ключевого слова If. Результатом проверки является одно из двух значений – True или False, которое и определяет порядок выполнения команд в инструкции If-Then-Else. Если условие соблюдено (True), управление передается инструкции, написанной сразу за ключевым словом If, следует до инструкции перед ключевым словом Else, а затем переходит к инструкции после ключевых слов End If. Если условие не выполнено (False), управление передается инструкции после ключевого слова Else и следует до ключевых слов End If |
Then |
Ключевое слово, отмечающее конец условия |
MsgBox "Поздравляю! Вы выиграли! Выпало число " & Num1 & "." |
Инструкция, выполняемая при положительном результате проверки |
Else |
Ключевое слово, отмечающее конец блока инструкций, выполняемых при положительном результате проверки, и начало блока инструкций, выполняемых при отрицательном результате проверки |
MsgBox "Сожалею, но Вы проиграли. Выпало число " & Num1 & "." |
Инструкция, выполняемая при отрицательном результате проверки |
End If |
Ключевые слова, отмечающие конец инструкции If-Then-Else |
В инструкции If-Then-Else ключевое слово Else и следующий за ним блок инструкций не являются обязательными. Если эти элементы отсутствуют, при отрицательном результате проверки управление передается инструкции, стоящей после ключевых слов End If.
Как вы уже убедились на предыдущем примере, средствами If-Then-Else можно организовать выполнение инструкции в зависимости от соблюдения определенного условия. Рассмотрим другой вариант ее использования, на этот раз с ключевым словом ElseIf. Программа IfThenElseIf отображает запрос на ввод пароля. Если пароль введен правильно, программа предоставляет пользователю определенные возможности работы с рабочей книгой и сообщает ему об этом.
Sub IfThenElseIf()
Dim Password As String
Password = Get Password
If Password = "level1" Then
For Each Sheet In ActiveWorkbook.Sheets
Sheet.Visible = True
Sheet.Unprotect
Next
MsgBox "У Вас есть доступ ко всем листам этой книги."
Elself Password = "level2" Then
ActiveWorkbook.Worksheets(l). _
Visible = True
ActiveWorkbook.Worksheets(1). _
Unprotect
MsgBox "У Вас есть доступ только к 1-му листу книги."
Elself Password = "level3" Then
ActiveWorkbook.Worksheets(l).Visible = True
MsgBox "Вам доступен для чтения первый лист."
Else
MsgBox "Пароль введен неверно. Попробуйте ещё раз!"
End If
End Sub
Function GetPassword()
GetPassword = LCase(InputBox _
("Введите пароль:", "Password"))
End Function
ЗАМЕЧАНИЯ. 1. Во 2-й строке функции GetPassword используется встроенная функция LCase, которая преобразует все буквы переданной в нее строки в строчные.
2. Чтобы не отображать символы пароля на экране при его вводе, придется сконструировать форму с текстовым полем. Подробнее см. пример создания формы для ввода пароля на с. 141.
В программе IfThenElseIf ключевое слово Elself с последующим условием используется дважды. Новое условие вносит в порядок выполнения команд дополнительные изменения, если проверка первого условия закончилась неудачей. Первое условие указано сразу за ключевым словом If. В нем проверяется равенство переменной Password строке "level1". Если переменная не равна строке, VBA переходит к первому ключевому слову Elself, где проверяет следующее условие – равенство переменной Password строке "level2". Начиная с этого момента, программа использует только новое условие, «забывая» о старом. Если равенства опять нет, управление переходит к следующему ключевому слову Elself и т.д.
Просматривая IfThenElseIf, вы, вероятно, обратили внимание на несколько интересных моментов. В блоке, начинающемся сразу за ключевым словом If, помещен цикл For-Each-Next. В этом цикле перебираются все листы активной рабочей книги, с каждой из которых выполняются два действия: свойству Visible присваивается значение и вызывается метод Unprotect. Первое действие позволяет пользователю выделить лист, второе снимает с листа защиту паролем. У метода Unprotect есть один аргумент – строка с паролем. Но в данном случае пароль для защиты листов мы не использовали, поэтому Unprotect вызван без аргументов. В других блоках программы свойство Visible и метод Unprotect вызываются выборочно, в зависимости от введенного пароля.
