- •Оглавление
- •Введение
- •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
- •Библиография
2.8. Обязательное описание переменных
Другая возможность VBA позволяет быть уверенным, что все переменные обязательно будут явно описаны в программе, и избежать всех недостатков использования типа Variant. Сделать описание переменных обязательным можно одним из двух способов:
во-первых, поместить в область описаний модуля (т. е. в его начало – перед всеми подпрограммами и функциями) инструкцию Option Explicit;
во-вторых, выбрать из меню Сервис (Tools) редактора Visual Basic команду Параметры (Options), перейти на вкладку Редактор (Editor) и установить флажок Явное описание переменных (Require Variable Declaration). Редактор будет вставлять команду Option Explicit в начало любого нового модуля VBA. Имейте в виду, что на уже существующие модули этот способ не подействует. На рис. 2.1 флажок Явное описание переменных (Require Variable Declaration) установлен.
В приведенном ниже примере используется инструкция Option Explicit.
Option Explicit
Sub С_ОбъявлениемПеременной ()
Dim String1 As String
String1 = "Привет!"
MsgBox String1
End Sub
Если вы вставите в модуль (перед всеми подпрограммами и функциями) инструкцию Option Explicit, но уберете из программы БезОбъявленияПеременной инструкцию Dim, VBA выдаст сообщение об ошибке при попытке запустить программу:
Option Explicit
Sub БезОбъявленияПеременной()
String1 = "Привет!"
MsgBox String1
End Sub
Рис. 2.1. Включение явного описания переменных
Попытка запустить БезОбъявленияПеременной вызывает ошибку:
Чтобы избежать этого, вставьте в код инструкцию Dim для переменной String1 или уберите инструкцию Option Explicit.
2.9. Типы данных по умолчанию
Чтобы неописанным переменным по умолчанию не присваивался тип Variant, поместите в начало модуля инструкцию DefType. Например, чтобы присваивать всем необъявленным переменным тип Integer, вставьте перед всеми подпрограммами инструкцию
DefInt A-Z
Аргументы A–Z после ключевого слова DefInt означают, что все необъявленные переменные, имена которых начинаются с А–Z (независимо от регистра), будут считаться целыми. Средствами нескольких инструкций DefType можно задать, чтобы тип переменной определялся по первой букве ее имени. Например, если Вы вставите в начало модуля приведенные ниже инструкции, все переменные с именами, начинающимися на I, приобретут тип Integer, переменные с буквы S – тип String, переменныe с буквы С – тип Currency:
DefInt I
DefInt S
DefInt C
Если в начале модуля нет инструкций DefType, всем необъявленным переменным будет присвоен тип Variant.
ЗАМЕЧАНИЕ. В одной строке кода VBA можно размещать несколько инструкций, разделяя их двоеточием:
DefInt I: DefStr S: DefCur С
2.10. Пользовательские типы данных
VBA позволяет разработчику создавать собственные типы данных, подобные структурам или записям, применяемым в других языках программирования. Пользовательские типы данных определяются как комбинации стандартных типов данных VBA. Их средствами вы вправе помещать в одну переменную несколько значений различных типов. Определение переменной пользовательского типа несколько сложнее, чем определение переменной одного из стандартных типов, – сначала вам придется определить сам тип. Определения типов всегда помещают в начало модуля VBA:
Type Персона
Имя As String
ДатаРождения As Date
Возраст As Integer
End Type
Рассмотрим компоненты этого определения пользовательского типа.
Компонент |
Описание |
Туре |
Ключевое слово, отмечающее начало определения типа |
Персона |
Имя пользовательского типа |
Имя As String |
Первый элемент пользовательского типа |
ДатаРождения As Date |
Второй элемент пользовательского типа |
Возраст As Integer |
Третий элемент пользовательского типа |
End Type |
Ключевые слова, отмечающие конец определения типа |
Когда эта инструкция помещена в начало модуля, она определяет пользовательский тип Персона, состоящий из трех элементов: строки Имя, целого числа Возраст и даты ДатаРождения.
Как используется переменная такого типа? Рассмотрим пример.
Type Персона
Имя As String
ДатаРождения As Date
Возраст As Integer
End Type
Sub ПользовательскийТипПеременной()
Dim User1 As Персона
User1.Имя = "Иванов”
User1.ДатаРождения = #2/23/75#
User1.Возраст = Year(Date) - _
Year(User1.ДатаРождения)
MsgBox User1. Имя & ", возраст " & _
User1.Возраст & " дата рождения " & _
User1.ДатаРождения
End Sub
Во второй строке объявлена переменная Userl пользовательского типа Персона. Затем в строках 3, 4 и 5 различным элементам этой переменной присваиваются значения: Иванов для Имя, #2/23/75# для ДатаРождения, а Возраст есть разность между текущим годом (Year(Date)1) и годом рождения (Year(User1.ДатаРождения)). В шестой строке элементы переменой Userl выводятся в информационное окно
Обратите внимание на символ продолжения в конце шестой строки.
В вышеприведенном примере мы впервые использовали литерал даты – значение даты, ограниченное значками #. Такую форму записи применяют всякий раз, когда присваивают переменной типа Date дату в численном выражении. Литерал даты напоминает обычную текстовую строку, ограниченную символами #, а не кавычками.
