
- •Оглавление
- •Введение
- •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
- •Библиография
3.4. Номер первого элемента и границы массива
До сих пор во всех примерах массивов мы начинали нумерацию элементов с 1. Как уже упоминалось, можно начинать ее с 0, 1 или любого другого числа. Правил здесь не существует: одни разработчики предпочитают 0, другие – 1. В VBA для выбора между 0 и 1 используется инструкция Option Base, которую помещают в начало модуля VBA. Если этой инструкции нет, VBA по умолчанию использует в качестве первого номера 0.
Чтобы начать нумерацию массива с другого числа, вы должны в его объявлении указать верхнюю и нижнюю границы. Как это сделать, продемонстрируем в следующем примере:
Sub НомерПервогоЭлемента()
Dim Data4(4 To 5) As Integer
Data4(4) = lnt(100 * Rnd())
Data4(5) = Int(100 * Rnd())
MsgBox "Выиграли лотерейные номера:" & _
Data4(4) & ", " & Data4(5)
End Sub
Здесь описан одномерный 2-элементный массив Data4. Числа, заключенные в круглые скобки после имени массива, задают его нижнюю и верхнюю границы. В данном случае номера двух элементов массива будут равны 4 и 5.
3.5. Динамические массивы
Кроме описанных массивов фиксированного размера в VBA есть массивы еще одного вида – динамические. До сих пор мы всегда явно указывали размерность массива в инструкции. При описании динамического массива его размер не указывается. Он определяется позже, при выполнении кода.
Динамический массив удобен, если вы предполагаете, что в ходе выполнения программы его размер может измениться. В этой ситуации можно сэкономить память: сделайте так, чтобы размеры массивов точно соответствовали вашим текущим потребностям. В противном случае вы рискуете создать массивы, которые только попусту занимают место, что плохо отразится на производительности.
Рассмотрим динамический массив подробнее. В процедуре ДинамическийМассив массив Data5 сначала (с помощью инструкции ReDim) объявлен как одномерный 2-элементный массив, а затем как двухмерный 30-элементный:
Sub ДинамическийМассив()
Dim Data5() As Variant
ReDim Data5(2)
Data5(1) = Int(100 * Rnd())
Data5(2) = Int(100 * Rnd())
MsgBox "Выиграли лотерейные номера: " & _
Data5(1) & ", " & Data5(2)
ReDim Data5(10,3)
Data5(1,1) = "Иванов"
Data5(1,2) = #3/21/1947#
Data5(1,3) = Year(Date)-Year(Data5(1,2))
MsgBox Data5(1,1) & ", возраст " & _
Data5(1,3) & ", родился " & Data5(1,2)
End Sub
Сначала в строке 2 мы описали массив Data5 типа Variant, не указывая число измерений и элементов. В этой инструкции определяется динамический массив, но память под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив Data5 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном окне. В строке 7 инструкция ReDim используется еще раз для описания Data5 как двухмерного массива, содержащего 30 элементов. Хранившиеся в массиве данные пропадают. Затем элементам первой строки этого массива присваиваются значения и выводятся в информационном окне. Так, позволяя поочередно отводить один и тот же массив под разные данные, инструкция ReDim и динамический массив экономят память при выполнении программы.
Кроме того, динамический массив удобен тогда, когда вы не знаете, сколько записей будет в вашем массиве. Следующий пример демонстрирует эту ситуацию:
1. Пусть имеется база данных (БД) Excel, в которой хранятся сведения о сотрудниках института (рис. 3.2). Количество записей в БД может меняться.
Рис. 3.2. Фрагмент БД
2. Требуется сформировать двумерный массив с данными о доцентах, работающих в институте. В массиве должна храниться следующая информация: кафедра, Ф.И.О., разряд.
Для этого напишем следующий код:
Option Base 1
Sub МассивДоценты()
Dim Сотрудники() As String
Dim КолДоцентов As Integer
Dim НомерСтроки As Integer
КолДоцентов = 0
НомерСтроки = 3
While Cells(НомерСтроки,2).Value <> ""
If Cells(НомерСтроки,3).Value = _
"Доцент" Then КолДоцентов = КолДоцентов + 1
НомерСтроки = НомерСтроки + 1
Wend
ReDim Сотрудники(КолДоцентов, 3)
For i = 1 To НомерСтроки - 1
If Cells(НомерСтроки,3).Value = "Доцент" Then
Сотрудники(i,1) = Cells(НомерСтроки,1).Value
Сотрудники(i,2) = Cells(НомерСтроки,2).Value
Сотрудники(i,3) = Cells(НомерСтроки,3).Value
End If
Next
MsgBox "Массив сформирован! В нем содержится " _
& КолДоцентов & " записей."
End Sub
Так как количество записей заранее неизвестно, воспользуемся управляющей структурой While-Wend (строки 812, подробнее см.8.4). Эта конструкция позволяет выполнять группу инструкций до тех пор, пока соблюдается некоторое условие (в данном примере – вторая ячейка в строке не должна быть пустой1).
Просматривая БД, считаем количество доцентов и запоминаем его в переменной КолДоцентов.
После того как все записи БД «просмотрены», ещё раз объявляем динамический массив как двумерный массив с известным количеством записей (строка 13). Далее заполняем этот массив записями, отвечающими заданному критерию отбора (строки 1420).