- •Оглавление
- •Введение
- •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.6. Сохранение данных в динамическом массиве при изменении последней размерности
В рассмотренном примере наблюдается такая несуразица, как двойная проверка условия «Должность = Доцент»: первый раз соответствие записи этому критерию осуществлялось при подсчете количества записей, а второй раз – при выборке информации. Возникает вопрос: а возможно ли при нахождении нужной записи сразу добавлять информацию в динамический массив? Оказывается, да, возможно. Для этого используется ключевое слово Preserve (сохранить). Следующий код демонстрирует эту возможность:
Sub МассивДоценты_СохранениеДанных()
Dim Сотрудники() As String
Dim КолДоцентов As Integer
Dim НомерСтроки As Integer
КолДоцентов = 0
НомерСтроки = 3
While Cells(НомерСтроки,2).Value <> ""
If Cells(НомерСтроки,3).Value = "Доцент" _
Then КолДоцентов = КолДоцентов + 1
ReDim Preserve Сотрудники(3,КолДоцентов)
Сотрудники(1,КолДоцентов) = _
Cells(НомерСтроки,1).Value
Сотрудники(2,КолДоцентов) = _
Cells(НомерСтроки,2).Value
Сотрудники(3,КолДоцентов) = _
Cells(НомерСтроки,3).Value
End If
НомерСтроки = НомерСтроки + 1
Wend
MsgBox "Массив сформирован! В нем содержится " _
& КолДоцентов & " записей."
End Sub
В строке 9 этого кода при выполнении критерия отбора счетчик увеличивается на 1 и (строка 10) в оперативной памяти выделяется место для следующей записи. При этом предыдущие записи сохраняются. При отсутствии ключевого слова Preserve при повторном определении динамического массива память выделяется заново, при этом все данные уничтожаются.
ОБРАТИТЕ ВНИМАНИЕ: при использовании ключевого слова Preserve, изменяемая размерность должна быть последней. Это значит, что команда:
ReDim Preserve Сотрудники(КолДоцентов, 3)
недопустима!
3.7. Пять функций для работы с массивами
С массивами VBA чаще всего используют пять функций: Array, Erase, IsArray, LBound и UBound. Кратко расскажем о каждой из них.
Функция Array позволяет создавать массив в ходе выполнения программы, без предварительного описания:
Sub МассивБезОписания()
Data6 = Array("Иванов", 60, #3/21/1947#)
MsgBox Data6(1) & ", возраст " & Data6(2) _
& " родился " & Data6(3)
End Sub
Во второй строке программа МассивБезОписания функцией Array создается одномерный 3-элементный массив типа Variant фиксированного размера. Помните, что функция Array всегда возвращает массив Variant и использует нумерацию, заданную инструкцией Option Base.
Функция Erase используется для удаления данных, хранимых в элементах массива. Если это массив фиксированного размера, функция Erase лишь очищает его, а память, выделенная массиву, остается за ним. Динамический массив уничтожается функцией Erase полностью. Программа ФункцияErase демонстрирует удаление всех значений, записанных в массив фиксированного размера.
Sub ФункцияErase()
Dim Data7(2) As Integer
Data7(1) = Int(100 * Rnd())
Data7(2) = Int(100 * Rnd())
MsgBox "Лотерейные номера: " & Data7(1) & _
", " & Data7(2)
Erase Data7
MsgBox "Лотерейные номера: " & Data7(1) & _
", " & Data7(2)
End Sub
Здесь элементам массива присваиваются значения и выводятся в информационном окне. Затем для удаления содержимого массива вызывается функция Erase. Второй вызов функции MsgBox свидетельствует, что во всех элементах Data7 содержатся нули. В следующем примере показан вызов функции Erase для динамического массива.
Sub EraseДинамичМассив()
Dim Data8() As Integer
ReDim Data8(2)
Data8(1) = Int(100 * Rnd())
Data8(2) = Int(100 * Rnd())
MsgBox " Лотерейные номера: " & Data8(1) & _
", " & Data8(2)
Erase Data8
MsgBox " Лотерейные номера: " & Data8(1) & _
", " & Data8(2)
End Sub
Выполнение программы EraseДинамичМассив приводит к ошибке в строке 8, потому что функция Erase в предыдущей строке освободила всю память, занятую динамическим массивом. После этого VBA уже не может работать с индексами Data8 и обращение к этому массиву вызывает ошибку.
Функция IsArray – это встроенная функция VBA, которая позволяет проверить, является ли некоторая переменная массивом. IsArray принимает один аргумент и возвращает True (если переменная является массивом) или False (если переменная не является массивом). Такая операция полезна, например, когда вы вызываете функцию, возвращающую массив, но не уверены, что она действительно вернет его, а не обычную переменную. Действие IsArray продемонстрировано ниже:
Sub ФункцияIsArray ()
Dim Data9(2) As Integer
Dim ArrayBool As Boolean
ArrayBool = IsArray(Data9)
If ArrayBool = True Then
MsgBox "Data9 является массивом."
End If
End Sub
Конечно, этот пример не имеет практического смысла, но действие IsArray показано в нем ясно. Во второй строке объявлен массив, в третьей – логическая переменная ArrayBool. Далее этой переменной присваивается значение, возвращенное функцией IsArray (True или False). Инструкция If использована для проверки результата IsArray и вывода сообщения, если значение переменной ArrayBool равно True. Подробно эта инструкция описана в разделе «Управляющая инструкция If-Then-Else» на стр. 82.
Функции LBound и UBound помогут вам определить верхнюю и нижнюю границы индексов массива, как показано в следующем примере:
Sub Lbound_UBound()
Dim Data10(4 To 15) As Integer
MsgBox "Нижняя граница массива" & LBound(Datal0) & "."
MsgBox "Верхняя граница массива " & _
UBound(Datal0) & "."
End Sub
ЗАМЕЧАНИЕ. Применение этих функций к обычной переменной или динамическому массиву, не описанному инструкцией ReDim, вызывает ошибку при выполнении программы. Чтобы избежать этого, перед вызовом функций LBound и UBound проверьте переменную функцией IsArray.
