
- •Оглавление
- •Введение
- •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
- •Библиография
1.2.3. Ссылка на объект
Как уже говорилось, на одиночный объект ссылаются непосредственно, а к объекту в семействе обращаются по его номеру или имени.
Рассмотрим сначала ссылку на одиночный объект Application. Чтобы задать свойство Caption (заголовок приложения Excel), необходимо обратиться непосредственно к объекту Application:
Application.Caption = "Мое приложение"
Ссылка на семейство рабочих книг Workbooks – тоже одиночный объект – запишется следующим образом:
КолОткрытыхКниг = Workbooks.Count
В данной команде значение свойства Count (количество открытых рабочих книг) присваивается переменной КолОткрытыхКниг.
Обратимся теперь к объекту семейства. Ссылка на рабочую книгу – объект семейства Workbooks – может включать либо номер1 этой книги в семействе:
Автор = Workbooks(i).Author
либо её название2:
Автор = Workbooks("Мои таблицы.xls").Author
ВНИМАНИЕ! При обращении к объекту семейства обязательно используйте в имени семейства множественное число (Workbooks, Worksheets…). Это правило выполняется для всех семейств Excel, кроме Range и SeriesCollection.
Исключение: объект Range
Один из объектов Excel – Range, определяющий ссылку на ячейку или диапазон ячеек рабочего листа Excel, – не попадает ни в одну из этих категорий. Это одиночный объект, обладающий, тем не менее, некоторыми свойствами семейства. Например, чтобы обратиться к ячейке или конкретному диапазону ячеек, надо указать его адрес или имя, как в случае с объектом семейства. Например, изменить содержимое ячейки A1 можно с помощью следующей команды:
Range("A1").Value = 1
Команда: Range(1).Value = 1 вызовет сообщение об ошибке.
Задавая свойство или вызывая метод объекта Range, можно использовать диапазон из нескольких ячеек. Для задания свойства Value ячеек из интервала адресов B1:E4 применяется следующая инструкция:
Range("B1:E4").Value = 1
1.3. Иерархия объектов ms Excel
Объекты Excel расположены на разных уровнях. Некоторые из них включены в другие объекты. Уровни удобно представлять в виде иерархической структуры (Рис. 1.1). Имена семейств написаны в прямоугольниках, а имена объектов семейств заключены в круглые скобки.
1.3.1. Иерархическая структура
Верхняя ступень иерархии Excel занята единственным объектом – Application. Он представляет собой приложение Excel и располагается надо всеми остальными объектами.
На второй ступени находятся пятнадцать объектов, среди которых стоит выделить следующие:
Window – открывает доступ к различным окнам Excel;
Workbook – представляет файл рабочей книги;
WorksheetFunction – используется для вызова функции рабочего листа из программы.
Третью, четвертую и пятую ступени занимают различные объекты, открывающие доступ к возможностям, предоставляемым объектами второй ступени.
Рис. 1.1. Иерархия объектов MS Excel
Рис. 1.1. Иерархия объектов Excel (окончание)
Каким образом иерархия объектов влияет на способ написания программы VBA?
Предположим, вы пишете подпрограмму для задания свойства Value объекта Range, представляющего первую ячейку первого рабочего листа первой книги Excel. Из иерархических схем видно, что он располагается «под» объектом Worksheet, который, в свою очередь, подчиняется последовательно объектам Workbook и Application. Поэтому полная запись пути к нему выглядит так1:
Application.Workbooks(l).Worksheets(l). _ Range("A1").Value = 1
Хотя эта инструкция будет выполнена корректно, далеко не всегда при вызове метода или задании свойства нужно указывать генеалогическое древо объекта полностью. Количество объектов-предков, которые необходимо перечислять в программе, зависит от конкретных обстоятельств.
Инструкция, показанная выше, будет выполнена в любом месте программы и всегда присвоит свойству Value первой ячейки A1 первого листа первой книги значение 1, поскольку в ней путь к объекту Range указан полностью, начиная с объекта Application. Но если код выполняется в Excel, что чаще всего и бывает, ссылка на объект Application не обязательна. При отсутствии такой явной ссылки VBA будет считать, что программа выполняется для объекта, представляющего Excel, поэтому обращение к нему из инструкции можно убрать:
Workbooks(1).Worksheets(1).Range("A1).Value = 1
Далее, если нужная вам книга является активной, то ссылку на неё можно опустить, и тогда команда запишется так:
Worksheets(1).Range("A1).Value = 1
То же самое относится к рабочему листу: если в рабочей книге всего один лист или первый лист является активным, то ссылку на первый лист можно убрать, и тогда инструкция запишется так:
Range("A1").Value = 1
Некоторые объекты Excel имеют «свойство по умолчанию». У объекта Range свойством по умолчанию является Value (значение), что позволяет еще более сократить код2:
Range("A1") = 1
Для того чтобы ссылаться на активную книгу, воспользуйтесь ссылкой на объект Workbook под именем ActiveWorkbook:
ActiveWorkbook.Worksheets(1).Range("A1").Value = 1
Эта команда изменяет значение в ячейке активной рабочей книги (необязательно первой).
Ссылка ActiveSheet, подобно ссылке ActiveWorkbook, служит для обращения к активному рабочему листу. Инструкция для изменения свойств активного листа имеет следующий вид:
ActiveSheet.Range("A1").Value = 1
Для обращения к активному диапазону, т.е. к группе выделенных ячеек, используется также свойство Selection объекта Application. Однако оно может ссылаться не только на объекты Range. При выполнении программы VBA определяет значение свойства Selection в соответствии с выделенным в данный момент объектом. Поэтому свойства по умолчанию (из-за разных объектов) нет.
Selection.Value = 1
Выполнение этой команды вызывает присвоение значения выделенному диапазону, будь это Range("Al")или Range("G7:N25").