Знакомство с программированием в Excel. Управление объектами и коллекциями. Объекты, свойства и методы VBA

Создание пользовательской функции в VBA Excel, ее синтаксис и компоненты. Описание пользовательской функции и ее аргументов. Метод Application.MacroOptions.

Пользовательская функция - это процедура VBA, которая производит заданные вычисления и возвращает полученный результат. Используется для вставки в ячейки рабочего листа Excel или для вызова из других процедур.

Объявление пользовательской функции

Синтаксис функции

Function Имя ([СписокАргументов]) [Операторы] [Имя = выражение] [Операторы] [Имя = выражение] End Function

Компоненты функции

  • Static - необязательное ключевое слово, указывающее на то, что значения переменных, объявленных в функции, сохраняются между ее вызовами.
  • Имя - обязательный компонент, имя пользовательской функции.
  • СписокАргументов - необязательный компонент, одна или более переменных, представляющих аргументы, которые передаются в функцию. Аргументы заключаются в скобки и разделяются между собой запятыми.
  • Операторы - необязательный компонент, блок операторов (инструкций).
  • Имя = выражение - необязательный* компонент, присвоение имени функции значения выражения или переменной. Обычно, значение присваивается функции непосредственно перед выходом из нее.
  • Exit Function - необязательный компонент, принудительный выход из функции, если ей уже присвоено окончательное значение.

*Один из компонентов Имя = выражение следует считать обязательным, так как если не присвоить функции значения, смысл ее использования теряется.

Видимость функции

Видимость пользовательской функции определяется необязательными ключевыми словами Public и Private, которые могут быть указаны перед оператором Function (или Static, в случае его использования).

Ключевое слово Public указывает на то, что функция будет доступна для вызова из других процедур во всех модулях открытых книг Excel. Функция, объявленная как Public , отображается в диалоговом окне Мастера функций.

Ключевое слово Private указывает на то, что функция будет доступна для вызова из других процедур только в пределах программного модуля, в котором она находится. Функция, объявленная как Private , не отображается в диалоговом окне Мастера функций, но ее можно ввести в ячейку вручную.

Если ключевое слово Public или Private не указано, функция считается по умолчанию объявленной, как Public.

Чтобы пользовательская функция всегда была доступна во всех открытых книгах Excel, сохраните ее в без объявления видимости или как Public. Но если вы планируете передать рабочую книгу с пользовательской функцией на другой компьютер, код функции должен быть в программном модуле передаваемой книги.

Пример пользовательской функции

Для примера мы рассмотрим простейшую пользовательскую функцию, которой в следующем параграфе добавим описание. Называется функция «Деление», объявлена с типом данных Variant, так как ее возвращаемое значение может быть и числом, и текстом. Аргументы функции - Делимое и Делитель - тоже объявлены как Variant, так как в ячейках Excel могут быть числовые значения разных типов, и функция IsNumeric тоже проверяет разные типы данных и требует, чтобы ее аргументы были объявлены как Variant.

Function Деление(Делимое As Variant, Делитель As Variant) As Variant If IsNumeric(Делимое) = False Or IsNumeric(Делитель) = False Then Деление = "Ошибка: Делимое и Делитель должны быть числами!" Exit Function ElseIf Делитель = 0 Then Деление = "Ошибка: деление на ноль!" Exit Function Else Деление = Делимое / Делитель End If End Function

Эта функция выполняет деление значений двух ячеек рабочего листа Excel. Перед делением проверяются два блока условий:

  • Если делимое или делитель не являются числом, функция возвращает значение: «Ошибка: Делимое и Делитель должны быть числами!», и производится принудительный выход из функции оператором Exit Function.
  • Если делитель равен нулю, функция возвращает значение: «Ошибка: деление на ноль!», и производится принудительный выход из функции оператором Exit Function.

Если проверяемые условия не выполняются (возвращают значение False) производится деление чисел и функция возвращает частное (результат деления).

Вы можете скопировать к себе в стандартный модуль эту функцию и она станет доступна в разделе «Определенные пользователем» Мастера функций. Попробуйте вставить функцию «Деление» в ячейку рабочего листа с помощью Мастера и поэкспериментируйте с ней.

Практического смысла функция «Деление» не имеет, но она хорошо демонстрирует как объявляются, создаются и работают пользовательские функции в VBA Excel. А еще она поможет продемонстрировать, как добавлять к функциям и аргументам описания. С полноценной пользовательской функцией вы можете ознакомиться .

Добавление описания функции

В списке функций, выводимом Мастером, невозможно добавить или отредактировать их описание. Список макросов позволяет добавлять процедурам описание, но в нем нет функций. Проблема решается следующим образом:

  • Запустите Мастер функций, посмотрите, как отображается имя нужной функции и закройте его.
  • Откройте и в поле «Имя макроса» впишите имя пользовательской функции.
  • Нажмите кнопку «Параметры» и в открывшемся окне добавьте или отредактируйте описание.
  • Нажмите кнопку «OK», затем в окне списка макросов - «Отмена». Описание готово!

Добавление описания на примере функции «Деление»:

Описание функции «Деление» в диалоговом окне Мастера функций «Аргументы функции»:


С помощью окна «Список макросов» можно добавить описание самой функции, а ее аргументам нельзя. Но это можно сделать, используя метод Application.MacroOptions.

Метод Application.MacroOptions

Метод Application.MacroOptions позволяет добавить пользовательской функции описание, назначить сочетание клавиш, указать категорию, добавить описания аргументов и добавить или изменить другие параметры. Давайте рассмотрим возможности этого метода, используемые чаще всего.

Пример кода с методом Application.MacroOptions:

Sub ИмяПодпрограммы() Application.MacroOptions _ Macro:="ИмяФункции", _ Description:="Описание функции", _ Category:="Название категории", _ ArgumentDescriptions:=Array("Описание 1", "Описание 2", "Описание 3", ...) End Sub

  • ИмяПодпрограммы - любое уникальное имя, подходящее для наименования процедур.
  • ИмяФункции - имя функции, параметры которой добавляются или изменяются.
  • Описание функции - описание функции, которое добавляется или изменяется.
  • Название категории - название категории в которую будет помещена функция. Если параметр Category отсутствует, пользовательская функция будет записана в раздел по умолчанию - «Определенные пользователем». Если указанное Название категории соответствует одному из названий стандартного списка, функция будет записана в него. Если такого Названия категории нет в списке, будет создан новый раздел с этим названием и функция будет помещена в него.
  • "Описание 1", "Описание 2", "Описание 3", ... - описания аргументов в том порядке, как они расположены в объявлении пользовательской функции.

Эта подпрограмма запускается один раз, после чего ее можно удалить или использовать как шаблон для корректировки параметров других пользовательских функций.

Сейчас с помощью метода Application.MacroOptions попробуем изменить описание пользовательской функции «Деление» и добавить описания аргументов.

Sub ИзменениеОписания() Application.MacroOptions _ Macro:="Деление", _ Description:="Описание функции Деление изменено методом Application.MacroOptions", _ ArgumentDescriptions:=Array("- любое числовое значение", "- числовое значение, кроме нуля") End Sub

После однократного запуска этой подпрограммы получаем следующий результат:


Метод Application.MacroOptions не работает в , но и здесь можно найти решение. Добавьте описания к пользовательским функциям и их аргументам в обычной книге Excel, затем экспортируйте модуль с функциями в любой каталог на жестком диске и оттуда импортируйте в Личную книгу макросов. Все описания сохранятся.

Основы программирования на языке VBA

Комментарии (0)

Процесс разработки программы на языке VBA - проекта , может состоять из нескольких этапов, в зависимости от конечного результата. Если необходимо получить программу, которая будет производить определенные вычисления или действия, расширяющие математические возможности стандартного приложения Microsoft Office, то достаточно создать программный модуль . Для применения этой программы можно поместить в рабочей области приложения кнопку, нажатие которой будет вызывать выполнение программы. Для этого в приложении необходимо включить панель инструментов с помощью команды Вид Панели инструментов Элементы управления , а затем создать кнопку с соответствующим программным кодом. Либо выполнять программу с помощью команды Сервис Макрос Макросы .

Разработка “полноценной” программы (для выполнения которой требуется отдельное окно, с различными элементами управления) будет включать два этапа. Первый этап - этап визуального программирования, на котором создается окно (форма ) программы, где располагаются необходимые элементы управления. Второй - этап программирования, на котором создаются части программы (процедуры ), выполняющиеся в ответ на определенные события. Событием является, например, щелчок левой кнопкой мыши на командной кнопке (событие Click), нажатие клавиши на клавиатуре (событие KeyPress) и т.д. Использовать такое приложение можно нажатием кнопки - «Запуск проекта».

2.1. Объекты, свойства и методы VBA

Одним из основных понятий VBA является объект. Объект - это то, чем вы управляете с помощью программы на языке VBA, например, форма, кнопка, рабочий лист или диапазон ячеек MS Excel. Каждый объект обладает некоторыми свойствами . Например, форма может быть видимой или невидимой в данный момент на экране. Другой пример свойства объекта - шрифт для отображения информации в ячейке (объекте) рабочего листа.

Объект содержит также список методов, которые к нему применимы. Методы - это то, что вы можете делать с объектом. Например, показать форму на экране или убрать её можно с помощью методов Show и Hide.

Таким образом, объект - это программный элемент, который имеет свое отображение на экране, содержит некоторые переменные, определяющие его свойства , и некоторые методы для управления объектом. Например, в MS Excel имеется много встроенных объектов:

Range (“ Адрес ”)

Диапазон ячеек (может включать только одну ячейку).

Cells(i, j)

Ячейка, находящаяся на пересечении i-й строки и j-го столбца рабочего листа MS Excel (i и j - целые числа).

Rows (№ строки )

Строка с заданным номером.

Columns (№ столбца )

Столбец с заданным номером

Sheets (“ Имя ”)

Лист с указанным именем.

Sheets (№ листа )

Лист с указанным номером.

WorkSheet

Рабочий лист.

Установка значений свойств - это один из способов управления объектами. Синтаксис установки значения свойства объекта следующий:

Объект. Свойство = Выражение

Основным свойством объектов Cells и Range , является Value (значение), которое, однако, можно не указывать. Например:

Range(“A5:A10”). Value = 0 или Range (“ A 5: A 10”) = 0 - в диапазон ячеек A5:A10 заносится значение 0.

Cells (2, 4). Value = n или Cells (2, 4) = n - в ячейку, находящуюся на пересечении 2-й строки и 4-го столбца (ячейка с адресом “D2”), заносится значение переменной n.

Синтаксис чтения свойств объекта следующий:

Переменная = Объект. Свойство

Например:

Xn = Cells (1, 2). Value или Xn = Range (“ B 1”). Value - переменной Xn присваивается значение из ячейки B1 текущего рабочего листа.

Синтаксис применения методов к объекту:

Объект. Метод

Например:

Sheets (2). Activate - сделать активным лист с №2.

Sheets (“Диаграмма”). Delete - удалить лист с именем “Диаграмма”.

Range("A5:A10").Clear - очистить диапазон ячеек A5:A10.

Range("A2:B10").Select - выделить диапазон ячеек A2:B10.

В MS Excel имеются объекты, которые содержат другие объекты. Например, рабочая книга содержит рабочие листы, рабочий лист содержит диапазон ячеек и т.д. Объектом самого высокого уровня является Application (приложение). Если вы изменяете его свойства или вызываете его методы, то результат применяется к текущей работе MS Excel. Например:

Application . Quit - завершение работы с Excel.

Отметим, что точка после имени объекта может использоваться для перехода от одного объекта к другому. Например, следующее выражение очищает вторую строку рабочего листа Май в рабочей книге Отчет :

Application.Workbooks(" Отчет ").Worksheets(" Май ").Rows(2).Delete

Нужно отметить следующее:

  • Можно не писать имя объекта Application , так как это подразумевается по умолчанию.
  • При работе с подобъектом уже активизированного объекта нет необходимости указывать содержащий его объект.
  • VBA использует некоторые свойства и методы, которые возвращают объект к которому они относятся (это позволяет быстро указывать нужный объект). Примеры таких свойств: ActiveCell (активная ячейка), ActiveSheet (активный лист), ActiveWorkBook (активная рабочая книга). Так, установить значение активной ячейки можно следующим образом:

ActiveCell.Value = " Да ".

2.2. Описание данных

Все объекты, которыми оперирует язык программирования VВА, относятся к определенному типу.

Тип данных определяет:

Область возможных значений переменной;

Структуру организации данных;

Операции, определенные над данными этого типа.

Типы данных подразделяются на простые (скалярные) и сложные (структурированные). У простых типов данных возможные значения данных едины и неделимы. Сложные же типы имеют структуру, в которую входят различные простые типы данных. Скалярные типы данных представлены в таблице 2.1.

Таблица 2.1. Скалярные типы VBA

Имя типа

Русское
название типа

Возможные значения

Логический

Байтовый

Длинное целое

2147483648…+2147483647

Число с плавающей точкой

3,4Е38…-1,4Е-45 для отрицательных значений. 1,4Е-45…3,4Е38 для положительных значений.

Число с плавающей точкой двойной точности

1,7Е308…-4,9Е-324 для отрицательных значений. 4,9Е-324…1,7Е308 для положительных значений.

Денежный

Десятичные числа с фиксированной позицией запятой. Возможны 15 цифр до запятой и 4 после.

Строковый

Есть два вида строк: строки фиксированной длины (до 2 16 символов) и строки переменной длины (до 2 31 символов). Данные записываются в кавычках.

Даты изменяются в диапазоне от 1.01.100г. до 31.12.9999г.

Универсальный тип, значением которого могут быть данные любого из перечисленных выше типов, объекты, значения NULL и значения ошибок ERROR.

Переменные в программе можно описывать или не описывать. В последнем случае ей будет присвоен тип Variant . Явно описывать переменную можно как в начале блока, так и в любом месте, где возникла необходимость использовать новую переменную. Лучше все переменные описывать явно и, как правило, в начале блока. Для запрета использования переменных, которые не были описаны явно, в начало программы необходимо вставить оператор Option Explicit .

2.2.1. Описание простых переменных

Описание простых переменных имеет следующий синтаксис:

Dim ИМЯ_ПЕРЕМЕННОЙ As ИМЯ_ТИПА

Одним оператором Dim можно описать произвольное число переменных, но конструкция Аs должна быть указана для каждой из них, иначе переменным без Аs будет присвоен тип Variant .

Например .

Dim X As Byte, Z As Integer, С , C лово As String

Здесь переменная Х - это переменная байтового типа, переменная Z - целого типа, переменная С - типа вариант (по умолчанию), переменная Слово - строкового типа.

2.2.2. Описание констант

Данные, не изменяющиеся внутри программы можно считать константами. Их можно описать следующим образом:

Const ИМЯ_КОНСТАНТЫ As ИМЯ_ТИПА= ПОСТОЯННОЕ_ВЫРАЖЕНИЕ

Например .

Const Pi As Double = 3.141593

2.2.3. Описание массивов

Для хранения векторов, матриц и т.д. можно использовать массивы.

Массив - это структурированный тип данных, который представляет собой последовательность ячеек памяти, имеющих общее имя и хранящих данные одного типа. Каждый элемент массива определяется индексом (номером). Количество элементов в массиве называется размерностью массива . Массив описывается следующей конструкцией:

Dim ИМЯ_МАССИВА (СПИСОК_РАЗМЕРНОСТЕЙ ) As ИМЯ_ТИПА

В списке размерностей массива каждое измерение отделяется запятой и определяется заданием нижней и верхней границ изменения индексов.

Например .

Dim X(1 TO 5) As Integer, Y(1 To 10, 1 To 20) As Double

Здесь Х - одномерный массив, состоящий из 5 элементов целого типа, Y - двумерный массив, у которого 10 строк и 20 столбцов с элементами числового типа двойной точности.

2.3. Выражения

Выражения устанавливают порядок выполнения действий над элементами данных. Выражения состоят из операндов и знаков операций. Операндами являются константы, переменные, указатели функций, выражения, взятые в скобки.

2.3.1. Виды операций

Операции бывают арифметические, отношения и логические:

- арифметические операции:
^ возведение в степень,
* умножение,
/ деление,
\ деление нацело,
mod остаток от деления,
+ плюс,
- минус;

- операции отношения :
< меньше,
> больше,
<= меньше или равно,
>= больше или равно,
= равно,
<> не равно;

- логические операции:
Not логическое отрицание,
And логическое "И",
Or логическое "ИЛИ".

Результатом логической операции может быть одно из двух значений:
True ("истина") или False ("ложь").

2.3.2. Приоритет выполнения операций

Если выражение содержит несколько операций, то приоритет их выполнения следующий:

1. Сначала выполняются арифметические операции в таком порядке, как они представлены в таблице 2.2.

Таблица 2.2. Приоритет арифметических операций

3. Последними выполняются логические операции в таком порядке, как они представлены в таблице 2.3.

Таблица 2.3. Приоритет логических операций

Описание операции

Обозначение в VВА

Логическое отрицание

Логическое "И"

Логическое "ИЛИ"

Если выражение содержит несколько операций одинакового приоритета, то порядок их выполнения слева направо. Чтобы изменить порядок действий в выражении используются круглые скобки.

Выражения бывают арифметические, отношения и логические.

Арифметические выражения записываются с помощью операндов числовых типов и арифметических операций, а результатом является числовое значение. В арифметическом выражении можно использовать стандартные математические функции, которые приведены в таблице 2.4.

Таблица 2.4. Стандартные математические функции VBA

Математическая запись

Имя функции в VBA

Описание

Возвращает значение, тип которого совпадает с типом переданного аргумента, равное абсолютному значению указанного числа.

Возвращает значение типа Double, содержащее арктангенс числа.

Возвращает значение типа Double, содержащее косинус угла.

Возвращает значение типа, совпадающего с типом аргумента, которое содержит целую часть числа.

Возвращает значение типа Double, содержащее натуральный логарифм числа.

Возвращает значение типа Double, содержащее результат возведения числа e (основание натуральных логарифмов) в указанную степень.

Возвращает значение типа Variant (Integer), соответствующее знаку указанного числа.

Возвращает значение типа Double, содержащее синус угла.

Возвращает значение типа Double, содержащее квадратный корень указанного числа.

Возвращает значение типа Double, содержащее тангенс угла.

Выражения отношения определяют истинность или ложность результата при сравнении двух операндов. Сравнивать можно данные любого одинакового типа. Результат операции отношения только логический: True - "истина" или False - "ложь".

Логические выражения. Результатом логического выражения является логическое значение True или False. Простейшими видами логических выражений являются: логическая константа, логическая переменная, логическая функция, выражение отношения. Логические операции выполняются только над операндами логического типа.

Пример . Записать 1£Х£5 и определить значение выражения при Х=3.1

Выражение в VВА будет выглядеть так:

X >=1 And X <=5

Результатом выражения будет True.

Чтобы получить перечень всех математических функций, достаточно набрать имя любой известной математической функции (например, SIN ), а затем нажать клавишу F1 Математические функции . В полученном перечне можно получить справку о назначении любой из встроенных математических функций и ее аргументе.

Чтобы получить перечень всех производных математических функций и правила их формирования, достаточно набрать имя любой известной математической функции (например, SIN ), а затем нажать клавишу F1 и ниже описания выбранной функции выбрать ссылку на Производные математические функции .

Ниже, в таблице 2.5, приведен список функций, которые могут быть получены с помощью встроенных математических функций.

Таблица 2.5. Производные математические функции

Математическая запись

Название функции

Комбинация встроенных функций

Косеканс

Котангенс

Арксинус

Atn(X/Sqr(-X*X+1))

Арккосинус

Atn(-X/Sqr(-X*X+1))+2*Atn(1)

Арксеканс

Atn(X/Sqr(X*X-1))+Sgn((X)-1)*2*Atn(1)

Арккосеканс

Atn(X/Sqr(X*X-1))+(Sgn(X)-1)*2*Atn(1)

Арккотангенс

Гиперболический синус

(Exp(X)-Exp(-X))/2

Гиперболический косинус

(Exp(X)+Exp(-X))/2

Гиперболический тангенс

(Exp(X)-Exp(-X))/(Exp(X)+Exp(-X))

Гиперболический секанс

2/(Exp(X)+Exp(-X))

Гиперболический косеканс

2/(Exp(X)-Exp(-X))

Гиперболический котангенс

(Exp(X)+Exp(-X))/(Exp(X)-Exp(-X))

Гиперболический арксинус

Log(X+Sqr(X*X+1))

Гиперболический арккосинус

Log(X+Sqr(X*X-1))

Гиперболический арктангенс

Log((1+X)/(1-X))/2

Гиперболический арксеканс

Log((Sqr(-X*X+1)+1)/X)

Гиперболический арккосеканс

Log((Sgn(X)*Sqr(X*X+1)+1)/X)

Гиперболический арккотангенс

Log((X+1)/(X-1))/2

Логарифм по основанию N



Другие новости

Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.

Список этих функций можно посмотреть в редакторе VBA:

  • Откройте рабочую книгу Excel и запустите редактор VBA (нажмите для этого Alt+F11 ), и затем нажмите F2 .
  • В выпадающем списке в верхней левой части экрана выберите библиотеку VBA .
  • Появится список встроенных классов и функций VBA. Кликните мышью по имени функции, чтобы внизу окна отобразилось её краткое описание. Нажатие F1 откроет страницу онлайн-справки по этой функции.

Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre .

Пользовательские процедуры «Function» и «Sub» в VBA

В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.

Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function , а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub .

Аргументы

При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:

Sub AddToCells(i As Integer) ... End Sub

Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.

Необязательные аргументы

Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.

Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:

Sub AddToCells(Optional i As Integer = 0)

В таком случае целочисленный аргумент i по умолчанию будет равен 0.

Необязательных аргументов в процедуре может быть несколько, все они перечисляются в конце списка аргументов.

Передача аргументов по значению и по ссылке

Аргументы в VBA могут быть переданы процедуре двумя способами:

  • ByVal – передача аргумента по значению. Это значит, что процедуре передаётся только значение (то есть, копия аргумента), и, следовательно, любые изменения, сделанные с аргументом внутри процедуры, будут потеряны при выходе из неё.
  • ByRef – передача аргумента по ссылке. То есть процедуре передаётся фактический адрес размещения аргумента в памяти. Любые изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.

При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:

Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef , то аргумент будет передан по ссылке.

Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.

VBA процедура «Function»

Редактор VBA распознаёт процедуру Function

Function ... End Function

Как упоминалось ранее, процедура Function в VBA (в отличие от Sub ), возвращает значение. Для возвращаемых значений действуют следующие правила:

  • Тип данных возвращаемого значения должен быть объявлен в заголовке процедуры Function .
  • Переменная, которая содержит возвращаемое значение, должна быть названа так же, как и процедура Function . Эту переменную не нужно объявлять отдельно, так как она всегда существует как неотъемлемая часть процедуры Function .

Это отлично проиллюстрировано в следующем примере.

Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами

Ниже приведён пример кода VBA процедуры Function , которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double , равное сумме первых двух аргументов минус третий аргумент:

Function SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double SumMinus = dNum1 + dNum2 - dNum3 End Function

Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.

Вызов VBA процедуры «Function»

Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.

Вызов VBA процедуры «Function» из другой процедуры

Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus , которая была определена выше.

Sub main() Dim total as Double total = SumMinus(5, 4, 3) End Sub

Вызов VBA процедуры «Function» из рабочего листа

VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру Function SumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:

SumMinus(10, 5, 2)

VBA процедура «Sub»

Редактор VBA понимает, что перед ним процедура Sub , когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

Sub ... End Sub

VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек

Рассмотрим пример простой VBA процедуры Sub , задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:

Sub Format_Centered_And_Sized(Optional iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

Данная процедура Sub выполняет действия, но не возвращает результат.

В этом примере также использован необязательный (Optional) аргумент iFontSize . Если аргумент iFontSize не передан процедуре Sub , то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub , то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.

VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек

Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub , которой не передаются никакие аргументы:

Sub Format_Centered_And_Bold() Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

Вызов процедуры «Sub» в Excel VBA

Вызов VBA процедуры «Sub» из другой процедуры

Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call , имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:

Sub main() Call Format_Centered_And_Sized(20) End Sub

Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:

Sub main() Call Format_Centered_And_Sized(arg1, arg2, ...) End Sub

Вызов VBA процедуры «Sub» из рабочего листа

Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function , потому что процедура Sub не возвращает значение. Однако, процедуры Sub , не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.

Вот простой способ запустить (или выполнить) процедуру Sub , доступную из рабочего листа:

  • Нажмите Alt+F8 (нажмите клавишу Alt и, удерживая её нажатой, нажмите клавишу F8 ).
  • В появившемся списке макросов выберите тот, который хотите запустить.
  • Нажмите Выполнить (Run)

Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:

  • Нажмите Alt+F8 .
  • В появившемся списке макросов выберите тот, которому хотите назначить сочетание клавиш.
  • Нажмите Параметры (Options) и в появившемся диалоговом окне введите сочетание клавиш.
  • Нажмите ОК и закройте диалоговое окно Макрос (Macro).

Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C ). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.

Область действия процедуры VBA

В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private . Эти ключевые слова так же можно использовать применительно к VBA процедурам:

Помните о том, что если перед объявлением VBA процедуры Function или Sub ключевое слово не вставлено, то по умолчанию для процедуры устанавливается свойство Public (то есть она будет доступна везде в данном проекте VBA). В этом состоит отличие от объявления переменных, которые по умолчанию бывают Private .

Ранний выход из VBA процедур «Function» и «Sub»

Если нужно завершить выполнение VBA процедуры Function или Sub , не дожидаясь её естественного финала, то для этого существуют операторы Exit Function и Exit Sub . Применение этих операторов показано ниже на примере простой процедуры Function , в которой ожидается получение положительного аргумента для выполнения дальнейших операций. Если процедуре передано не положительное значение, то дальнейшие операции не могут быть выполнены, поэтому пользователю должно быть показано сообщение об ошибке и процедура должна быть тут же завершена:

Function VAT_Amount(sVAT_Rate As Single) As Single VAT_Amount = 0 If sVAT_Rate <= 0 Then MsgBox "Expected a Positive value of sVAT_Rate but Received " & sVAT_Rate Exit Function End If ... End Function

Обратите внимание, что перед тем, как завершить выполнение процедуры Function VAT_Amount , в код вставлена встроенная VBA функция MsgBox , которая показывает пользователю всплывающее окно с предупреждением.

Функция написанная на VBA - это код, который выполняет вычисления и возвращает значение (или массив значений). Создав функцию вы можете использовать ее тремя способами:

  1. В качестве формулы на листе, где она может принимать аргументы и возвращать значения.
  2. Как часть вашей подпрограммы VBA. В процедуре Sub или внутри других функций.
  3. В правилах условного форматирования.

Хотя Excel уже содержит более 450 встроенных функций, но их тоже периодически не хватает. Иногда встроенные функции не могут выполнить то, что вы хотите сделать. Иногда для достижения результата необходимо создать огромную и сложную формулу, которая не понятна окружающим. В этом случае вы можете создать пользовательскую функцию, которую легко читать и использовать.

Обратите внимание, что пользовательские функции, созданные с помощью VBA, как правило значительно медленнее, чем встроенные функции. Следовательно, они лучше всего подходят для ситуаций, когда вы не можете получить результат, используя встроенные функции или вычислений не много и снижение производительности не критично.

Встроенными функциями можете пользоваться не только вы, но и ваши коллеги. Написанные вами функции будут появляться наряду с другими в диалоговом окне Мастер функций. Возможно вас пугает процесс создания функций, но спешу вас уверить, что это достаточно просто.

В чем отличие процедуры (Sub) от функции (Function)?

Основное отличие в том, что процедура (sub) используется для выполнения набора команд, и не призвана в отличие от функции (function) возвращать значение (или массив значений).

Для демонстрации приведем пример. Например есть ряд чисел от 1 до 100 и необходимо отделить четные от нечетных.

С помощью процедуры (sub) вы можете, к примеру, пройтись по ячейкам и выделить нечетные с помощью заливки. А функцию можно использовать в соседнем столбце и она вернет ИСТИНА или ЛОЖЬ в зависимости от того четное значение или нет. Т.е. вы не сможете изменить цвет заливки с помощью функции на листе.

Создание простой пользовательской функции в VBA

Давайте создадим простую пользовательскую функцию на VBA и посмотрим как там все работает.

Ниже представлен код функции, которая из текста оставляет только цифры, отбрасывая буквенные значения.

Function Цифры(Текст As String) As Long Dim i As Long Dim result As String For i = 1 To Len(Текст) If IsNumeric(Mid(Текст, i, 1)) Then result = result & Mid(Текст, i, 1) Next Цифры = CLng(result) End Function

Чтобы у вас все заработало, необходимо вставить данный код в модуль книги. Если вы не знаете как это сделать, то начните со статьи .

Теперь посмотрим как функция работает, попробуем использовать ее на листе:

Прежде чем разбирать саму функцию отметим 2 приятных момента, которые появились после создания:

  • Она стала доступна, как и любая другая встроенная функция (как создать скрытую функцию, расскажем далее).
  • Когда вы ввели знак "=" и начинаете вводить имя функции, то Excel выводит все совпадения и показывает не только встроенные функции, но и пользовательские.

Разбираем функцию пошагово

Теперь давайте глубоко погрузимся и посмотрим, как эта функция создавалась. Начинается функция со строки

Function Цифры(Текст As String) As Long

Слово Function говорит о начале функции, далее идет ее название, в нашем случае Цифры .

  • Имя функции не может содержать пробелов. Кроме того, вы не можете назвать функцию, если она сталкивается с именем ссылки на ячейку. Например, вы не можете назвать функцию ABC123, так как это имя также относится к ячейке в листе Excel.
  • Вы не должны указывать на свою функцию то же имя, что и у существующей функции. Если вы это сделаете, Excel будет отдавать предпочтение встроенной функции.
  • Вы можете использовать символ подчеркивания, если хотите разделить слова. Например, Сумма_Прописью является допустимым именем.

После названия в круглых скобках описываются аргументы функции. По аналогии со встроенными функциями Excel. В нашем случае используется единственный аргумент Текст . После названия аргумента мы указали As String , это означает, что наш аргумент - текстовое значение или ссылка на ячейку, содержащее текстовое значение. Если вы не укажете тип данных, VBA рассмотрит его как Variant (что означает, что вы можете использовать любой тип данных, VBA его определит самостоятельно).

Последняя часть первой строки As Long задает тип данных, которая возвращает функция. В нашем случае функция будет возвращать целые значения. Это также не обязательно.

Вторая и третья строка функции объявляет дополнительные внутренние переменные, которые мы будем использовать.

Dim i As Long Dim result As String

Переменную i мы буем использовать для перебора символов. А переменную result для хранения промежуточного результата функции.

Задача функции - пройти по всем символам переменной Текст и сохранить только те, что являются цифрами. Поэтому начнем цикл с 1 и до последнего символа.

For i = 1 To Len(Текст)

Len - функция, которая определяет количество символов.

Основная строка функции - это проверка является ли очередной символ текста цифрой и если да - то сохранение его в переменной result

If IsNumeric(Mid(Текст, i, 1)) Then result = result & Mid(Текст, i, 1)

Для этого нам потребуется функция IsNumeric - она возвращает True если текст - число и False в противном случае.

Функция Mid берет из аргумента Текст i -ый символ (значение 1 , указывает что функция Mid берет только 1 символ)/

Функция Next - закрывает цикл For тут все понятно.

Цифры = CLng(result)

Этой строкой мы преобразовываем текстовую переменную result , которая содержит все цифры аргумента Текст , в числовое значение. И говорим какой результат должна вывести наша функция Цифры .

Последняя строка кода - End Function . Это обязательная строка кода, которая сообщает VBA, что код функции заканчивается здесь.

В приведенном выше коде описаны различные части типичной пользовательской функции, созданной в VBA. В следующих статьях мы более подробно разберем эти элементы, а также рассмотрим различные способы выполнения функции VBA в Excel.

6.1. Объекты, методы, свойства

Visual Basic позволяет создавать программные продукты, способные с достаточной полнотой автоматизировать решение конкретных задач пользователя.

VBA является объектно-ориентированной средой, содержащей большой набор объектов, каждый из которых обладает множеством свойств и методов. Объекты и инструменты относятся к определенному классу (например, класс TextBox).

Свойства и методы также являются членами класса. С помощью свойств описывается, как выглядит объект, в частности дается информация о приемах форматирования текста, цвете и размере шрифта. Методы являются процедурами, которые могут быть выполнены для объекта (процедуры создания и удаления объекта, процедуры событий, определяющие принцип взаимодействия объекта с пользователем и т.д.).

Объекты (аналог существительному)

Объектом считается любой элемент приложения ─ ячейка, лист, рабочая книга, диаграмма. Фактически объектом является и само приложение Excel. Объекты могут включать области ячеек, рамки ячеек, окна, сценарии, стили и т.д. Каждый класс объектов имеет свое множество свойств, функций и событий.

Методы (аналог глаголу)

Метод ─ это действие, которое может быть выполнено над объектом. Методы реализуются посредством выполнения процедуры, которая является членом класса объектов.

Синтаксис вызова: Объект.Метод – указываются имя вызывающего метод объекта и имя самого метода, разделенные точкой.

Пример: Ball.Kick или Мяч.Ударить; Вода.Пить

Комбинация двоеточия и знака равенства в коде всегда указывают на параметр метода, т.е. как выполняется действие.

Методы могут иметь много параметров как обязательные, так и нет.

Пример 1: защита листа Лист1 от внесения изменения (метод Protect)

Sheets(“Лист1”).Protect

Пример 2: добавление нового рабочего листа

Worksheet.Add Before:=Worksheets(1)

Свойство (аналог прилагательному)

Свойство является атрибутом объекта, описывающим, как объект выглядит (его цвет, размер и местоположение) и как он действует (является ли видимым, ссылается ли на другой объект). При создании объекта выполняется процедура создания экземпляра этого объекта.

Для присваивания свойству нового значения, необходимо создать оператор присваивания, в котором слева от знака равенства будут указаны имя и свойство объекта (разделенные точкой), а справа ─ новое значение.

Синтаксис вызова: Объект.Свойство

Свойство всегда присутствует в левой или правой части выражений, связанных с присвоением значения. Отсутствует двоеточие перед знаком равенства.

Пример 1: переименование Лист1 на Счета:

Sheets(“Лист1”).Name =”Счета”

Событие – взаимодействие пользователя с определенным объектом на рабочем листе. Каждый класс объектов имеет собственную группу событий, на которые объекты данного класса реагируют.

Аргументы

Аргументы используются для передачи методам значений, необходимых им при решении тех задач, для реализации которых они запрограммированы. Задача выполняется корректно только в том случае, если каждый элемент имеет тип, который указан для данного метода. В качестве аргументов могут передаваться числа, текст и логические значения (истина и ложь).

Предоставляется два способа передачи аргументов методу:

─ внутренний, при котором аргументы должны быть указаны в определенном порядке;

Пример: ActiveCell.BorderAround LineStyle. Weight. ColorIndex. Color

Действие метода BorderAround объекта Range задает новые атрибуты рамки вокруг указанной области. При его использовании требуется задать аргументы для определения стиля линии, ее толщины и цвета. Причем свойство ColorIndex позволяет определить цвет с помощью числа, а свойство Color ─ с помощью константы VisualBasic.

─ внешний, при котором следования аргументов произвольно.

Пример: Range(“A1:C7”).Border Around Color Index:=3, Weight:=xlThick

Тип аргументов:

– обязательные аргументы (для редактирования параметров ЭТ)

– необязательные аргументы (Для редактирования объектов (изменение цвета, размера, рамки))

6.2. Структура, используемая в VBA

На высшем уровне иерархии стоит приложение, далее идут проекты, связанные с фактическими документами этого приложения. На третьем уровне находятся модули (модули приложения, модули пользователя, модули класса, модули форм и модули ссылок), а на последнем – их процедуры и функции.

Иерархия, используемая в VBA, представлена на рис. 6.1.

Рис. 6.1. Иерархия, используемая в VBA

Модуль – это часть программы, оформленная в таком виде, при котором допускается ее независимая трансляция. Модуль состоит из двух разделов: раздела объявлений (Declaration) и раздела процедур и функций. В первом разделе описываются глобальные переменные, типы, определенные пользователем, и перечисляемые типы, во втором – процедуры и функции.

Процедурой называется фрагмент кода (минимальная семантически законченная программная конструкция), заключенный между операторами Sub и End Sub.

Синтаксис определения процедуры:

Sub имя_процедуры(аргумент_1, аргумент_2,_, аргумент_n)

оператор VBA

оператор VBA

оператор VBA

Private – задает область видимости для процедуры – модуль, в котором она описана. Ее могут вызывать только процедуры этого же модуля

Public – процедура становится доступной для всех модулей (устанавливается по умолчанию)

Friend – процедура видима только в том проекте, где описан класс, членом которого она является.

Также в VBA используются процедуры без параметров, которые могут выступать в роли командных макросов и процедур обработки событий.

На рис. 6.2 представлен интерфейс VBA.

Рис. 6.2. Интерфейс VBA

6.3. Типы данных, используемые в VBA

6.3.1. Переменные

Переменная – это поименованная область памяти, используемая для хранения данных в течение работы процедуры.

Для использования переменной ее необходимо описать (объявить).

Синтаксис оператора описания переменной:

Dim переменная

Dim – ключевое слово, свидетельствующая о том, что объявляется переменная (dimension – размер);

Переменная – имя объявляемой переменной;

As – ключевое слово, используемое при задании типа данных (as – как);

Тип – тип данных для объявляемой переменной

Одним оператором Dim можно описать несколько переменных, перечислив их через запятую.

Dim i As Byte, j As Integer, k As Integer

В таблице 6.1. представлены основные типы данных, используемые для задания переменных.

Таблица 6.1. Типы данных

Тип данных

Значения переменной

Boolean (логический)

логические переменные, принимающие одно из двух значений: Истина или Ложь

Byte (короткий целый беззнаковый)

целое число из диапазона от 0 до 255

Integer (целый)

целые числа из диапазона от -32 768 до 32 767

Long (длинный целый)

целые числа из диапазона от -2 147 483 648 до 2 147 483 647

Currency (денежный)

переменные для денежных вычислений с фиксированным количеством разрядов после десятичной запятой; позволяют избежать накопления погрешностей при округлении

Date (дата)

переменные для хранения даты и времени

Single (с плавающей точкой одинарной точности)

числа с дробной частью от -3,40282310 38 до -1,40129810 -45

для отрицательных чисел и от 1,40129810 -45 до 3,40282310 38 для положительных чисел

Double (с плавающей точкой двойной точности)

числа с дробной частью от -1,7976931348623110 308 до -4,9406564584124710 -324

для отрицательных чисел и от 4,9406564584124710 -324 до 1,7976931348623110 308 для положительных чисел

String (строковой переменной длины)

переменные для хранения строк символов длиной от 0 до 64 Кбайт

Variant (универсальный)

Автоматическое подстраивание под данные

Object (объект)

переменные для хранения ссылок на объекты

Если при описании переменных не указывается их тип, то им автоматически присваивается Variant. Это означает, что в ячейке, соответствующей этой переменной, может храниться информация любого вида (аналог формату «Общий» в ЭТ).

Пример: Dim i, j As Integer

Это эквивалентно следующей записи: Dim i As Variant, j As Integer

Для записи одинакового формата необходимо:

Dim i As Integer, j As Integer

Для использования тех или иных переменных в разных частях программы используется так называемая область видимости.

Области видимости переменной – это область программ, где имя переменной считается допустимым (видимым), а, следовательно, возможен доступ к ее значению (рис. 6.3).

Рис. 6.3. Области видимости переменной VBA

Существуют три уровня видимости переменной и пять способов ее объявления.

1Ур. – Процедура (областью видимости является процедура, в которой переменная объявлена).

*** Оператор Dim объявляет переменную в любом месте процедуры, но всегда предшествует операторам, использующим ее. Такая переменная может существовать только во время выполнения процедуры, после окончания которой значение этой переменной теряется, а память освобождается.

*** Static (аналогичен Dim) – но! объявляет статическую переменную. После выхода из процедуры память не освобождается и значение не теряется.

2 Ур. – Модуль

*** оператор Private объявляет переменную в разделе описаний Declaration (вне процедур модуля)

*** оператор Dim (в данном случае) полностью аналогичен оператору Private

3 Ур. – Приложение

*** оператор Public объявляет переменную в разделе описаний Declaration

6.3.2. Константы

Разделяются на пользовательские и встроенные.

Пользовательские константы требуют объявления. Для этого используется оператор вида:

Const константа = значение

Const – ключевое слово, которое показывает, что объявляется константа;

As – ключевое слово, с которого начинается задание типа данных;

Константа – имя объявляемой константы;

Тип – тип данных для константы;

Значение – значение, присваиваемое константе.

Const pi As Double = 3.141592654

Const e As Double = 2.718281828

Const Message = “Завершение работы”

Можно объявлять несколько констант через запятую:

Const min = 0, max = 1000

Встроенные константы не требуют объявления. Имена встроенных констант начинаются с префикса vb, например, vbFriday.

6.4. Использование стандартных окон операционной системы Windows

В VB имеется большое количество встроенных процедур, которые отличаются от пользовательских процедур тем, что их описание были запрограммированы разработчиками VBA.

Для ввода пользователем информации в код программы и вывод данных из него, а также для создания пользовательских диалоговых окон используются функции MsgBox и InputBox.

6.4.1. Функция MsgBox

MsgBox (“сообщение”, [кнопки, заголовок]) - эта функция отображает диалоговое окно, содержащее сообщение длиной до 1024 символов, в которое с помощью операции конкатенации можно включить значение переменных, а также (необязательно) кнопки для реакции на отображения окна (по умолчанию только кнопка ОК).

При задании сложного диалогового окна, при помощи функции MsgBox используются следующие константы:

1) Для задания внешнего вида окна сообщения (рис. 6.4):

vbCritical, vbQuestion, vbExclamation, vbInformation.

Рис. 6.4. Внешний вид окон

2) Для задания кнопок в окне сообщения:

vbOkCancel, vbAbortRetryIgnore, vbYesNOCancel, vbYesNO, vbRetryCancel.

3) Для задания дальнейших действий после нажатия на соответствующую кнопку:

vbOk, vbCancel, vbAbort, vbRetry, vbIgnore, vbYes, vbNO.

Пример процедуры 1:

Private Sub Пример_1()

y = MsgBox("Закрыть окно", vbQuestion + vbYesNoCancel, "Сообщение Windows")

Код процедуры 1 в VBA и результат выполнения программы представлен на рис. 6.5.

Рис. 6.5. Пример процедуры 1

Пример процедуры 2:

Sub Привет()

y = MsgBox("Закрыть окно", vbQuestion + vbYesNoCancel, "Сообщение Windows")

If y = vbYes Then MsgBox ("VVVVVVVVVVVVVVVVVVVV") Else

If y = vbNo Then ActiveCell = "Привет"

Код процедуры 2 в VBA и результат выполнения программы представлен на рис. 6.6.

Рис. 6.6. Пример процедуры 2

6.4.2. Функция InputBox

InputBox (“сообщение”[, заголовок] [, значение по умолчанию] [, координата x] [, координата y]) - функция, применяемая для ввода значений переменных в программу. Эта функция отображает диалоговое окно, содержащее окно ввода, кнопки ОК и Отмена, сообщение (подсказку для ввода) и (необязательно) заголовок окна, значение, вводимое по умолчанию, координаты окна по горизонтали и вертикали.

Так ввод числа можно задать командой:

a = InputBox ("первое число")

Рис. 6.7. Вид функции InputBox

6.4.3. Совместное использование функций MsgBox и InputBox

На практике для создания процедур функции MsgBox и InputBox используются совместно. Кроме того, в дополнение к ним может использоваться условный оператор If, который позволяет проверять введенные пользователем условия и на основе его выводов выдавать результат.

Условный оператор If - это оператор позволяющий задавать выполнение тех или иных действий в зависимости от заданных условий. Основными составляющими для этого служат:

1) if (если)

2) then (тогда)

3) else (иначе)

Так выражение - если a>1 то b= a+1 иначе b=a-1 будет иметь вид

If a>1 then b= a+1 else b=a-1.

Пример процедуры 3:

Компьютер должен перемножить два числа, результат вывести в одну из ячеек таблицы. Если их произведение больше 2000, то компьютер должен выдать дополнительное сообщение "Полученное значение больше 2000".

Sub пример_2()

Dim a, b, y As Long

a = InputBox("первое число")

b = InputBox("второе число")

If y < 2000 Then Range("A4") = y Else MsgBox ("Полученное значение больше 2000")

Код процедуры 3 в VBA и результат выполнения программы с разными условиями представлен на рис. 6.8.



Рис. 6.8. Пример процедуры 3

Рассмотрим программу, которая включает в себя сложную функцию MsgBox и оператор If.

Пример процедуры 4:

Вводятся два произвольных числа. Затем задаётся вопрос “Вы уверены что хотите их перемножить?” и варианты ответов: “да”, “нет”. Если ответ “да” - то числа перемножаются, и выдается сообщение с результатом, иначе действие не производится.

Sub Пример()

Dim a, b, d As Double

a = InputBox("первое число")

b = InputBox("второе число")

y = MsgBox("Вы уверены, что хотите их перемножить? ", vbCritical + vbYesNo, "Вопрос")

If y = vbYes Then d = a * b Else MsgBox ("Действие отменено")

If y = vbYes Then MsgBox (d)

Код процедуры 3 в VBA и результат выполнения программы с разными условиями представлен на рис. 6.9.



Рис. 6.9. Пример процедуры 4

6.5. Управляющие конструкции VBA

Управляющие конструкции языка программирования – это инструкции и группы инструкций, применение которых позволяет изменять по мере необходимости последовательность выполнения других инструкций программы. Данные конструкции подразделяются на ветвления и циклы. Ветвлением называется управляющая конструкция, позволяющая пропускать при выполнении те или иные группы инструкций в зависимости от значения условия. Цикл – это управляющая конструкция, представляющая возможность многократно выполнять группы инструкций до наступления какого-либо события.

6.5.1. Ветвление

Конструкция If…Then

Конструкция If…Then дает VBA указание принять простейшее из решений: если условие, идущие после оператора If, истинно, нужно выполнить следующие за ними оператор (или операторы); если же условие ложно, нужно перейти к строке, расположенной непосредственно за условной конструкцией. Однострочная конструкция:

If условие Then оператор[ы]

При использовании нескольких операторов (блок If):

If условие Then

оператор

[операторы]

Пример однострочной конструкции:

Age = InputBox("укажите свой возраст.", "Возраст")

If Age < 21 Then MsgBox "Вы не можете покупать алкогольные напитки.", "несовершеннолетний"

Рис. 6.10 Пример конструкции If then

Конструкция If…Then…Else

С помощью данной конструкции можно выбрать одно направление деятельности, если условие истинно, и другое – если оно ложно. Например, можно использовать для работы с окнами, содержащими две кнопки.

Синтаксис конструкции:

If условие Then

операторы_1

операторы_2

Если условие истинно, VBA выполняет первую группу операторов – операторы_1, если же оно ложно, осуществляется переход к строке Else, а затем выполняется вторая группа операторов – оператор_2.

Sub vozrast()

Age = InputBox("укажите свой возраст.", "Возраст")

If Age < 21 Then

MsgBox "Вы не можете покупать алкогольные напитки.", "несовершеннолетний"

Vkus = InputBox("что Вы хотите приобрести?", "Вкус")

Рис. 6.11. Пример конструкции If Then Else

Конструкция If…Then…ElseIf…Else

С помощью данной конструкции можно выбрать одно из нескольких направлений действий. Можно использовать любое количество строк с ElseIf в зависимости от сложности программы.

Синтаксис конструкции:

If условие_1 Then

операторы_1

ElseIf условие_2 Then

операторы_2

ElseIf условие_3 Then

операторы_3

операторы_4

Целесообразно использовать данную конструкцию с числом операторов ElseIf не больше 5. В этом случае лучше использовать конструкцию Select Case.

Конструкция Select Case

Вместо нескольких операторов ElseIf можно применить конструкцию Select Case для более сжатого вида программы.

Такую конструкцию рекомендуется использовать, если решение, которое необходимо принять в программе, зависит от одной переменной или от выражения, имеющего не менее трех-четырех значений. Такая переменная (или выражение) называется тестируемым случаем.

Повторяемое выражение сравнивается с выражениями, находящимися после Case. Если они совпадают, то выполняется соответствующий оператор, иначе проверяются другие выражения. В случае несовпадения ни одного из выражений, выполняются операторы, следующие за Case Else.

Синтаксис конструкции:

Select Case повторяемое_выражение

Case выражение_1

операторы_1

Case выражение_2

операторы_2

операторы

6.5.2. Циклы

Существует три типа циклов: с управляющим условием, со счетчиком и циклы по структуре данных.

В циклах с управляющим условием оператор или группа операторов повторяется, пока условие не будет выполнено. Такие циклы называются циклами Do.

Если заранее известно количество повторений тела цикла, проверять управляющее условие нет необходимости. Такие циклы называются циклами с повторяющим перечислением. Циклы такого типа подразделяются на две группы: циклы со счетчиком и циклы по структуре данных.

В циклах со счетчиком используется специальная переменная – счетчик , значение которой при каждом повторении тела цикла увеличивается или уменьшается на заданную величину – шаг цикла . Цикл завершается после того, как значение счетчика достигнет (или превысит) конечное значение счетчика цикла.

Синтаксис:

For счетчик = начальное_значение To конечное_значение Step шаг_цикла

<тело цикла>

Next счетчик

Пример вычисления суммы значений, содержащихся в нечетных ячейках первого столбца первого листа (в пределах первых 10 ячеек):

Dim I As Integer

S= 0

For I = 1 To 10 Step 2

S = S + Application.Worksheets(1).Cells(I, 1).Value

Рис. 6.12. Пример цикла 1

В циклах по структуре данных тело цикла поочередно повторяется для всех однородных объектов, составляющих массив или семейство. В этом случае в роли счетчика выступает объектная переменная.

Синтаксис:

For Each элемент In структура_данных

<тело цикла>

Next элемент

Пример последовательного вывода на экран окон сообщений с именами всех рабочих листов текущей книги:

Dim S As Worksheet

For Each S In Application.Worksheets

Рис. 6.13. Пример цикла 2

6.6. Использование элементов управления для запуска макроса и ввода данных

Для использования элементов управления на рабочем листе необходимо для каждого из элементов написать код в VBA. Для этого предварительно необходимо перейти в режим конструктора. Также в этом режиме изменяются свойства объекта в окне Properties.

Для записи программного кода элемента управления необходимо дважды щелкнуть мышью на этом элементе (рис. 6.14 а) и он автоматически перейдет в режим VBA и сформирует «операторные скобки» с учетом события пользовательской формы (рис. 6.14 б).

Рис. 6.14. Формирование операторных скобок элемента управления

События пользовательской формы

Событие - это сигнал, подаваемый, если с объектом что-то происходит. Например, кнопка может генерировать событие в ответ на щелчок мышкой по ней, строка ввода – в ответ на ввод чего-то, на щелчок мыши по ней, и т.д.

Рис. 6.15 События пользовательской формы

Некоторые виды событий:

    События мыши - одинарное (двойное) щелканье левой кнопкой мыши на объекте; нажатие (отпускание) кнопки мыши; передвижение курсора мыши по элементу управления.

    События клавиатуры - нажатие простого символа, функциональных клавиш или какого-то сочетания символов на клавиатуре.

    События формы - загрузка (Load), выгрузка (Unload) формы и пр.

Событие Click происходит, когда пользователь нажимает и отпускает кнопку мыши, в то время, когда ее указатель находится на объекте. Событие может произойти при изменении значения элемента управления.

Формат процедуры-обработчика события

Private Sub Form_Click()

Private Sub object_Click()

где object – имя объекта, к которому относится этот обработчик.

Пример:

Private Sub Form_Click()

MsgBox “Click”

Рис. 6.17. Пример создания кнопки

Написание кода программы для ЭУ

Программирование элемента управления происходит по тем же принципам, что программирование макроса.

Программирование кнопки :

Пример 1 : Написание Привет после нажатия кнопки:

Private Sub Кнопка_Click()

MsgBox "Привет:)"

Рис. 6.18. Пример 1 создания элемента управления

Пример 2: Проверка условий: пересчет таблицы

Рис. 6.19. Исходная таблица

Создаем кнопку (рис. 6.20)

Рис. 6.20. Создание кнопки для реализации примера 2

Двойной щелчок переводит в окно создания процедуры (рис. 6.21):

Рис. 6.21. Окно создания процедуры

Создаем код:

Private Sub sum_Click()

Dim I As Integer

For I = 2 To 8 Step 1

N = Cells(I, 2) * Cells(I, 3)

S = S + Cells(I, 4).Value

Cells(I + 2, 4) = S

Где Cells(I, 4) – номер ячейки, где I – строка, 4 – столбец (D).

Код рассматриваемого примера в VBA и результат выполнения программы с разными условиями представлен на рис. 6.22.




Рис. 6.22. Реализация рассматриваемого примера

6.7. Пользовательские формы, создаваемые в VBA

Пользовательские формы необходимы для создания более эффективного интерфейса взаимодействия с пользователем.

Например, вместо ввода личной информации непосредственно на рабочем листе можно создать пользовательскую форму, запрашивающую ввод данных, или форма для программы расчета данных.

Формы являются объектами, которые могут вызываться другими модулями приложения.

К формам можно добавлять пользовательские методы и свойства. Для создания в форме нового метода надо добавить процедуру, объявленную со словом Public:

Public Sub UserMethod()

операторы

Стили интерфейса:

1) однодокументный (SDI) – можно открыть только один документ, при этом нужно закрыть активный документ, чтобы открыть другой;

2) многодокументный (MDI) – поддерживает несколько форм внутри основной формы-контейнера; имеет в меню Window элементы для переключения между окнами или документами;

3) стиль explorer – окно, имеющее две панели, или области, обычно, состоящие из иерархического представления уровней информации слева и области отображения справа.

Этапы создания формы:

1. На форму помещаются нужные элементы управления и красиво размещаются.

Результат: имеем форму с элементами управления, но надписи на них стандартные: Command1, Label1, и т.д.

2. Задаются свойства формы и элементов управления

Результат: форма имеет нужный вид, на всех ЭУ понятные надписи, нужные картинки и т.д. Запуск ее невозможен в связи отсутствия кода программы.

3. Пишутся обработчики событий элементов управления.

Результат: выполнение действий в соответствии с заданием.

Д
ля вставки пользовательской формы необходимоInsert (Вставка) – UserForm (Пользовательская форма).

При отсутствии окна свойства его можно открыть, выполнив: View (Вид) Properties Window (Окно свойств).

Рис. 6.23. Интерфейс создания формы

Пример 1: Создать форму для расчета функции
, содержащую:

    место для вывода (из программы) результата расчета;

    текстовое поле для ввода исходных данных;

    кнопку для запуска программы и отмены.

После задания вида формы (рис. 6.24) следует задание кода программы.

Рис. 6.24. Создание формы для примера 1

Двойной щелчок по кнопке «Вычислить» переведет форму в редактирование кода.

Private Sub Calc_Click()

1: a = TextBox_a.Value

2: b = TextBox_b.Value

3: c = Sqr(a ^ 2 + b ^ 2)

4: Label1.Caption = "c = " & Str(c)

Private Sub Cancel_Click()

Рис. 6.25. Иллюстрация работы формы примера 1

Пользовательская форма может быть выведена из любого модуля. Для ее вывода используется метод Show. Name.Show

Private Sub VSch_Click()

Рис. 6.26. Использование метода Show

Пример 2. Создание формы для ввода пользователем переменных и управляющих выключателей с суммированием и вычитанием с отображение результата.


Рис. 6.27. Создание формы и ее код в VBA для примера 2

Private Sub CommandButton1_Click()

Dim first As Long, second As Long

first = tb1.Value

second = tb2.Value

"Если выбрана первая кнопка, складываем переменные

If ob1.Value = True Then

lab4.Caption = first + second

"Если выбрана вторая кнопка, вычитаем переменные

If ob2.Value = True Then

lab4.Caption = first - second


Рис. 6.28. Иллюстрация работы формы примера 2

Пример 3. Создание формы для ввода пользователем данных и вывода их в строки таблицы



Рис. 6.29. Создание формы для примера 3

Private Sub CB_Cancel_Click()

Private Sub CB_ok_Click()

Dim LastRow As Long

LastRow = Worksheets("Лист3").Range("A65536").End(xlUp).Row + 1

Cells(LastRow, 1).Value = tb1.Value

Cells(LastRow, 2).Value = tb2.Value

Cells(LastRow, 3).Value = tb3.Value


Рис. 6.30. Иллюстрация работы формы примера 3

Вопросы для самоконтроля

    Что такое VBA?

    Что такое объекты, методы и свойства в VBA ?

    Опишите иерархию в вVBA?

    Что такое процедура?

    Что такое элемент управления?

    Опишите синтаксис переменной?

    Какие типы констант используются в VBA?

    Для чего используются функция MsgBox и InputBox?

    Какие управляющие конструкции используются в VBA?

    Что такое событие пользовательской формы?

    Что такое пользовательская форма?

    Какие стили интерфейса используются при создании пользовательской формы?

Глоссарий

VBA (Visual Basic for Applications) - это объектно-ориентированный язык макропрограммирования высокого уровня, встроенный во все программы пакета Microsoft Office.

Макрос (или макрокоманда) - последовательность команд и функций, записанных в модуле VBA, позволяющая автоматизировать выполнение основных операций.

Элемент управления - размещаемые на рабочих листах и в диалоговых окнах объекты, предназначенные для отображения, ввода и вычисления данных.

Режим конструктора переводит Excel в режим отключения всех элементов управления на рабочем листе.

Объектом считается любой элемент приложения ─ ячейка, лист, рабочая книга, диаграмма. Объекты могут включать области ячеек, рамки ячеек, окна, сценарии, стили и т.д. Каждый класс объектов имеет свое множество свойств, функций и событий

Метод ─ это действие, которое может быть выполнено над объектом.

Свойство является атрибутом объекта, описывающим, как объект выглядит (его цвет, размер и местоположение) и как он действует (является ли видимым, ссылается ли на другой объект).

Событие – взаимодействие пользователя с определенным объектом на рабочем листе.

Модуль – это часть программы, оформленная в таком виде, при котором допускается ее независимая трансляция.

Процедурой называется фрагмент кода (минимальная семантически законченная программная конструкция), заключенный между операторами Sub и End Sub.

Переменная – это поименованная область памяти, используемая для хранения данных в течение работы процедуры

Область видимости переменной – это область программ, где имя переменной считается допустимым (видимым), а, следовательно, возможен доступ к ее значению.

MsgBox - эта функция отображает диалоговое окно, содержащее сообщение длиной до 1024 символов, в которое с помощью операции конкатенации можно включить значение переменных, а также (необязательно) кнопки для реакции на отображения окна (по умолчанию только кнопка ОК).

InputBox - функция, применяемая для ввода значений переменных в программу.

Оператор If - это оператор позволяющий задавать выполнение тех или иных действий в зависимости от заданных условий.

Управляющие конструкции языка программирования – это инструкции и группы инструкций, применение которых позволяет изменять по мере необходимости последовательность выполнения других инструкций программы

Ветвлением называется управляющая конструкция, позволяющая пропускать при выполнении те или иные группы инструкций в зависимости от значения условия.

Цикл – это управляющая конструкция, представляющая возможность многократно выполнять группы инструкций до наступления какого-либо события.

Событие элемента управления - это сигнал, подаваемый, если с объектом что-то происходит.

7. Обмен данными в Электронной таблице




Top