Как обратиться к диапазону из VBA

Функция написанная на 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.

В это статье мы кратко познакомимся с языком VBA, который позволяет создавать макросы в программных продуктах Microsoft Office. Макросы – некий программный код, который позволяет реализовывать за вас поставленную задачу. В отличии от прикладных программ, макросы VBA как таковые не могут выполняться самостоятельно. Язык VBA – Visual Basic for Applications является родственником таких языков как VBScript, Visual Basic или простой Basic. Синтаксис и общие правила программирования практически идентичны.

По сути, зная язык сервера Windows Script Host, вы с легкостью освоите все премудрости VBA.

Отличия VBA от VBScript

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

Внешние объекты – оба языка позволяют подключать функциональные возможности внешних объектов. Объект – в данном контексте это внешний библиотечный файл с набором методов (функций) и свойств (переменных). Однако, если вы создаете макрос в Word, то объект Word.Application будет доступен автоматически, если макрос работает в документе Excel, то автоматически доступен компонент Excel.Application. В сценариях эти объекты нужно подключать самостоятельно (сделать ссылку).

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

Практическое применение VBA

И так, открыв любой документ Microsoft Office, например, Word, мы может вызвать встроенный редактор Visual Basic (комбинация клавиш Alt + F11) и приступить к созданию макроса. Как упоминалось выше, в макросах можно подключать функциональные возможности внешних объектов, тем самым, получать доступ к элементам операционной системы, например, файловая система, реестр и так далее. Желательно, что бы в настройках был отключен автоматический запуск макроса при открытии документа, дабы дырявый или зловредный код не натворил лиха.

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

Общие синтаксические принципы языка VBA

  • Регистр не играет роли – вы можете прописать оператор как в верхнем, так и в нижнем регистре, или вообще в вперемешку, например, dim, DIM, Dim, разницы нет.
  • Комментарии – для комментирования строки, перед ней прописывается одинарная кавычка или ключевое слово REM.
  • Максимальная длина любого имени (будь то , или ) составляет 255 знаков.
  • В отличии от JavaScript, или С языков, в VBA в конце строки с операторами не нужно ставить запятой.
  • Двоеточие – чтобы не прописывать каждый оператор в отдельной строке, их можно с помощью двоеточия прописать в одну строку, например: MsgBox "Строка1" : MsgBox "Строка2"
  • Перенос операторов – если строка с операторами слишком длинная, то ее можно разделить на несколько при помощи символа подчеркивания и знака &, например:
    MsgBox "Это простая" _
    & "строка"

Для демонстрации работы с макросами напишем такой пример. Откройте документ Microsoft Word и запустите редактор Visual Basic. Вам нужно создать новую форму и новый модуль (макрос). Цель – решение квадратного уравнения с изменяемыми значениями.

На поверхность формы надо добавить три полосы прокрутки и две текстовые метки. В редакторе кода для формы пропишите:

Option Explicit Sub Get_Result() Dim MyA As Byte , MyB As Byte , MyC As Byte Dim D, x, x1, x2, msg MyA = ScrollBar1.Value: MyB = ScrollBar2.Value: MyC = ScrollBar3.Value Label1.Caption = MyA & "x*x + " _ & MyB & "x + " _ & MyC & " = 0" " находим дискриминант D = MyB ^ 2 - 4 * MyA * MyC "Если дискриминант равен нулую - одно решение If D = 0 Then x = MyB / (2 * MyA) msg = "Уравнение имеет одно решение, x ровно: " & x "Если дискриминант больше нуля - два решения ElseIf D > 0 Then x1 = (-MyB + Sqr(D)) / (2 * MyA) x2 = (-MyB - Sqr(D)) / (2 * MyA) msg = "Уравнение имеет два решения" & vbCrLf & "x1 ровно: " & x1 & vbCrLf & "x2 ровно: " & x2 "Если дискриминант меньше нуля - нет решения Else msg = "Нет решения (комплексные числа)" End If Label2.Caption = msg End Sub Private Sub ScrollBar1_Change() Call Get_Result End Sub Private Sub ScrollBar2_Change() Call Get_Result End Sub Private Sub ScrollBar3_Change() Call Get_Result End Sub Private Sub UserForm_Initialize() Dim MyA As Byte , MyB As Byte , MyC As Byte " параметры полос прокрутки ScrollBar1.Min = 1 ScrollBar1.Max = 20 ScrollBar2.Min = 1 ScrollBar2.Max = 30 ScrollBar3.Min = 1 ScrollBar3.Max = 40 " параметры первого текстового поля Label1.FontSize = 15 Label1.ForeColor = &HFF0000 Label1.TextAlign = fmTextAlignCenter " параметры второго текстового поля Label2.FontSize = 15 Label2.ForeColor = &H6400 MyA = ScrollBar1.Value: MyB = ScrollBar2.Value: MyC = ScrollBar3.Value Label1.Caption = MyA & "x*x + " _ & MyB & "x + " _ & MyC & " = 0" End Sub

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

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. Обмен данными в Электронной таблице

Перед тем, как приступить к созданию собственных функций 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 , которая показывает пользователю всплывающее окно с предупреждением.

Написание кода Ваших процедур и редактирование макросов производится в редакторе Visual Basic, который доступен с вкладки «Разработчик». Данная вкладка по умолчанию скрыта. Для ее отображения необходимо выполнить следующие действия:

Для Excel 2007 . Зайдите в параметры Excel, используя кнопку Office, и в «основных параметрах работы с Excel» установите галочку на пункте «Показывать вкладку Разработчик на ленте».

Для Excel 2010 и 2013 . В параметрах Excel нужно выбрать пункт «Настроить ленту» и в категории основные вкладки установить галочку для вкладки «Разработчик».

Знакомство с редактором Visual Basic в Excel

Чтобы попасть в редактор кода, кликните на вкладке разработчика в области «Код» по кнопке «Visual Basic».

После этого на экране появится новое окно редактора VBA. Рассмотрим ниже некоторые его элементы, которые могут понадобиться в самом начале.

№2 на изображении . Кнопки запуска, остановки и прерывания выполнения кода. Во время запуска начинает выполняться код той процедуры, на которой размещен курсор. Данные кнопки дублируются вкладкой «Run» основного меню редактора.

№3 на изображении . Окно управления проектами VBA открытых книг (Project Explorer) и кнопка, отображающая это окно.

№4 на изображении . Кнопка, отображающая окно свойств объектов (Properties Window), выбранных в окне №3, и элементов пользовательских форм (работа с объектами, их свойствами и методами будет рассмотрена в отдельной статье этой категории).

№5 на изображении . Кнопка вызова окна объектов (Object Browser). В нем описаны все доступные для работы объекты, их свойства и методы.

Кнопки №3, №4 и №5 так же доступны на вкладке «View» главного меню редактора. Там же можно вызвать другие полезные для работы окна, которые не будут рассмотрены в этом материале.

Написание простой процедуры на Visual Basic for Application

Код любой процедуры (подпрограммы) располагается в модуле, поэтому необходимо его добавить, чтобы приступить к программированию. Выберите пункт «Module» на вкладке «Insert» основного меню редактора VBA. В основной области редактора (на изображении имеет серый фон) должно появиться новое окно кода – Имя_книги – имя_модуля (Code), а в окне управления проектами (№3) к дереву выбранного проекта добавится вновь созданный модуль.

Добавьте в модуль следующий код:

Sub Моя_процедура() MsgBox "Привет пользователь!" End Sub

Данная процедура выводит на экран диалоговое окно с сообщением «Привет пользователь!». Протестируйте ее работу, нажав кнопку Rub Sub (№2 на изображении) или вызвав как обычный макрос.

Теперь более подробно разберем приведенный код.

Любая процедура начинается со строки объявления, состоящей из оператора Sub (сокращение от Subprogram), после которого следует имя подпрограммы. За именем следует перечень аргументов, заключенный в скобки.

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

В этом примере аргументы не используются, поэтому указываются пустые скобки.

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

Последняя строка содержит оператор End с последующим ключевым словом Sub и сообщает о завершении процедуры.

Учимся пользоваться Object Browser

Выше была упомянута функция MsgBox , но ее возможности полностью не рассмотрены. Это хороший случай, чтобы научиться использовать браузер объектов (№5 на изображении окна редактора VBA).

Нажмите кнопку на панели или клавишу F2, чтобы отобразить Object Browser:

Выпадающий список №1 содержит перечень всех подключенных библиотек. Используйте его только в том случае, если точно знаете, к какой библиотеке относится изучаемый класс, функция и т.д. (подключить или отключить любую из доступных библиотек можно, выбрав пункт «References» на вкладке «Tools» главного меню редактора VBA).

Примечание: Библиотеки предоставляют стандартные и дополнительные возможности работы с объектами Excel (ячейки, листы, книги и т.д.), файловой системы, изображениями, базами данных и другими.

Поле №2 предназначено для поиска свойств, методов, классов подключенных библиотек.

Результаты поиска отображаются в поле №3 и представляют из себя таблицу с тремя столбцами: библиотека, класс и член класса.

Поле №4 содержит перечень всех классов, выбранных в поле №1 библиотек.

В области №5 содержится список всех членов класса, выбранного в поле №4.

Поле №6 содержит краткую справку о выделенном результате поиска, классе или члене класса.

Примечание: библиотеки, классы, функции и процедуры (методы), свойства и т.п. в Object Browser имеют различные обозначения, представленные набором пиктограмм. Краткая справка (поле №6) всегда указывает какой тип элемента выделен. Обращайте на это внимание, чтобы в дальнейшем лучше ориентироваться в работе с объектами.

Примечание: Понятие объекта не относится к теме данной статьи и будет рассмотрено в следующих материалах.

Теперь найдем функцию MsgBox с помощью браузера объектов. В поле поиска (№2) впишите ее название и кликните по кнопке с изображением бинокля. В поле результатов поиска выделите строку со значением MsgBox в столбце «Member». В поле №6 появилась краткая информация, сообщающая нам, что выбранный член является функцией, имеет перечень аргументов, возвращает результат типа VbMsgBoxResult, относиться в классу Interaction библиотеки VBA.

Для получения полной справки кликните по кнопке с изображением вопросительного знака. В зависимости от версии Excel, Вас перенаправить на файл справки или сайт с документацией от Microsoft.

Изучите самостоятельно возможности функции MsgBox.

Ссылка на процедуру VBA

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

Для лучшего понимая рассмотрим пример (в примере используется псевдокод):

Начало_Процедуры Любой код Первая строка дублирующего кода Любой код Последняя строка дублирующего кода Любой код Первая строка дублирующего кода Любой код Последняя строка дублирующего кода Любой код Конец_Процедуру

Выносите дублирующие участки кода в отдельные процедуры и указывайте ссылки на них из главной процедуры:

Начало_Главной_Процедуры Любой код Ссылка на Процедуру_дублирующегося_кода Любой код Ссылка на Процедуру_дублирующегося_кода Любой код Конец_Главной_Процедуру Начало_Процедуры_дублирующегося_кода Любой код Конец_Процедуры_дублирующегося_кода

Call Макрос1 "Следующая строка идентична предыдущей Макрос1

Если материалы сайт Вам помогли, то поддержите, пожалуйста, проект, чтобы мы могли развивать его дальше.

У Вас недостаточно прав для комментирования.