Сайт о телевидении

Сайт о телевидении

» » Знакомство с программированием в Excel. Основы программирования на языке VBA

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

VBA в Excel

Программирование в Excel с помощью VBA.

Язык VBA позволяет писать макросы в Excel. Как это делать рассматривается ниже.

Application

Application - это объект, занимающий вершину иерархии объектов в Excel. Application – это и есть Excel. Вот примеры использования Application:

окно нормальных размеров

Application.WindowState = xlNormal

окно максимальных размеров

Application.WindowState = xlMaximized

Workbooks

Workbooks - это коллекция рабочих книг, которые открыты. Каждая рабочая книга представлена объектом Workbook. Узнать сколько рабочих книг сейчас в коллекции можно так:

Dim bookCount As Integer
bookCount = Workbooks.Count
MsgBox ("Opened books = " & bookCount)

Обатиться к нужной рабочей книге в коллекции Workbooks можно обратиться по его номеру или по имени:

Workbooks.Item(2).Activate

здесь мы активизировали второй элемент коллекции Workbooks.

Другие примеры мы увидим ниже.

Workbook

Workbooks.Item(1).Save

И где же в этом примере рабочая книга Workbook? Здесь: Workbooks.Item(1), это выражение возвращает первый элемент коллекции Workbooks, а это и есть Workbook.

Закрыть рабочую книгу:

Workbooks.Item(1).Close

Sheets

Sheets - это все листы рабочей книги. Листы рабочей книги представлены двумя типами: рабочие листы - это обычные листы Excel и второй тип - это листы диаграмм. Те и другие и составляют коллекцию Sheets.

Charts

Charts - это только диаграммы рабочей книги.

Chart

Chart - это объект, представляющий одину диаграмму. Если диаграмма содержится в обычном рабочем листе, то она объектом Chart не является.

Worksheets

Worksheets - это только рабочие листы рабочей книги.

Добавим рабочий лист в коллекцию Worksheets:

Worksheet

Worksheet - это один лист рабочей книги Excel.

Все ячейки рабочего листа Worksheet:

Worksheets("Лист1").Cells

Range. Работа с ячейками в Excel

Range - это одна ячейка листа или несколько ячеек. Этот объект рассмотрим подробнее. Установим кнопку на рабочий лист Excel. Откройте панель инструментов «Элементы управления» (правой кнопкой по свободному полю панели инструментов и выбираем из выпавшего меню). В этой панели выбираем кнопку и устанавливаем её на свободное место рабочего листа, в его правой части. Правой кнопкой мыши по нашей кнопке - > Свойства. Установите значение свойства Name - CommandButton, а свойства Caption - Range Test.

Получаем:

Закройте окно свойств кнопки, и кликаем по нашей кнопке правой кнопкой мыши, из выпавшего меню выбираем «Исходный текст». Открывается окно редактора VBA, оно называется Microsoft Visual Basic. В нём уже есть заготовка обработчика нажатия на кнопку CommandButton:

Кстати, помотрите на эту заготовку, ключевое слово Sub говорит, что это процедура, а слово Private указывает, что эта процедура видна лишь в данном модуле.

Всё у нас готово для начала изучения работы с ячейками рабочего листа Excel.

Как задать активную ячейку?

Сделаем активной ячейку A2:A2:

Private Sub CommandButton_Click()
Range("A2:A2").Activate
End Sub

Функция написанная на 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, преимущества, возможности применения

VBA (Visual Basic for Applications) - это диалект языка Visual Basic, расширяющий возможности Visual Basic и предназначенный для работы с приложениями Microsoft Office и другими приложениями от Microsoft и третьих фирм.

В принципе, как это не удивительно, при программировании в Office можно вполне обойтись без языка VBA. Подойдет любой COM-совместимый язык, например, обычный Visual Basic, VBScript, JScript, C++, Delphi, Java и т.п. Можно использовать и.NET-совместимые языки программирования - VB.NET, C# и т.п. Все возможности объектных моделей приложений Office вполне можно будет использовать. Например, если сохранить следующий код в файле с расширением *.vbs и запустить его на выполнение, то будет запущен Word, в нем открыт новый документ и впечатан текст:

Set oWord = CreateObject("Word.Application")

oWord.Visible = true

oWord.Documents.Add

oWord.Selection.TypeText ("Привет от VBScript")

Однако VBA обычно - самый удобный язык для работы с приложениями Office.

Главная причина проста - язык VBA встроен в приложения Office (и не только), и код на языке VBA можно хранить внутри документов приложений Office - документах Word, книгах Excel, презентациях PowerPoint и т.п. Конечно же, этот код можно запускать оттуда на выполнение, поскольку среда выполнения кода VBA (на программистском сленге - хост) встроена внутрь этих приложений.

В настоящее время VBA встроен:

  • во все главные приложения MS Office - Word, Excel, Access, PowerPoint, Outlook, FrontPage, InfoPath;
  • в другие приложения Microsoft, например, Visio и M icrosoft Project;
  • в более чем 100 приложений третьих фирм, например, CorelDraw и CorelWordPerfect Office 2000, AutoCAD и т.п.

У VBA есть также множество других преимуществ:

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

  • создавать полноценные приложения на Visual Basic (поскольку эти языки - близкие родственники);
  • использовать все возможности языка VBScript (это - вообще урезанный VBA). В результате в вашем распоряжении будут универсальные средства для создания скриптов администрирования Windows (об этом - в конце курса), для создания Web-страниц (VBScript в Internet Explorer), для создания Web-приложений ASP, для применения в пакетах DTS и заданиях на MS SQL Server, для создания серверных скриптов Exchange Server и многое-многое другое.

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

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

Несмотря на то, что часто приложения VBA выполняются медленнее, чем бы вам хотелось, они нересурсоемки и очень хорошо работают, например, на сервере терминалов. Но, как правило, для программ на VBA особых требований про производительности и нет: для написания игр, драйверов, серверных продуктов они не используется. По моему опыту, чаще всего проблемы с производительностью VBA-приложений - это не проблемы VBA, а проблемы баз данных, к которым они обращаются. Если проблемы действительно в VBA (обычно тогда, когда вам требуется сложная математика), то всегда есть возможность написать важный код на C++ и обращаться к нему как к обычной библиотеке DLL или встраиваемому приложению (Add-In) для Word, Excel, Access и т.п.

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

В среде программистов-профессионалов считается, что самый короткий путь "с нуля" и программ типа "Hello, World" до профессиональных программ, которые делаются под заказ - именно через связку Office- VBA (а конечно, не через C++, Java или Delphi).

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

Sub VBA_Demo()
" Пример простой процедуры VBA
Dim Total As Long, i As Long
Total = 0
For i = 1 To 100
Total = Total + i
Next i
MsgBox Total
End Sub

Скачать заметку в формате или

В этой процедуре применяются некоторые популярные элементы языка:

  • комментарий (строка, начинающаяся апострофом);
  • оператор объявления переменной (строка, начинающаяся ключевым словом Dim);
  • две переменные (Total и i);
  • два оператора присваивания (Total = 0 и Total = Total + i);
  • циклическая структура (For–Next);
  • функция VBA (MsgBox).

Комментарии

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

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

Переменные, типы данных и константы

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

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

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

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

Существуют три типы областей действия переменных:

Работа с константами

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

Для объявления констант используется оператор Const. Например,

Const NumQuarters as Integer = 4

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

Sub SetToLandscape ()
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub

Фактическое значение переменной xlLandscape равно 2. Окно Object Browser содержит список всех констант Excel и VBA. Чтобы открыть Object Browser в VBE, нажмите клавишу .

В VBA дата и время определяются как значения, заключенные между знаками #

Const FirstDay As Date = #1/1/2007#
Const Noon = #12:00:00#

Даты всегда определяются в формате " месяц/день/год " , даже если система настроена на отображение данных в другом формате.

Операторы присваивания

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

Большое количество операций, выполняемых в VBA, связано с разработкой (и отладкой) выражений. Если вы знаете, как создавать формулы в Excel, то у вас не будет возникать проблем с созданием выражений в VBA. В формуле рабочего листа Excel результат отображается в ячейке. С другой стороны, выражение VBA может присваивать значение переменной или использоваться как значение свойства. В VBA оператором присваивания выступает знак равенства (=).

Массивы

Массив - это группа элементов одного типа, которые имеют общее имя; на конкретный элемент массива ссылаются, используя имя массива и индекс. Например, можно определить массив из 12 строк так, чтобы каждая переменная соответствовала названию месяца. Если вы назовете массив MonthNames, то можете обратиться к первому элементу массива как MonthNames (0), ко второму - как MonthNames (1) и так до MonthNames (11).

Объявить массив, содержащий ровно 100 целых чисел, можно следующим образом:

Dim MyArray(1 То 100) As Integer

По умолчанию в массивах VBA в качестве первого элемента используется нуль. Если вы хотите, чтобы в качестве первого индекса всех массивов использовалась единица, то перед первой процедурой модуля нужно сделать следующее объявление: Option Base 1

Динамический массив не имеет предопределенного количества элементов. Он объявляется с незаполненными значениями в скобках: Dim MyArray() As Integer. Тем не менее, прежде чем динамический массив можно будет использовать в программе, необходимо обратиться к оператору ReDim, указывающему VBA, сколько элементов находится в массиве. Для этого часто применяется переменная, значение которой неизвестно до тех пор, пока процедура не будет запущена на выполнение. Например, если переменной х присвоено число, размер массива определяется с помощью следующего оператора: ReDim MyArray (1 to х).

Объектные переменные

Объектая переменная - это переменная, представляющая целый объект, например, диапазон или рабочий лист: Dim InputArea As Range. Для присваивания объекта переменной воспользуйтесь ключевым словом Set: Set InputArea = Range(«С16:Е16»).

Встроенные функции

В VBA есть ряд встроенных функций, упрощающих вычисления и операции. Например, функция VBA UCase, преобразующая строку в верхний регистр, эквивалентна функции Excel ПРОПИСН. Чтобы использовать функцию Excel в операторе VBA, перед названием функции введите следующее выражение:

Application.WorksheetFunction

Важно понимать, что вы не можете использовать функции Excel, для которых в VBA представлены эквивалентные функции. Например, VBA не позволяет получить доступ к функции Excel КОРЕНЬ (SQRT), так как в VBA имеется собственная версия этой функции: Sqr. Таким образом, следующий оператор выдает ошибку:

MsgBox Application.WorksheetFunction.Sqrt(123)

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

MsgBox(сообщение[, кнопки] [, заголовок] [, файл_справки, контекст])

  • Сообщение (обязательный аргумент) - сообщение, которое отображается в диалоговом окне.
  • Кнопки (необязательный аргумент) - значение, определяющее, какие кнопки и пиктограммы (если нужно) отображаются в окне сообщения. Применяйте встроенные константы (например, vbYesNo).
  • Заголовок (необязательный аргумент) - текст, который отображается в строке заголовка окна сообщения. По умолчанию отображается текст Microsoft Excel.
  • Файл_справки (необязательный аргумент) - название файла справки, соответствующего окну сообщения.
  • Контекст (необязательный аргумент) - контекстный идентификатор раздела справки. Представляет конкретный раздел справки для отображения. Если используется аргумент контекст, следует также задействовать аргумент файл_справки.

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

Ans = MsgBox(" Продолжить? " , vbYesNo + vbQuestion, " Сообщи ")
If Ans = vbNo Then Exit Sub

Обратите внимание, что в качестве значения аргумента кнопки используется сумма двух встроенных констант (vbYesNo + vbQuestion). Благодаря константе vbYesNo в окне сообщения отображаются две кнопки: одна с меткой Yes, а вторая - с меткой No. Добавление vbQuestion в состав аргумента также приведет к отображению значка вопроса. Как только будет выполнен первый оператор, переменная Ans получит одно из двух значений, представленных константами vbYes и vbNo. В этом примере процедура завершает свою работу после щелчка на кнопке No.

Управление объектами и коллекциями

VBA предлагает две конструкции, которые помогут вам упростить управление объектами и коллекциями. Конструкция With — End With позволяет выполнять несколько операций над одним объектом. Чтобы понять, как она работает, проанализируйте следующую процедуру, которая изменяет шесть свойств выделенного объекта (подразумевается, что выделен объект Range).

Sub ChangeFontl()
Selection.Font.Name = " Cambria "
Selection.Font.Bold = True Selection.Font.Italic = True
Selection.Font.Size = 12
Selection.Font.Underline = xlUnderlineStyleSingle
Selection.Font.ThemeColor = xlThemeColorAccentl
End Sub

Эту процедуру можно переписать с помощью конструкции With — End With. Процедура, показанная ниже, работает точно так же, как и предыдущая.

Sub ChangeFont2 ()
With Selection.Font
.Name = " Cambria "
.Bold = True
.Italic = True
.Size = 12
.Underline = xlUnderlineStyleSingle
.ThemeColor = xlThemeColorAccentl
End With
End Sub

Предположим, вы решили выполнить действие над всеми объектами коллекции или вам необходимо оценить все объекты коллекции и совершить действие при выполнении определенных условий. Это идеальная ситуация для применения конструкции For Each — Next. Синтаксис конструкции:

For Each элемент In коллекция
[инструкции ]
[инструкции ]
Next [элемент ]

Например:

Sub CountSheets()
Dim Item as Worksheet
For Each Item In ActiveWorkbook.Worksheets
MsgBox Item.Name
Next Item
End Sub

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

Sub Closelnactive()
Dim Book as Workbook
For Each Book In Workbooks
If Book.Name <> ActiveWorkbook.Name Then Book.Close
Next Book
End Sub

Контроль за выполнением кода

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

Оператор GoTo перенаправляет ход выполнения программы на новую инструкцию, которая помечена специальным образом (текстовая строка, заканчивающаяся двоеточием, или число, заканчивающееся пробелом, указанные перед инструкцией). В приведенной ниже процедуре применена функция VBA InputBox для получения имени пользователя. Если имя пользователя отличается от Ховард, то процедура переходит к метке WrongName, на чем заканчивает свою работу. В противном случае процедура выполняет дополнительные операции. Оператор Exit Sub заканчивает выполнение процедуры.

Sub GoToDemo()
UserName = InputBox(" Введите свое имя: ")
If UserName <> " Ховард " Then GoTo WrongName
MsgBox (" Привет, Ховард… ")
" — [Здесь вводится дополнительный код] —
Exit Sub
WrongName:
MsgBox " Извините, эту процедуру может запускать только Ховард. "
End Sub

В действительности оператор GoTo необходим только для перехват ошибок (код выше является неудачным примером, который не следует использовать).

Вероятно, конструкция If-Then чаще остальных используется для группирования инструкций VBA:

If условие Then инструкции_истина

Например

Sub GreetMe()
If Time < 0.5 Then
MsgBox " Доброе утро "
Elself Time >= 0.5 And Time < 0.75 Then
MsgBox " Добрый день "
Else
MsgBox " Добрый вечер "
End If
End Sub

VBA использует систему дат и времени, похожую на задействованную в Excel. Время дня выражается дробным числом, например, полдень представлен как 0.5. Значение 0.75 представляет время 18:00 - три четверти суток и тот момент, когда день переходит в вечер. Вложенные структуры If-Then достаточно громоздкие. Поэтому рекомендуется использовать их только для принятия простых бинарных решений. Если же необходимо выбрать между тремя и более вариантами, то целесообразно обратиться к конструкции Select Case.

В следующей процедуре используется функция VBA WeekDay, с помощью которой определяется, является ли текущий день субботой либо воскресеньем (функция Weekday возвращает значение 1 либо 7). Затем отображается соответствующее сообщение.

Sub GreetUserlO
Select Case Weekday(Now)
Case 1, 7
MsgBox " Это выходные "
Case Else
MsgBox " Это не выходные "
End Select
End Sub

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

Цикл - это процесс повторения набора инструкций. Возможно, вы заранее знаете, сколько раз должен повториться цикл, или это значение определяется переменными в программе. Простейший пример хорошего цикла - For-Next:

For счетчик = начало То конец
[инструкции ]
[инструкции ]
Next [счетчик ]

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

Sub SumSquareRoots()
Dim Sum As Double
Dim Count As Integer
Sum = 0
For Count = 1 To 100
Sum = Sum + Sqr(Count)
Next Count
MsgBox Sum
End Sub

Значение переменной Step в цикле For-Next может быть отрицательным. Приведенная ниже процедура удаляет строки 2, 4, 6, 8 и 10 в активном листе:

Sub DeleteRows ()
Dim RowNum As Long
For RowNum = 10 To 2 Step -2
Rows(RowNum).Delete
Next RowNum
End Sub

Циклы For-Next могут также содержать один или более операторов Exit For. Когда программа встречает этот оператор, то сразу же выходит из цикла:

Sub ExitForDemo()
Dim MaxVal As Double
Dim Row As Long
MaxVal = Application.WorksheetFunction.Max(Range(" A:A "))
For Row = 1 To 1048576
If Cells(Row, 1).Value = MaxVal Then
Exit For
End If
Next Row
MsgBox " Максимальное значение в строке " & Row
Cells(Row, 1).Activate
End Sub

Максимальное значение в столбце вычисляется с помощью функции Excel МАХ. Затем это значение присваивается переменной MaxVal. Цикл For-Next проверяет каждую ячейку в столбце. Если определенная ячейка равна MaxVal, оператор Exit For заканчивает процедуру. Однако перед выходом из цикла процедура сообщает пользователю о расположении искомой ячейки и активизирует ее.

Цикл Do While выполняется до тех пор, пока удовлетворяется заданное условие. Цикл Do While может иметь один из двух представленных ниже синтаксисов.

Do
[инструкции ]
[инструкции ]
Loop

Do
[инструкции ]
[инструкции ]
Loop

Процедура EnterDates1 вводит даты текущего месяца в столбец рабочего листа, начиная с активной ячейки:

Sub EnterDatesl ()
" цикл Do While, условие проверяется в начале
Dim TheDate As Date
TheDate = DateSerial(Year(Date), Month(Date), 1)
Do While Month(TheDate) = Month(Date)
ActiveCell = TheDate
TheDate = TheDate + 1
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

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

Циклы Do While также могут включать один или более операторов Exit Do. По достижении оператора Exit Do цикл завершается, а управление передается оператору, следующему за оператором Loop.

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

По материалам книги . – М: Диалектика, 2013. – С. 211–251.