
- •Часть 1.
- •1.1 Введение
- •1.2 Правила оформления конструкций языка vba в общем виде
- •1.3 Идеология визуальных языков
- •1.4 Основные понятия визуальных языков
- •1.5 Дополнительные понятия языка vba
- •2 Переменные и константы
- •2.1 Структура модуля
- •2.2 Объявление переменных и констант
- •Имя_Модуля1.Имя_Поля
- •2.2.2 Неявное и явное объявление переменных ( Оператор Option Explicit )
- •2.3 Неименованные константы
- •2.4 Оператор присваивания
- •2.4.1 Арифметические выражения
- •2.4.2 Строковые выражения
- •2.4.3 Логические выражения
- •Сравнение строковых переменных в логических выражениях
- •2.4.4 Выражения Data
- •2.4.5 Выражения Variant
- •2.4.6 Смешанные выражения
- •2.5 Функции определения типа переменной
- •2.6 Функция форматного преобразования переменной в строковый формат
- •3 Подпрограммы ( процедуры и функции )
- •3.1 Описание подпрограмм
- •3.2 Входные параметры подпрограммы
- •3.3 Вызов подпрограмм
- •3.3.1 Изменение вида входного параметра при вызове подпрограммы
- •3.4 Описание событийной процедуры объекта
- •3.5 Рекурсивные подпрограммы (процедуры и функции)
- •4 Операторы vba
- •4.1 Условный оператор If
- •4.2 Оператор выбора Case
- •4.3 Операторы цикла
- •4.3.1 Циклы for Оператор цикла For .. Next
- •Оператор цикла For Each .. Next
- •Досрочный выход из циклов For
- •4.3.2 Оператор цикла While .. Wend
- •4.3.3 Циклы do Оператор цикла Do While .. Loop
- •Оператор цикла Do .. Loop Until
- •Другие циклы do
- •Досрочный выход из циклов do
- •4.4 Оператор еnd (досрочное завершение программы)
- •4.5 Оператор Exit (досрочный выход из подпрограмм и циклов)
- •4.6 Оператор перехода goto
- •4.7 Оператор On Error (обнаружения ошибок)
- •4.8 Оператор With (обращения к полям структурированных типов, а так же к методам и к потомкам объектов)
- •4.9 Оператор Set (установка и снятие указателя )
- •4.10 Оператор New (создание экземпляров)
- •4.11 Оператор DoEvents (Прерывание работы подпрограммы)
- •4.12 Оператор Shell (Запуск исполняемых файлов)
- •4.13 Оператор AppActivate (Активизация окна другой программы)
- •4.14 Оператор SendKeys (Эмуляция нажатия на клавиши)
- •4.15 Вложенность структур операторов
- •5 Структурированные типы vba
- •5.1 Введение
- •5.2 Массивы
- •5.2.1 Статический массив
- •5.2.2 Динамический массив
- •5.2.3 Объявление массива через функцию Array
- •5.2.4 Функции определения размерности массива
- •5.2.5 Опрос, ввод и вывод в цикле ячеек массива
- •5.2.6 Массивы массивов
- •5.2.7 Поиск максимума и минимума в массиве
- •5.2.8 Сортировка массива
- •5.2.9 Оператор высвобождения памяти занятой динамическим массивом и обнуления ячеек статического массива (Erase)
- •5.3 Записи ( и массивы записей)
- •5.3.1 Запись с константными полями
- •5.4 Семейства (Коллекции)
- •5.5 Объекты
- •5.5.1 Введение
- •5.5.2 Объект Application
- •5.5.3 Объекты ActiveWorkbook, ThisWorkbook, Workbooks (связь с книгой Excel)
- •5.5.4 Объекты ActiveSheet, Worksheets (связь с листом книги Excel)
- •5.5.5 Объекты Rows, Columns ,Range, Cells, Selection, ActiveCell (связь со строками, столбцами и ячейками листа Excel)
- •5.5.6 Элементы управления
- •Элемент управления CommandButton (Кнопка)
- •Элементы управления CheckBox, OptionButton (Флажок, Переключатель)
- •Элемент управления TextBox (текстовый редактор)
- •Элементы управления ListBox, ComboBox (Список ,Поле со списком)
- •Элементы управления ScrollBar ,SpinButton (Полоса прокрутки ,Счетчик)
- •Элемент управления Imаge (Рисунок)
- •5.6 Объект Форма
- •6 Диалоги
- •7 Работа с файловой системой
- •7.1 Введение
- •7.1.3 Работа с файловой системой через программу Мой компьютер (My Computer)
- •7.2 Функция dir ( Просмотр содержимого директории и определение наличия файла на диске)
- •7.3 Работа с дисковым пространством
- •7.3.1 Дополнительные функции для работы с дисковым пространством
- •7.4 Работа с файлами
- •7.4.1 Работа с текстовым файлом
- •7.4.2 Работа с двоичным файлом
- •7.4.3 Работа с файлом произвольного типа данных
- •7.5 Просмотр содержимого ярлыка
- •7.6 Функция Environ (Определение местонахождения служебных директорий Windows)
- •Оглавление
- •2 Переменные и константы 9
- •3 Подпрограммы ( процедуры и функции ) 34
- •4 Операторы vba 47
- •5 Структурированные типы vba 70
- •5.3 Записи ( и массивы записей) 83
- •5.4 Семейства (Коллекции) 85
- •5.5 Объекты 87
- •6 Диалоги 119
- •7 Работа с файловой системой 122
- •Часть 1
3.3.1 Изменение вида входного параметра при вызове подпрограммы
Даже если входной параметр подпрограммы описан как ByRef , VBA позволяет изменить его вид на ByVal при вызове подпрограммы. Для этого, имя переменной, которая изменяет значение входного параметра, берется в круглые скобки. Переменная, имя которой взята в скобки не получает ссылку от входного параметра.
Пример:
‘Принудительный запрет ссылки от входного параметра для переменных A и С в функции
A1 = ИмяФункции( (А), B, (С) )
‘Принудительный запрет ссылки от входного параметра для переменных A и С в процедуре
ИмяПроцедуры (А), B, (С)
Указанный нами способ смены вида входного параметра при вызове подпрограммы применяют, например, в том случаи, если возникает конфликт типов входного параметра и переменной задающей ему значение. Или если не хотят получать значение от входного параметра объявленного как ByRef.
3.4 Описание событийной процедуры объекта
Событийная процедура не отличается по идеологии от обычной процедуры, но она, в отличии от обычной процедуры, выполнятся во время определенного события происходящего с объектом, формат ее описания следующий:
PRIVATE SUB ИМЯОбъекта_ИмяСобытия ( [ Входные параметры процедуры ] )
Тело процедуры
.
.
[Exit Sub]
.
.
END SUB
Заголовок событийной процедуры не вводится программистом VBA с клавиатуры, для ввода событийной процедуры используется два списка, расположенных над окном редактора модуля VBA. Из левого списка выбирается имя объекта, из правого событие происходящее с объектом (см. главу 2.1 Структура модуля), после чего, в редакторе модуля появляется пустая событийная процедура.
Событийная процедура описывается как PRIVATE, т.е. эта процедура не доступна в других модулях, т.к. программист обычно эту процедуру не вызывает из других подпрограмм проекта. Хотя есть возможность заменить программисту тип этой процедуры на PUBLIC, и вызывать ее из других модулей, используя полный путь к данной процедуре.
3.5 Рекурсивные подпрограммы (процедуры и функции)
Возможна рекурсия подпрограммы (процедуры или функции). Рекурсия подпрограммы происходит тогда, когда подпрограмма вызывает выполнение самой себя. Классическим примером рекурсии является функция вычисляющая факториал числа n (n!). Аргументом функции факториал может быть целое число большее или равное 0. Формула факториала следующая:
Пример вычисления факториала чисел 0,1,2,3 :
0! =1
1! =1
2! = 2 * 1 = 2
3! = 3 * 2 * 1 = 6
Для вычисления факториала в VBA применим следующую рекурсивную функцию:
Function fact(ByVal n As Byte) As Double
If n <= 2 Then
fact = n
Else
fact = fact(n - 1) * n
End If
End Function
Иногда, в данном примере, в операторе If устанавливают другое условие выполнения ( n <= 1), но это излишни, поскольку n*1 = n.
При вычислении факториала числа 3 указанной нами функции, с начало, переменная n будет равна 3 и произойдет первый рекурсивный запуск функции fact. При этом, значение переменой n=3 будет помещено в специальную область памяти, называемую стек. А переменная n примет значение n=2, после того, как функция fact будет вызвана снова. При n=2, как видно из программы, функция fact примет значение переменной n, т.е. fact = 2. Затем, будет вычислено произведение функции со всеми значениями переменной n находящимися в стеке. Т.е. значение функции fact станет fact = fact * 3 = 2 * 3 =6. В стек может помещаться несколько значений переменной, поэтому данной функцией можно вычислить факториал чисел 4, 5 и т.д.
Возможно переполнения стека. Но в нашем примере таково не произойдет, потому, что раньше произойдет переполнения разрядной сетки для типа функции Double. Не целый, числовой тип функции fact задан нами не случайно, если бы мы использовали тип Long, то данной функцией можно было бы вычислить факториал до числа 12, при использовании типа Double можно вычислить факториал до числа 170. Переполнение стека часто возникает из-за неправильно составленной программы. Возможна ситуация при которой процедура или функция будет вызывать себя постоянно, что вызовет переполнения стека. Например, если запустить процедуру, указанную нами ниже, то произойдет ошибка “недостаточно стековой памяти”, из-за того, что в стеке будет содержаться слишком много вызовов процедуры NN.
Sub NN()
NN
End Sub
В языке VBA допускается использование имени функции внутри выражения, при этом, если в теле функции имеется выражение в котором используется ее собственное имя, но за именем функции не указываются входные параметры последней, то рекурсия для функции не происходит. В примере ниже показана такая ситуация. Функция SA предназначена для вычисления среднего арифметического всех входных необязательных параметров функции.
Function SA( ParamArray V())
Dim n , D as long
SA = 1
D = 0
For Each n In V
SA = SA * n
D = D +1
Next n
SA = SA / D
End Function