Вы находитесь на странице: 1из 135

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ


ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ЭКОНОМИКИ И ФИНАНСОВ»

КАФЕДРА ИНФОРМАТИКИ

А.М. ВЛАСОВЕЦ

ВВЕДЕНИЕ В VBA

УЧЕБНОЕ ПОСОБИЕ

ИЗДАТЕЛЬСТВО
САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО УНИВЕРСИТЕТА
ЭКОНОМИКИ И ФИНАНСОВ
2010
2

ББК 32.81
В 58

Власовец А.М.

Введение в VBA: Учебное пособие. – СПб.: Изд-во СПбГУЭФ, 2010. –


135 с.

В учебном пособии изложены основные сведения об объектно-ориенти-


рованном языке программирования, позволяющем автоматизировать решение
задач в среде приложений в MS Office.
Содержание учебного пособия соответствует программам учебных дисци-
плин «Информатика и программирование» и «Информатика». Пособие предна-
значено для студентов специальности «Прикладная информатика в экономике»
и может быть использовано студентами других факультетов СПбГУЭФ.

Рецензенты: д-р техн. наук, проф. Е.П. Истомин


д-р экон. наук, проф. В.П. Чернов

© Издательство СПбГУЭФ, 2010


3
1. Объектно-ориентированное программирование
VBA – это языковый процессор интерпретирующего типа, который
построчно анализирует исходную программу и одновременно выполняет
предписанные действия.
“Язык программирования – формальная знаковая система, предна-
значенная для записи программ. Программа обычно представляет собой
некоторый алгоритм в форме, понятной для исполнителя. Язык програм-
мирования определяет набор лексических, синтаксических и семантиче-
ских правил, используемых при составлении компьютерной программы. Он
позволяет программисту точно определить, на какие события будет реаги-
ровать компьютер, как будут храниться и передаваться данные, а также
какие именно действия следует выполнять над этими данными при раз-
личных обстоятельствах” [Материал из Википедии – свободной энцикло-
педии].
Язык программирования VBA (Visual Basic for Application) пакета Mi-
crosoft Office предназначен для автоматизации разработки документов при
решении задач, использующих приложения этого пакета: Excel, Word, Ac-
cess, PowerPoint, Outlook, – начиная с проектирования простых документов
и кончая автоматизацией документооборота. VBA разработан на основе
языка Visual Basic, является языком программирования высокого уровня, и
в нем широко используются элементы объектно-ориентированного и собы-
тийно-управляемого программирования. VBA предоставляет пользовате-
лю возможность создания экранных форм со стандартным набором эле-
ментов управления и написания процедур, обрабатывающих события,
которые возникают при тех или иных действиях системы и конечного поль-
зователя.
При разработке приложений в VBA можно использовать средства
процедурного программирования и объектно-ориентированного про-
граммирования.
Процедурное программирование является отражением архитекту-
ры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х
годах. Теоретической моделью процедурного программирования служит
алгоритмическая система под названием «машина Тьюринга».
Программа на процедурном языке программирования состоит из по-
следовательности операторов (инструкций), задающих процедуру реше-
ния задачи. Основным является оператор присваивания, служащий для
изменения содержимого областей памяти. Выполнение программы сво-
дится к последовательному выполнению операторов с целью преобразо-
вания значений исходных данных в результаты. Примерами процедурных
языков программирования являются Assembler, Pascal, C, PL/1, FORTRAN.
Объектно-ориентированное программирование (ООП) – это сово-
купность подходов, методов, стратегий, идей и понятий, определяющая
стиль написания программ, в которой основными концепциями являются
понятия объектов и классов.
4

Объект – это некоторая сущность, обладающая определённым со-


стоянием и поведением, имеет заданные значения атрибутов и операций.
Как правило, при рассмотрении объектов выделяется то, что объекты при-
надлежат одному или нескольким классам, которые в свою очередь опре-
деляют поведение объекта.
Класс – это тип, описывающий устройство объектов. Понятие “класс”
подразумевает некоторое поведение и способ представления. Обычно
классы разрабатывают таким образом, чтобы их объекты соответствовали
объектам конкретной предметной области.
Класс является обобщением понятия типа данных и задает свойства
и поведение объектов класса – экземпляров класса. Каждый объект при-
надлежит некоторому классу. Отношение между объектом и его классом
такое же, как между переменной и ее типом. Класс – это объединение
данных и обрабатывающих их процедур и функций. Данные называются
также переменными класса, а процедуры и функции – методами класса.
Переменные определяют свойства объекта, а совокупность их значений

состояние объекта.
Наряду со свойствами и методами с классом связывается еще одно
понятие – событие. Каждый класс имеет определенный набор событий,
которые могут возникать при работе с объектами класса, чаще всего при
определенных действиях пользователя, иногда как результат действия
системы. При возникновении события, связанного с тем или иным объек-
том, система посылает сообщение объекту, которое может быть обрабо-
тано методом – обработчиком события, специально созданным при кон-
струировании объекта. События обеспечивают большую гибкость при ра-
боте с объектами. Методы класса выполняются одинаково для всех объек-
тов класса, а на события каждый объект реагирует индивидуально, по-
скольку имеет собственный обработчик события.
Любой объект может принадлежать или не принадлежать опреде-
ленному классу, то есть обладать или не обладать поведением, которое
данный класс подразумевает. Класс определяет для объекта правила, с
помощью которых с объектом могут работать другие объекты, что обычно
делается с помощью определения методов класса. Кроме того, классы мо-
гут находиться друг с другом в различных отношениях, таких как наследо-
вание.
Наследование – один из четырёх важнейших механизмов объектно-
ориентированного программирования наряду с инкапсуляцией, полимор-
физмом и абстракцией, позволяющий описать новый класс на основе уже
существующего (родительского), при этом свойства и функциональность
родительского класса заимствуются новым классом. Другими словами,
класс-наследник реализует спецификацию уже существующего класса,
добавляя при необходимости новые свойства и методы. Набор классов,
связанных отношением наследования, называют иерархией. Это позволя-
ет обращаться с объектами класса-наследника точно так же, как с объек-
тами базового класса.
5

Инкапсуляция – свойство языка программирования, позволяющее


объединить данные и код в объект и скрыть реализацию объекта от поль-
зователя. При этом пользователю предоставляется только интерфейс
объекта, т.е. способ взаимодействия с объектом. Пользователь может
взаимодействовать с объектом только через этот интерфейс.
Полиморфизм – это явление, при котором один и тот же программ-
ный код выполняется по-разному в зависимости от того, объект какого
класса используется при вызове данного кода. Полиморфизм обеспечива-
ется тем, что в классе-потомке изменяют реализацию метода класса-
предка с обязательным сохранением сигнатуры метода1. Это обеспечи-
вает сохранение неизменным интерфейса класса-предка и позволяет
осуществить связывание имени метода в коде с разными классами – из
объекта какого класса осуществляется вызов, из того класса и берётся ме-
тод с данным именем. Такой механизм называется динамическим (или
поздним) связыванием, в отличие от статического (раннего) связывания,
осуществляемого на этапе компиляции.
Абстракция да́ нных – подход к обработке данных по принципу чёр-
ного ящика. Чёрный ящик – термин, используемый в точных науках для
обозначения системы, механизм работы которой очень сложен, неизвес-
тен или неважен в рамках данной задачи. Такие системы обычно имеют
некий “вход” для ввода информации и “выход” для отображения результа-
тов работы. Состояние выходов обычно функционально зависит от со-
стояния входов. Данные обрабатываются функцией высокого уровня с по-
мощью вызова функций низкого уровня. Обычно такой подход использует-
ся в объектно-ориентированном программировании, что позволяет рабо-
тать с объектами, не вдаваясь в особенности их реализации.
При разработке программ на VBA можно использовать методы и
средства как процедурного программирования, так и объектно-
ориентированного программирования. Практически все инструкции, вклю-
чая работу с файлами на внешних носителях информации, и большинство
функций языка VBA имеют аналоги в языках процедурного программиро-
вания таких, например, как Algol, Fortran, Pascal. Поэтому любую програм-
му, написанную на этих языках, можно написать на VBA. Но поскольку VBA
предназначен для программирования в среде MS Office, то доступ про-
граммам на этом языке может быть осуществлён только через приложе-
ния MS Office Excel, Word, Access и других приложений MS Office.
Объектно-ориентированное программирование предоставляет воз-
можность применять при разработке приложений средства для использо-
вания в программе такие объекты как, например, рабочий лист, диапазон
ячеек, пользовательская форма, таблица, диаграмма – в Excel; документ,
шрифт, область в документе, стиль в документе, таблица – в Word.

1
Сигнатура метода – это сокращенная форма записи параметров метода и типов
возвращаемого значения.
6

Упорядоченный набор однотипных объектов – экземпляров одного


класса называется семейством. Семейство тоже является объектом. Од-
ним из методов этого объекта является процедура, возвращающая ссылку
на конкретный объект в семействе, а одним из свойств семейства – число
объектов, хранящихся в нем. Например, совокупность листов в приложе-
нии Excel образует семейство Worksheets.
Объекты и семейства сгруппированы в виде иерархических структур,
которые называются объектными моделями. В VBA определены специ-
альные объектные модели для каждого приложения семейства Microsoft
Office и объектные модели, общие для всех приложений Microsoft Office.
Объектные модели VBA можно изучать, используя справочную систему и
окно просмотра объектов. Окно просмотра объектов представляет собой
специальное средство редактора Visual Basic, позволяющее просматри-
вать содержимое библиотек объектов и производить поиск справочной
информации. Каждое из приложений Microsoft Office предоставляет свои
объектные модели в виде одноименной библиотеки объектов.
Принцип разработки документов с использованием VBA одинаков
для всех приложений Microsoft Office. Наиболее развитой и чаще всего ис-
пользуемой является объектная модель Excel. Поэтому в дальнейшем ме-
тодика разработки приложений в VBA будет производиться на примере
Excel. Освоив применение VBA для Excel, не трудно сделать это и для
других приложений Microsoft Office. Для этого необходимо изучить объект-
ную модель соответствующего приложения.
С помощью VBA в Excel можно выполнять такие действия как, на-
пример:
− автоматизировать решение повторяющихся задач;
− настроить интерфейс Excel с помощью изменения существующих
или создания новых панелей инструментов, меню и пользователь-
ских форм;
− добавить новые функции в Excel;
− создавать сложные отчеты;
− манипулировать данными и осуществлять анализ данных.
При применении процедурных языков программирования большая
часть средств разработки приложений реализуется средствами работы с
файлами: поиск, открытие, сохранение, печать и т.п., – а также возможно-
стями работы с фрагментами файлов: вырезание, вставка, копирование. В
Excel для создания кода программ все основные средства его разработки
уже имеются в приложении: средства манипулирования файлами, редак-
тирования данных и форматирования, и их можно использовать. VBA
обеспечивает также доступ к библиотеке функций Excel, позволяет ис-
пользовать такие средства, как Microsoft SQL Server, включая OLAP
Services, или средства создания отчетов и форм Microsoft Access.
7
2. Основные понятия
Программный код в VBA состоит из инструкций. Инструкция или
оператор (англ. statement – утверждение; сообщение) – наименьшая ав-
тономная часть языка программирования; команда. Инструкции хранятся в
процедурах, которые подразделяются на процедуры типа Sub и процеду-
ры типа Function. Процедуру типа Sub в Excel называют также макросом.
Процедура отличается от функции тем, что функция возвращает вызвав-
шей ее программе единственное значение, которое там будет использова-
но. Инструкции состоят из ключевых слов, констант и операторов.
Процедуры хранятся в модулях, причём в одном модуле может хра-
ниться одна или несколько процедур. Модуль можно определить как сово-
купность объявлений переменных и процедур, хранящихся как единое це-
лое. Совокупность модулей, предназначенных для решения одной задачи,
образует проект. Различают два основных типа модулей: стандартные
модули и модули классов.
Стандартный модуль – это элемент проекта, который содержит про-
граммный код, непосредственно используемый остальными элементами
проекта (глобальные функции, переменные, константы и т. д.). В окне
структуры проекта стандартные модули группируются в папку Modules.
Обычно в стандартном модуле записываются программы, которые не при-
вязаны к конкретным объектам, таким как рабочий лист и рабочая книга.
Модуль класса – это модуль, в котором записывается программный
код, реализующий работу созданных программистом классов. В окне
структуры проекта такие модули группируются в папку Class Modules.
В большинстве случаев используются стандартные модули, назы-
ваемые обычно просто модулями.
Формат процедуры имеет вид1:
[Public] [Private] [Static] Sub|Function <ИмяПроцедуры> ([Параметры])
[‘Комментарии]
<Инструкции>
End Sub|Function
По умолчанию все процедуры VBA определяются как Public (откры-
тые), т.е. их можно вызвать из любой части программы: из того же или
другого модуля, из другого проекта. Объявить процедуру как Public можно
так:
Public Sub План()
или Sub План ()
т.к. процедура определяется как Public по умолчанию.
Если модуль объявлен как Private, например,
Private Sub Доход ()

1
Элемент, заключённый в квадратные скобки, не обязателен, а угловые скобки озна-
чают понятие.
8

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


на уровне модуля, доступны только внутри проекта, содержащего этот мо-
дуль, но недоступны для других приложений или проектов. Процедура,
объявленная как Private, позволяет ограничить взаимную видимость за-
груженных нескольких проектов, т.е. взаимные ссылки между загруженны-
ми проектами VBA запрещены.
В процедуре, объявленной как Static, например,
Private Static Sub Доход ()
все переменные в ней автоматически станут статическими и будут сохра-
нять свои значения после завершения работы процедуры.
Комментарий – любой текст, начинающийся с символа “одиночная
кавычка ' ”. Его можно вводить в начале строки программного кода или за
последним символом инструкции. Пустые комментарии, содержащие толь-
ко символ “кавычка”, применяются для наглядного разделения процедуры
на части.
Ввод программного кода можно производить с клавиатуры или ис-
пользовать функцию записи макросов. В последнем случае в каждом но-
вом сеансе работы с Excel автоматически создаётся новый модуль, иден-
тифицируемый очередным порядковым номером – Модуль1, Модуль2 и
т.д., если программист не назначил для записи процедуры существующий
модуль. Обычно в одном модуле записывают логически связанные между
собой процедуры, хотя каждую процедуру можно хранить в отдельном
модуле.
2.1. Алфавит и словарь языка
Программа на языке VBA формируется из предложений, состоящих
из лексем и разделителей, которые формируются из конечного набора ли-
тер, образующих алфавит языка VBA.
Лексема – это единица текста программы, которую распознаёт ком-
пилятор и которая не может быть разбита в дальнейшем. В Visual Basic
различают шесть классов лексем: идентификаторы; ключевые (зарезер-
вированные) слова; константы; строки; операции (знаки операций); разде-
лители.
В алфавит VBA входят:
− буквы латинского алфавита прописные: A, B, C, D, E, F, … X, Y , Z
и строчные: a, b, c, d, e, … x, y, z;
− буквы кириллицы прописные: А, Б, В, Г, В, Е … Э, Ю, Я
и строчные и строчные: а, б, в, г, д., е … э, ю, я;
− цифры от 0 до 9;
− символ подчеркивания “_”.
Данные символы используются для построения идентификаторов:
имен переменных, констант, процедур, функций, меток переходов и имен
типов. Использование строчных букв эквивалентно построению соответ-
ствующих конструкций из прописных букв и используются для стилистиче-
ского оформления программы.
9

Кроме этих символов, в состав алфавита также входят:


− неизображаемые символы, используемые для отделения лексем
друг от друга (пробел, табуляция, переход на новую строку). Лек-
семы включают в себя зарезервированные слова, идентификато-
ры (стандартные и пользовательские), специальные символы и
метки;
− специальные символы, участвующие в построении конструкций
языка (табл. 1).
Специальные символы Таблица 1
+ плюс < меньше [ ] квадратные скобки
– минус _ подчёркивание ( ) круглые скобки
* звёздочка . точка ^ тильда
/ дробная черта , запятая ‘ апостроф
= равно : двоеточие $ знак доллара
> больше ; точка с запятой <> Не равно
<= меньше или равно >= больше или равно

Из этих символов образуются слова языка VBA. Слова в программах


отделяются друг от друга разделителями и специальными символами.
Разделителями являются:
− пробел;
− символ продолжения строки ( _ );
− символ табуляции.
Специальные символы: +, – ,* , / , ’, . , =, <, >, : - используются для
обозначения операторов и других языковых конструкций. Все слова языка
VBA можно разделить на четыре группы:
− имена (идентификаторы);
− ключевые (зарезервированные) слова;
− числа;
− строки.
Имя (идентификатор) – произвольная последовательность букв ла-
тинского и русского алфавита и цифр, не превышающая 255 символов, ко-
торая обязательно должна начинаться с буквы на любом регистре букв
(верхнем или нижнем). Идентификатор может включать также символы
подчеркивания. В качестве идентификаторов нельзя использовать ключе-
вые слова языка и имена стандартных объектов. Имя не может содержать
точек, пробелов и следующих символов: %, .&,!, #, @, $. Рекомендуется
идентификаторы, состоящие больше чем из одного слова, разделять сим-
волом подчёркивания или писать слитно, начиная каждое слово с пропис-
ной буквы, а остальную часть слова писать прописными. Имена должны
быть уникальны внутри области, в которой они определены, и по возмож-
ности обозначать смысл идентификатора. Идентификаторы используются
для обозначения переменных программного кода VBA. Примеры иденти-
фикаторов: Цена_товара, ЦенаТовара, Numero, Contador и т.д.
10

Идентификаторы применяются также для обозначения объектов, ме-


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

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


ER ER

мер, As, Dim, For, Integer и т.п., VBA выделяет синим цветом и первую
букву делает прописной.
Текст программы на языке VBA состоит из последовательности
предложений, каждое из которых представляет собой комбинацию ключе-
вых слов и идентификаторов.
Строка – произвольная последовательность символов алфавита,
заключенная в двойные кавычки (“”). Если строка включает символ кавыч-
ки, перед ним ставится еще один такой же символ, чтобы отличить его от
символа конца строки, например “ОАО ““Океан””.
Число используется для представления дробных и целых чисел. Це-
лое число записывается в виде последовательности цифр. Для записи де-
сятичных чисел в качестве разделителя десятичных знаков используется
точка “.”. Для записи чисел можно использовать экспоненциальную форму.
Строка – произвольная последовательность символов алфавита,
заключенная в двойные кавычки (“”). Если строка включает символ кавыч-
ки, перед ним ставится еще один такой же символ, чтобы отличить его от
символа конца строки, например “ОАО ““Океан””.
2.2. Переменные
Переменные предназначены для хранения данных в оперативной
памяти. В программе перед использованием переменные нужно объяв-
лять. При объявлении переменной надо задаётся её имя и тип. Тип ука-
зывает способ представления переменной. В переменных можно хранить
11

практически любые типы данных: числа, строк текста, экземпляры объ-


ектов, элементы управления и т.д. В VBA различают две группы типов
данных: основные, называемые иногда базовыми или встроенными, и ти-
пы данных, определяемые пользователем.
Базовые типы переменных Visual Basic
Тип Хранимая Занимае- Интервалы значений
информация мая
память
Целочисленные типы
Byte Целые числа 1 байт от 0 до 255
Boolean Логические зна- 2 байта True (Истина) или False
чения (ложно)
Integer Целые числа 2 байта от -32768 до 32767
Long Integer Длинные целые 4 байта +/-2.1E9
числа
Типы с плавающей точкой
Single Вещественные 4 байта от -3.402823Е38 до -
числа одинарной 1.401298Е-45 для отрица-
точности с пла- тельных чисел и от
вающей точкой 1.401298Е-45 до
3.402823Е38 для положи-
тельных
Double Вещественные 8 байт от -1.7976313486232Е308
числа двойной до -4.94065645841247Е-
точности с пла- 324 для отрицательных
вающей точкой чисел и от
4.94065645841247Е-324 до
1.7976313486232Е308 для
положительных
Строковые типы
String (стро- Текстовая 1 байт на От 1 до 65400
ка фиксиро- информация каждый
ванной дли- (строка) символ
ны)
String (стро- Текстовая 10 байт + 1 От 0 до двух миллиардов
ка перемен- информация байт на символов
ной длины (строка) каждый
длины) символ

Объектные типы
Object Рисунок или 4 байта Ссылка на объект
ссылка на любой
другой объект
Типы Variant
12

Variant Значения любого 16 байт Любое числовое или стро-


из перечислен- для чисел, ковое значение
ных типов данных
22 байта +
1 байт на
каждый
символ для
строк
Прочие типы
Currency Числа, имеющие 8 байт от
до 15 цифр до
десятичной точки -922337203685477.5808
и 4 цифры после
нее (денежные до 922337203685477.5808
единицы)
Date Информация о 8 байт от 1 января 100 г. до
дате и времени
31-го декабря 9999 г.
Decimal Десятичное чис- 14 байт Целое – 29 знаков
ло
Вещественное – 27 знаков
после запятой

Объявление переменных может быть явным или неявным.


Явное объявление
Для явного определения переменных существуют разные способы. Как
правило, программисты предпочитают использовать следующий синтак-
сис:
[Static|Public|Private] Dim <ИмяПеременной> [As <тип>]
[,<ИмяПеременной>[As <тип>]]…
Здесь:
− Dim – ключевое слово, которое означает, что объявляется пере-
менная и резервируется область памяти для ее хранения;
− ИмяПеременной – имя переменной (идентификатор);
− As (Как) – ключевое слово, которое определяет тип данных для
переменной;
− Тип – тип данных для объявляемой переменной;
− Private (Частный), Public (Общий) – ключевые слова, определяю-
щие область видимости переменной;
− Static (Статический)- ключевое слово, которое определяет, сохра-
няет ли переменная свое значение при завершении процедуры и
выходе из неё.
Примеры инструкций объявления переменных
Dim Товар As String*15
Dim Цена As Currency
13

Dim Количество As Byte, Вес As Single


При вводе кода программы с клавиатуры среда программирования
оказывает помощь пользователю – после набора ключевого слова As и
пробела раскрывается список, в котором наряду с другими типами объек-
тов указаны базовые типы переменных:

Тип переменной можно установить, щелкнув дважды по имени типа в этом


списке.
Неявное объявление
В этом способе определения переменных никакие инструкции для объяв-
ления переменной вообще не используются. Когда транслятор VBA пер-
вый раз встречает в коде программы необъявленную переменную, то он
назначает ей тип Variant, и переменная может принимать значение любого
типа. Следовательно, в программе VBA, в принципе, можно вообще не ис-
пользовать инструкцию Dim. Тем не менее использование типа Variant ре-
комендуется использовать только в следующих случаях:
− для ускорения процесса отладки программы;
− пользователь не уверен, какой тип данных обрабатывается инст-
рукцией в конкретной ситуации.
Явное объявление переменных позволяет:
− увеличить скорость решения задачи;
− оптимизировать распределение памяти для переменных;
− документировать переменные и избежать ошибок при использова-
нии одной переменной в принципиально различных ситуациях.
Для того чтобы избежать неприятностей в случае ошибочной запи-
си имени переменной, необходимо в общей области программного модуля
помещать оператор Option Explicit. В этом случае Visual Basic будет рас-
ценивать любую неявно объявленную переменную как ошибочную.
2.3. Константы
Константа по определению является постоянной величиной и по-
этому не меняет своего значения при выполнении программы. Константы в
VBA подразделяются на константы, определяемые пользователем, и
встроенные константы. Встроенная константа должна объявляться; при
этом используется оператор Const, аналогичный оператору Dim:
Const <ИмяКонстанты> [As <ТипДанных>] = <Выражение>
14

где <Выражение> – это любое значение или формула, возвращающая


значение, которое должно использоваться в качестве константы.
Пример
Const ПИ As Single = 3,14
Встроенные константы используются обычно при работе с объ-
ектами приложения. Эти константы не требуют предварительного объяв-
ления. Имена встроенных констант начинаются с префикса, который ука-
зывает, к объекту какого приложения Microsoft Office они относятся. На-
пример, встроенные константы объектов Excel имеют префикс xl, встроен-
ные константы языка VBA имеют префикс vb и т.д. Например, встроенные
константы vbYes и vbNo используются в функции MsgBox, предназначен-
ной для вывода данных на экран.
Операторы объявления переменных и констант можно размещать в
любом месте программного кода, но обязательно до первого оператора,
в котором переменная или пользовательская константа применяется. Хо-
роший стиль программирования предполагает, что объявление перемен-
ных и констант осуществляется в начале процедуры.

2.4. Строковые переменные


Различают строки переменной и фиксированной длины. Строки пе-
ременной длины могут содержать до двух миллиардов символов; их раз-
мер заранее не определяется. Когда такой переменной присваивается
значение, то размер переменной изменяется так, чтобы он соответствовал
длине присвоенного строкового значения.
Строка фиксированной длины – это строка постоянного размера,
указанного при объявлении переменной. Если такой строке присваивается
значение более длинное, то лишние символы отбрасываются. Если значе-
ние, которое присваивается, короче, то остающееся место заполняется
пробелами. Строковые переменные фиксированной длины должны объяв-
ляться явно.
Синтаксис объявления строковой переменной следующий:
Dim VarName As String [* ДлинаСтроки]
где ДлинаСтроки – целочисленная переменная или константа, содержа-
щая число, которое указывает длину строковой переменной.
Например:
Dim strMyName As String* 20
Объявляется строковая переменная фиксированной длины в 20 символов
Dim intLen As Integer
Intlen = 10
Dim MyName As String * Intlen
Объявляется строковая переменная длиной в 10 символов.
15
2.5. Массивы
представляет собой структуру, все элементы которой имеют одинако-
вый тип. Массивы могут быть одномерными и многомерными. Так, для
отображения отдельного столбца или отдельной строки таблицы, содер-
жащей данные одинакового типа, может быть использован одномерный
массив, для отображения таблицы – двумерный, а для отображения сово-
купности таблиц – трёхмерный массив. Количество размерностей массива
может достигать 60.
В VBA массив объявляется следующим образом:
[Public | Private] Dim ИмяМассива([Индексы]) [As ТипДанных]
где
ИмяМассива – идентификатор, определяющий имя массива;
Индекс – значение номера элемента в размерности массива, зада-
ваемого одним из двух способов:
1. указанием номера последнего элемента в каждой размерно-
сти массива;
2. указанием номеров первого и последнего элемента в каждой
размерности массива.
Примечание
Номера элементов (индексы) должны быть указаны целым числом.
При использовании первого метода первому элементу по умолча-
нию присваивается номер “ноль”. Например, объявление одномерного
массива Товар из трёх элементов, каждый из которых состоит не более
чем из 15 символов, по умолчанию выглядит следующим образом:
Dim Товар(2) As String*15
Для обращения к элементам массива необходимо поместить в
круглых скобках за идентификатором массива целочисленное выражение,
например, Товар(0), Товар(К*2) – для одномерного массива и Продажи(I,L),
Продажи(3,4) ) – для двумерного массива; величины I, K, L должны быть
целыми.
В приведённой ниже процедуре ОбъявлениеМассива1
Sub ОбъявлениеМассива1()
Dim Товар(2) As String*15
Товар(0) = "Стул мягкий"
MsgBox Товар(0)
End Sub
− выражения Товар(0), Товар(1), Товар(2) являются элементами
массива;
− инструкция Товар(0) = "Стул мягкий" присваивает первому элемен-
ту массива Товар значение текстовой константы "Стул мягкий";
− функция MsgBox Товар(0) выводит значение этого элемента на эк-
ран:
16

Примечание
Инструкция присваивания и функция MsgBox будут подробно рас-
смотрены ниже.
Для изменения начала нумерации индексов массива можно посту-
пить одним из следующих способов.
1. Использовать инструкцию Option Base 1. При этом инструк-
ция Option Base 1 должна находиться в самом начале модуля
VBA, перед первой процедурой модуля, например,

Option Base 1
Sub ОбъявлениеМассива2()
'
Dim Товар(3) As String * 15
Товар(1) = "Стул мягкий"
MsgBox Товар(1)
'
End Sub
По умолчанию инструкция Option Base имеет значение 0 (ноль).
2. Выполнить явное указание номера первого элемента в каждой
размерности массива, например,

Sub ОбъявлениеМассива3()
'
Dim Товар(1 To 3) As String * 15
Товар(1) = "Стул мягкий"
MsgBox Товар(1)
'
End Sub

При объявлении многомерного массива в поле индекса указывает-


ся несколько индексов, в соответствии с размерностью массива: номер по-
следней строки, номер последнего столбца и номер последней таблицы –
для трёхмерного массива. Например, двумерный массив из пяти строк и
десяти столбцов объявляется без использования инструкции
Option Base 1 одним из следующих способов:
Dim Продажи(4,9) As String
или
Dim Продажи(0 To 4,0 To 9) As String
17

Примечания
1. Наличие инструкции Option Base 1 не влияет на индексацию эле-
ментов массива, если в его объявлении используется конструкция
<нижняя граница> To <верхняя граница>
Массив Продажи можно объявить так:
Dim Продажи(1 To 5, 1 To 10) As String
2. Элементы массива Продажи имеют тип строковая переменная
неопределённой длины.
Выше рассмотрено объявление массивов, связанных с обработкой
только статических данных, т.е. таких, память под которые выделяется во
время компиляции и сохраняется в течение всей работы программы.
В VBA существует другой способ выделения памяти под массивы, ко-
торый называется динамическим, в котором память под массивы отводит-
ся и может быть перераспределена во время выполнения программы. Та-
кие массивы называются динамическими.
Использование динамических величин предоставляет возможность
подключать память динамически, что позволяет:
− увеличить объем обрабатываемых данных;
− если потребность в каких-то данных отпала до окончания про-
граммы, то занятую ими память можно освободить для другой ин-
формации;
− определять динамически изменяющееся количество реально су-
ществующих элементов массива.
Динамический массив объявляется следующим образом:
[Public | Private] Dim ИмяМассива() [As ТипДанных]
т.е. размерность динамического массива в его объявлении не указывает-
ся.
Пример
Dim Товар() As String * 15
Перед использованием динамического массива необходимо переопреде-
лить его размеры. Это выполняется при помощи инструкции ReDim, ис-
пользуемой на уровне процедуры:
ReDim [Preserve] ИмяМассива(Индексы) [As ТипДанных]
Параметр Preserve используется для сохранения данных в сущест-
вующем массиве при изменении размерности. В противном случае все
старые значения элементов массива будут удалены. Однако если новый
размер массива меньше, чем количество помещенных в него элементов,
часть данных будет потеряна.
Примеры
ReDim Товар(1 To 3) As String * 15
ReDim Preserve Товар(1 To 10) As String * 15
18

При использовании параметра Preserve можно изменить размер


только последней размерности, а количество размерностей изменить
нельзя.
Массивы типа Variant можно создавать и заполнять одновременно
при помощи встроенной функции Array(<СписокЗначений>), например:
Dim Товар As Variant
Товар = Array(“Стул”, “Стол”, “Шкаф”)
Освободить память, занимаемую элементами динамического массива,
и повторно инициализировать элементы массива фиксированной дли-
ны можно инструкцией Erase:
Erase СписокМассивов
Здесь СписокМассивов – один массив или список разделенных запя-
тыми массивов. Инициализация элементов массива фиксированной
длины осуществляется следующим образом:
Тип массива Действие инструкции Erase
Фиксированный числовой массив Устанавливает каждый элемент
в нуль
Фиксированный массив строк Устанавливает каждый элемент
(переменной длины) на нулевую длину строки ("")
Фиксированный массив строк Устанавливает каждый элемент
(фиксированной длины) в нуль
Фиксированный массив типа Variant Устанавливает каждый элемент
в Empty
Массив данных определенных Устанавливает каждый элемент, как
пользователем типов будто это отдельная переменная
Массив объектов Устанавливает каждый элемент
в величину Nothing

Если количество элементов в динамическом массиве не известно,


то для его определения используется функция
UBound (ИмяМассива [, Измерение])
Необязательный параметр Измерение имеет тип Variant или Long. Это
целое число, указывающее размерность, для которой определяется
верхняя граница индекса. Для первой размерности используется число
1, для второй – 2 и т.д. если аргумент не указывается, по умолчанию
используется значение 1.
Пример
Dim Товар(1 To 3) As String * 15
L=UBound (Товар)
Переменная L получит значение 3.
Функция UBound обычно используется с функцией LBound для опре-
деления размера массива, позволяющей найти наименьшее значение ин-
декса указанной размерности. Формат функции:
LBound (ИмяМассива [, Измерение])
19

В объектных моделях приложений Office наряду с массивами исполь-


зуются коллекции. Коллекции – это специальные объекты, которые пред-
назначены для хранения наборов одинаковых элементов. Коллекции
обычно удобнее, чем массивы; они изначально безразмерны и в них пре-
дусмотрен стандартный набор свойств и методов.
2.6. Пользовательские типы данных
VBA позволяет создавать структурные, так называемые пользова-
тельские типы данных, аналогичные записям языка Pascal или языков
PL/1 и COBOL. Например, если нужно обрабатывать сведения о результа-
тах экзаменационной сессии, то можно создать пользовательский тип дан-
ных с названием Успеваемость.
Type Успеваемость
ФИО As String * 20
№_Зач_кн As String * 8
Дисциплина As String * 20
Оценка As String * 20
End Type
Примечание1
Пользовательский тип данных определяется вверху модуля, в процедуре
которой он используется, перед началом введения кода процедуры.
Если пользовательский тип данных создан, то для объявления пере-
менной этого типа следует применить инструкцию Dim.
Пример
Sub Пользоват_Тип()
Dim Студенты As Успеваемость
Студенты.ФИО = InputBox("Введите ФИО")
Студенты.№_Зач_кн = InputBox("№_Зач_кн")
Студенты.Дисциплина = InputBox("Дисциплина")
Студенты.Оценка = InputBox("Оценка")
MsgBox Студенты.ФИО & Студенты.№_Зач_кн & _
Студенты.Дисциплина & Студенты.Оценка
End Sub
Примечание2
В инструкции Dim переменную можно объявить с тем же именем, какое
определено в пользовательском типе данных. В этом случае приведённый
выше пример будет иметь вид:
Sub Пользоват_ТИП()
Dim Успеваемость As Успеваемость
Успеваемость.ФИО = InputBox("Введите ФИО")
Успеваемость.№_Зач_кн = InputBox("№_Зач_кн")
Успеваемость.Дисциплина = InputBox("Дисциплина")
Успеваемость.Оценка = InputBox("Оценка")
20

MsgBox Успеваемость.ФИО & Успеваемость.№_Зач_кн & _


Успеваемость.Дисциплина & Успеваемость.Оценка
End Sub
Как правило, пользовательский тип данных определяется для масси-
вов, например, так:
Dim Студенты (1 to 40) As Успеваемость
Все 40 элементов этого массива состоят из четырёх компонентов, как
это указано в пользовательском типе данных Успеваемость. На конкрет-
ный элемент массива, например, первый можно сослаться следующим об-
разом.
Студенты(1).ФИО = InputBox("Введите ФИО")
Студенты(1). №_Зач_кн = InputBox("Введите №_Зач_кн")
Студенты(1). Дисциплина = InputBox ("Введите Дисциплина")
Студенты(1). Оценка= InputBox ("Введите Оценка")
2.7. Операции VBA
В программах на VBA можно использовать стандартный набор опе-
раций над данными. Имеются три основных типа операций:
− математические,
− отношения,
− логические.
Математические операции
Операнд!] + [Операнд2] Сложение
[ Операнд!] -- [Операнд2] Вычитание
- [Операнд] Перемена знака
Операнд!] * [Операнд2] Умножение
[Операнд!] / [Операнд2] Деление
[Операнд1] \ [Операнд2] Целочисленное деление
[Операнд1] Mod [Операнд2] Остаток от деления по модулю
[Операнд1] ^ [Операнд2] Возведение в степень
Операции отношения
[Операнд1] < [Операнд2] Меньше
[Операнд1] > [Операнд2] Больше
[Операнд1] <= [Операнд2] Меньше или равно
[Операнд1] >= [Операнд2] Больше или равно
[Операнд1] <> [Операнд2] Не равно
[Операнд1] = [Операнд2] Равно
[Операнд1] Is [Операнд2] Сравнение двух операндов, содер-
жащих ссылки на объекты
[Операнд1] Like [Операнд2] Сравнение двух строковых выраже-
ний
21

Логические операции
[Операнд1] And [Операнд2] Логическое умножение
[Операнд1] Or [Операнд2] Логическое сложение
[Операнд1] Хог [Операнд2] Исключающее or (или)
[Операнд1] Not [Операнд2] Логическое отрицание
Строковые операции
[Строка1] & [Строка2] Сложение (объединение) строк
Приоритеты операций
Приоритет Операция
1 Вызов функции и скобки
2 ^
3 – (смена знака)
4 *, /
5 \
6 Mod
7 +, –
8 >, <, >=, <=, =
9 Not
10 And
11 Or
12 Xor

2.8. Объектная модель Excel


Как отмечено во введении, при разработке приложений в VBA можно
использовать средства процедурного программирования и объектно-
ориентированного программирования. Программирование в Excel строит-
ся на языке VBA и объектной модели Excel. Приложение Excel состоит из
объектов, функциональные возможности которых можно использовать в
программах, написанных на языке VBA. Совокупность объектов Excel на-
зывается объектной моделью Excel.
2.8.1. Свойства и методы объектов
При работе с объектами используются такие термины, как свойства
и методы объектов. Объект инкапсулирует (объединяет в себе) его свой-
ства и методы, которые доступны из программы, составленной на VBA.
Использование объекта сводится к использованию его свойств и методов.
Свойство – это совокупность характеристик и атрибутов, описываю-
щих объект. С помощью свойств можно задать ,например, цвет, значение,
шрифт или формат диапазона ячеек. Одни свойства доступны только для
чтения, а другие доступны как для чтения, так и для записи (изменения).
Метод представляет собой действия, выполняемые объектом. На-
пример, метод Clear (Очистить) объекта Range (Диапазон) удаляет содер-
жимое ячеек диапазона. Методы могут принимать значения параметров,
уточняющие характер действия, которое необходимо выполнить.
22
2.8.2. Отображение объектной модели Excel
Для освоения способов управления Excel с помощью VBA необходи-
мо ознакомиться с объектной моделью Excel. Объектная модель описы-
вает объекты приложения и связи между ними. В объектной модели Excel
представлено более 100 объектов. В большинстве случаев используются
не более 20 объектов. Для отображения всех объектов Excel нужно вы-
полнить следующие действия.
1. Открыть новую рабочую книгу.
2. Нажать комбинацию клавиш <Alt+F11>, чтобы открыть редактор
Visual Basic.
3. На вкладке Введите вопрос ответов ввести текст: Microsoft Excel
Objects.
4. Нажать клавишу <Enter> и в списке тем щелкнуть на теме Microsoft
Excel Object. Отобразится диаграмма объектной модели (рис. 1).
5. Щелкнуть на стрелке, направленной влево, над строкой Microsoft
Excel Objects (стрелка окрасится в голубой цвет). Отобразятся объ-
екты уровня рабочего листа (рис. 2).

Рис. 1. Объектная модель Excel


23

Рис. 2. Объектная модель Worksheet (Рабочий лист)

Вершиной иерархии объектной модели Excel является объект


Application (Приложение). На следующем уровне иерархии объектной мо-
дели находится объект WorkBook (Рабочая книга), который совпадает с
файлом рабочей книги Excel. Объект WorkBook содержит объекты более
низкого уровня, в частности объект Worksheet (Рабочий лист). Объект
Worksheet, в свою очередь, состоит из других объектов (рис. 2).
Среди более 100 объектов Excel в программировании на VBA боль-
шей частью используются следующие:
24

− Application (Приложение)
− WorkBook (Рабочая книга)
− Worksheet (Рабочий лист)
− Range (Диапазон)
− Chart (Диаграмма)
Объект Application представляет саму программу Excel.
Объект WorkBook представляет рабочую книгу Excel, т.е. файл Excel.
Объект Worksheet (Рабочий лист) – отдельная страница в рабочей
книге, имеющая индивидуальное имя и предназначенная для хранения
данных и выполнения вычислений.
Рабочий лист в свою очередь состоит из ячеек. Ячейки представляет
объект Range, который может состоять из одной или нескольких ячеек.
Одним из часто используемых объектов является объект Chart (Диа-
грамма). Все, действия, которые можно выполнить с диаграммами в Excel,
можно запрограммировать в VBA.
2.8.2.1. Иерархия объектной модели
На вершине объектная модель Excel находится объект Application.
Под этим объектом расположены другие объекты, среди которых находит-
ся WorkBook. В терминологии объектно-ориентированного программиро-
вания такое подчинение одного объекта другому называется вложением,
т.е. объект WorkBook вложен в объект Application, а объект Worksheet –
в объект WorkBook.
2.8.2.2. Ссылка на объекты в коде VBA
Концепция вложения объектов широко используется при создании
ссылок на объекты в коде VBA. Для полного определения объекта необхо-
димо указать последовательно все уровни иерархии объектной модели.
Например, чтобы сослаться на ячейку А1 на рабочем листе Лист1 рабочей
книги Книга1, надо применить следующий код:
Application.Workbooks("Книга1").Worksheets("Лист1").Range("A1")
Если в программе нет ссылки на другое активное приложение, то
объект Application можно не указывать, и предыдущая ссылка может быть
представлена так:
Workbooks("Книга1").Worksheets("Лист1").Range("A1")
Если активной является Книга1, то объект Книга1 можно не указы-
вать, и предыдущая ссылка может быть представлена так:
Worksheets("Лист1").Range("A1")
Аналогично, если активным листом является Лист1, то ссылка может
быть записана так:
Range("A1")
25

Указание иерархии объектов VBA аналогично указанию иерархии


папок в файловой системе Windows при назначении пути для доступа к
файлу.
2.8.3. Работа с объектами
Работа с любым объектом заключается в следующем:
− задание свойств объекта;
− получение значений свойств объекта;
− выполнение методов объекта.
2.8.3.1. Задание свойств объекта
Задание значения свойству объекта имеет следующий формат:
Объект.ИмяСвойства = Значение
Объект обозначает имя объекта, а ИмяСвойства – соответственно имя
свойства, которому присваивается значение. Имя объекта отделяется от
имени свойства точкой. Например, чтобы определить свойство Value (Зна-
чение) объекта Range , т.е. поместить в ячейку A1 значение 10, а в ячейку
B1 значение Товар, применяются следующие инструкции:

Range("A1").Value = 10
Range("B1").Value = “Товар”

Чтобы получить значение свойства объекта, используется формат:


ИмяПеременной = Объект.ИмяСвойства
Такой код применяется для присвоения переменной значения свойства
объекта или свойству другого объекта. Если надо присвоить переменной
значение свойства Value объекта Range, т.е. переменная принимает зна-
чение из ячейки рабочего листа, используются следующие инструкции:

Dim SngValue As Single


SngValue = Range("A1").Value

Для вывода на экран значения, содержащегося в ячейке B1, можно ис-


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

MsgBox "Ячейка B1 содержит значение " & Range("B1").Value или


MsgBox "Ячейка B1 содержит значение " & SngValue
2.8.3.2. Использование методов объекта
Для выполнения метода объекта применяется один из следующих
форматов:
ИмяОбъекта.ИмяМетода
ИмяОбъекта.ИмяМетода Аргумент1, Аргумент2, …, АргументN
ИмяОбъекта.ИмяМетода (Аргумент1, Аргумент2, …, АргументN)
26

Это означает, что:


− метод может не иметь Аргументов или все они не обязательные;
− метод может иметь несколько Аргументов, не заключаемых в круг-
лые скобки;
− метод иметь несколько Аргументов, заключаемых в круглые скоб-
ки.
Кроме того, аргументы могут быть неименованными и именованными, обя-
зательными и необязательными. Значения неименованных аргументов
должны быть перечислены в заданном порядке, определяемом форматом
метода, отделяя каждый аргумент запятой и включая запятые на месте
пропущенного необязательного аргумента. Именованные аргументы име-
ют формат
НаименованиеАргумента := ЗначениеАргумента
Примеры
В этом примере удаляются формулы и форматирование ячеек A1:G37 на
листе Лист1.
Worksheets("Лист1").Range("A1:G37").Clear
В следующем примере очищается область диаграммы Диаграмма1 (объ-
ект ChartArea; удаляются данные и форматирование диаграммы).
Charts("Диаграмма1").ChartArea.Clear
Например, для выполнения метода Open (Открыть) рабочей книги Приме-
ры запишите код
Workbooks("Примеры").Open
Некоторые методы имеют аргументы, обязательные или необязательные.
В следующем примере метод SaveAs (Сохранить), применяемый для со-
хранения текущей рабочей книги, в качестве аргумента использует имя
файла, в котором будет сохранена рабочая книга.
ThisWorkbook.SaveAs Filename:= "Текущий бюджет"
Этот же способ используется в тех редких случаях, когда значения
параметров передаются свойству. Порядок следования значений должен
строго соответствовать порядку, в котором были объявлены сами пара-
метры.
Второй способ передачи значений параметров при вызове метода
отличается от первого лишь отсутствием круглых скобок:
ИмяОбъекта.ИмяМетода аргумент!, аргумент2, ...
Требования к порядку следования значений такие же, как и для пер-
вого способа.
27
2.8.3.3. Переменные-объекты
Переменными-объектами называются переменные, имеющие тип
Object. Переменные-объекты объявляются точно так же, как переменные
других типов, т.е. с помощью оператора Dim, используя при этом общий
тип данных Object, или с помощью оператора Set, назначив переменным-
объектам тип конкретного объекта. Ниже приведены несколько примеров
объявления переменных-объектов.
Dim Таблица1 As Object
Dim Продажи As Worksheet
Dim Книга1 As Workbook
Dim Курс As Range
Set Лист1 = Workbooks("Финансы").Worksheets("Бюджет")
Set Лист2 = Workbooks("Финансы ").Worksheets("Бюджет")
Set Книга1 = Workbooks("Финансы")
Set Таблица1 = Workbooks("Бюджет").Worksheets(1).Range("A1:A12")
После назначения переменным-объектам конкретных объектов име-
на переменных-объектов можно использовать в кодах процедур вместо
имен самих объектов. Пример такого использования показан в листинге
процедуры Объекты .
Sub Объектs()
Dim РабОбл As Range
Set РабОбл = Workbooks("Финансы ").Worksheets("Лист1").Range("A2:D2")
РабОбл.Font.Bold = True
РабОбл.Font.Italic = True
РабОбл.Font.Name = "Courier"
End Sub
В этой процедуре имя переменной РабОбл применяется вместо
ссылки на диапазон A2:D2, который находится на рабочем листе Лист1
рабочей книги Финансы. Такая замена упрощает написание длинного пол-
ного имени объекта. В результате выполнения этой процедуры шрифт в
ячейках рабочего листа Лист1 будет отформатирован как жирный(Bold)
курсив(Italic) тип Courier. Например, слово “шрифт” будет иметь вид
“шрифт”.

2.8.3.4. Коллекции
Коллекцией называется группа подобных объектов. Рассмотрим сле-
дующее полное имя объекта:

Workbooks("Финансы ").Worksheets("Лист1").Range("A2:D2")
28

Здесь Workbooks и Worksheets – это коллекции, Книra1 – это элемент


коллекции Workbooks. Объект Range не является коллекцией. Одно из оп-
ределяющих свойств коллекции – возможность добавлять в нее новые
элементы. В объект Range нельзя добавить другие диапазоны ячеек, так
как в Excel диапазоны жестко определены и ограничены еще во время их
задания.
На рис. 1 внизу окна объектной модели Excel приведены обозначе-
ния цветовых выделений объектной модели. Желтым цветом выделены
объекты и коллекции, голубым – объекты, не являющиеся коллекциями.
2.8.3.5. Метод Add
В коллекции можно добавлять новые элементы. Для этого использу-
ется метод Add (Добавить). Например, новую рабочую книгу можно соз-
дать с помощью следующего кода:
Workbooks.Add
Этот код эквивалентен выполнению в Excel команды Файл | Создать. Что-
бы добавить новый лист в рабочую книгу, используется код
Worksheets.Add
2.8.3.6. Свойство Count
Свойство коллекции Count (Счет) хранит количество элементов, со-
ставляющих коллекцию. Для определения количества листов в текущей
рабочей книге можно использовать следующие инструкции:
Dim КолРабЛист As Integer
КолРабЛист = Worksheets.Count
Можно найти много применений свойству Count. Предположим, вы
создаете приложение, где рабочая книга должна содержать отдельный
лист на каждый рабочий день недели. С помощью свойства Count можно
проверить, сколько содержит рабочая книга рабочих листов. Код процеду-
ры представлен ниже.
Sub КолРабЛист ()
Dim КолРЛ As Byte
Dim Сообщ As String
КолРЛ = Worksheets.Count
Сообщ = "Книга содержит " & КолРЛ
Сообщ = Сообщ & " листов "
MsgBox Сообщ
End Sub
2.8.4. Свойства и методы основных объектов Excel

2.8.4.1. Объект Application


Объект Application (Приложение) занимает самый верхний уровень
иерархии объектов Excel и управляет установками и параметрами уровня
29

приложения, т.е. такими, которые можно найти в диалоговом окне Пара-


метры программы Excel.
Объект Application содержит также встроенные функции Excel, и его
необходимо использовать для применения в процедуре VBA встроенных
функций Excel. В процедуре МодФункции моделируются функции Excel
Average (Среднее) и Sum (Сумма).
Option Base 1
Sub МодФункции()
Dim Число As Variant
Число = Array(10, 20, 30, 40)
Dim СрЗнач As Integer
СрЗнач = Application.Average(Число)
MsgBox "Среднее значение массива = " & СрЗнач
MsgBox "Сумма значений массива = " & Application.Sum(Число)
End Sub
В процедуре МодФункции для подсчёта среднего значения и суммы
используются функции VBA Excel Average и Sum, параметром которых яв-
ляется массив Число, значения которого задаются при помощи функции
VBA Excel Array. Ниже приведены результаты выполнения процедуры
МодФункции.

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


Excel необходимо указывать объект Application и аргументы функций.
Объект Application имеет множество свойств и методов. Из свойств
выделим следующие.
− ActiveWorkbook – возвращает активную (текущую) книгу.
− ActiveSheet – возвращает активный лист в активной рабочей книге.
Возвращаемый лист может быть любого поддерживаемого типа,
включая рабочий лист и лист диаграмм.
− ActiveCell – возвращает активную ячейку на активном листе актив-
ной рабочей книги.
− ThisWorkbook – возвращает рабочую книгу, где находится выпол-
няемая процедура.
− Selection – определяет текущее выделение. Выделением может
быть диапазон ячеек, элементы диаграммы и т.п.
Среди методов объекта Application выделим следующие.
− InputBox – отображает окно ввода и позволяет указать тип возвра-
щаемого значения.
30

− OnKey – устанавливает выполнение указанной процедуры при на-


жатии заданной комбинации клавиш.
− OnTime – назначает выполнение указанной процедуры на опре-
делённое время.
− Quit – применяется для выхода из Excel.
2.8.4.2. Объект Worksheet
Объект Worksheet представляет собой рабочий лист. В Excel рабочий
лист можно выбирать, переименовывать, копировать, удалять, вставлять
новый лист в рабочую книгу. Для выполнения таких же и множества других
действий с объектом Worksheet используются его многочисленные свойст-
ва и методы.
Свойства объекта Worksheet
Из многочисленных свойств объекта Worksheet рассмотрим следующие,
наиболее употребительные.
1. Cells – возвращает ячейку рабочего листа.
Формат свойства:
Worksheets(индекс).Cells(<№ строки>,<№ столбца>),где
индекс – номер или имя рабочего листа,
<№ строки>,<№ столбца> – целочисленные выражения, задающие
значения № строки и № столбца рабочего листа.
Пример
‘Ячейка, находящаяся в строке 2 в столбце 5 (ячейка E5) листа
Лист1, получает значение 10.
i=1
k=5
Worksheets(Лист1).Cells(i*2+1,k).Value=10
2. Name – возвращает имя рабочего листа.
Формат свойства:
ActiveSheet.Name = < имя рабочего листа>
Пример
‘Активный рабочий лист получает имя “Товары”
ActiveSheet.Name =“Товары”
Методы объекта Workbook
При работе с объектом Worksheet часто применяются следующие
методы:
− Activate – активизирует рабочий лист;
− Add – вставляет новый лист в рабочую книгу;
− CheckSpelling – используется для проверки орфографии содержи-
мого рабочего листа;
− Delete – удаляет рабочий лист из рабочей книги.
Пример
31

В приведённом ниже коде объявляется переменная-объект НовыйЛист,


которой затем назначается создаваемый рабочий лист с именем Склад.
Dim НовыйЛист As Worksheet
Set НовыйЛист = Worksheets.Add
НовыйЛист.Name = “Склад”
2.8.4.3. Объект Range
В VBA ячейки рабочего листа трактуются как объект Range. Среди всех
объектов Excel этот объект используется наиболее часто.
В качестве объекта Range могут выступать:
− отдельная ячейка;
− выделенный диапазон ячеек;
− несколько выделенных диапазонов ячеек (т.е. совокупность не-
смежных диапазонов);
− строка и столбец;
− трехмерный диапазон (т.е. состоящий из диапазонов, расположен-
ных на разных рабочих листах).
Свойства объекта Range
Из множества свойств объекта Range, которых у него несколько де-
сятков, рассмотрим следующие, наиболее часто используемые.
− Address (Адрес) – возвращает текущее положение диапазона.
− Count (Счет) – возвращает количество ячеек в диапазоне.
− Formula (Формула) – возвращает формулу, по которой вычисляет-
ся значение, отображаемое в ячейке.
− Offset (Смещение) – возвращает величину смещения одного диа-
пазона относительно другого.
− Resize (Изменение размеров) – позволяет изменять текущее вы-
деление диапазона.
− Value (Значение) – возвращает значения ячеек, составляющих
диапазон.
Пример
На листе Лист1 в ячейке B4 находится число 4 и в ячейке A1 – формула
=B4. В модуле Module1 хранится процедура СвойстваДиапазона:
Sub СвойстваДиапазона()
Worksheets("Лист1").Range("A1:B2").Activate
MsgBox "Количество ячеек в диапазоне " & Range("A1:B2").Count
MsgBox "Текущая ячейка " & ActiveCell.Address
ActiveCell.Offset(2, 2).Activate
MsgBox "Текущая ячейка " & ActiveCell.Address
Range("A1").Formula = "=B4"
MsgBox "Формула в ячейке A1 " & Range("A1").Formula
MsgBox "Значение ячейки A1= " & Range("A1").Value
End Sub
32

Инструкция
Range("A1:B2").Activate
выделяет диапазон A1:B2 рабочего листа Лист1 при помощи метода
Activate (рис. 3).

Рис.3. Выделение диапазона ячеек


Функции
MsgBox "Количество ячеек в диапазоне " & Range("A1:B2").Count
MsgBox "Текущая ячейка " & ActiveCell.Address
выводят при помощи свойств Count и Address количество ячеек в выде-
ленном блоке и адрес текущей ячейки:

Текущая ячейка получила адрес $C&3 в результате выполнения инструк-


ции
ActiveCell.Offset(2, 2).Activate
свойство которой Offset(2,2) задаёт смещение на две ячейки относительно
ячейки A1.
Инструкция
Range("A1").Formula = "=B4"
Помещает формулу =B4 в ячейку A1.
Функции
MsgBox "Формула в ячейке A1 " & Range("A1").Formula
MsgBox "Значение ячейки A1= " & Range("A1").Value
33

выводят на экран соответственно формулу и значение ячейки A1:

Другими словами, свойство Value возвращает то, что отображается в


ячейке, а свойство Formula – то, что находится в ячейке.
Методы объекта Range
Из множества методов объекта Range, которых у него не больше
двадцати, следующие, наиболее часто используемые.
Рассмотрим наиболее часто используемые методы объекта Range.
− Activate – активизирует диапазон.
− Clear, ClearComments, ClearContents, ClearFormats, ClearNotes –
очищает содержимое диапазона, позволяют убрать комментарии,
содержимое ячеек, форматы и примечания.
− Сору – копирует содержимое диапазона в буфер обмена.
− Cut – перемещает содержимое диапазона в буфер обмена.
− Delete – удаляет диапазон.
− Select – выделяет диапазон.
При удалении (метод Delete) ячейки, находящиеся рядом с
уничтоженными, сдвигаются на место уничтоженных: влево, если ис-
пользуется параметр xlShiftToLeft, и вверх, если используется пара-
метр xlShiftUp. При очистке (метод Clear) удаляется содержимое
ячеек, форматы и комментарии, но сами пустые ячейки остаются.
Метод Сору используется для копирования диапазона в Буфер
обмена и при использовании параметра destination – в другой диапа-
зон.
Пример
В приведённом ниже примере диапазон ячеек A1:B1 листа
Лист1 копируется в диапазон ячеек A1:B1 листа Лист2.
Worksheets("Лист1").Select
Worksheets("Лист1").Range("A1:B1").Activate
Worksheets("Лист1").Range("A1:B1").Copy _
destination:=Worksheets("Лист2").Range("A1:B1")
2.8.5. Просмотр объектов
Окно просмотра объектов Object Browser позволяет просматривать
все объекты проекта. Здесь имеются все свойства, методы и события,
связанные с любым объектом. Доступ к этому окну можно получить сле-
дующими способами.
34

− Щелкнуть на кнопке Object Browser стандартной панели инструмен-


тов редактора Visual Basic.
− Выполнить команду View > Object Browser (Вид > Просмотр объек-
тов).
− Нажать клавишу F2.
В окне Object Browser всегда можно найти все свойства и методы
для любого объекта, быстро открыть тему справочной системы, описы-
вающую выбранный объект, свойство или метод. Окно Object Browser
можно использовать как обучающее и справочное средство. Опишем ра-
боту в окне Object Browser.
1. Нажать клавишу F2 для открытия окна Object Browser (рис. 4).
2. Выбрать в Activate Method пункт Activate method as it applies to the
Range object
3. Выбрать в Example пункт As it applies to the Range object (рис. 6)
4. Закрыть окно справочной системы.
5. Закрыть окно Object Browser.

Рис. 4. Окно доступа к объектам, свойствам, методам и событиям


35

Рис. 5. Метод Activate

Рис. 6. Пример метода Activate


2.8.6. Использование справочной системы
Обратиться к справочной системе VBA можно использовать двумя
способами:
− использовать функциональную клавишу F1;
− использовать “Помощника”.
2.8.6.1. Использование функциональной клавиши F1
Этот способ даёт возможность получить справку по всем объектам и
ключевым словам VBA. Особенностью этого способа является то, что не-
обходимо точно указать название сущности, по которой необходимо полу-
36

чить справку: имя объекта, его свойства, метода или события, ключевое
слово инструкции VBA и т.п.
В качестве примера рассмотрим получения сведений о функции
Array.
1. Войти в редактор Visual Basic. Это можно сделать двумя способами:
− щёлкнуть по кнопке Редактор Visual Basic
или
− одновременно нажать на клавиши Alt и F11.
2. Если в окне Project – VBAProject нет ни одного модуля, вставить мо-
дуль в текущую рабочую книгу. Для этого в окне Microsoft Visual Basic
выбрать пункт меню Insert и в выпадающем окне – пункт Module
.
3. В окне кода редактора Visual Basic ввести символ Одиночная кавыч-
ка (‘), а за ней – слово array.
4. Установить текстовый курсор внутри слова 'Array (рис.7).

Рис. 7. Получение справки по функции Array


5. Нажать клавишу F1. Появится справка.
Аналогично можно получить справку по объектам, свойствам, мето-
дам и событиям объекта.
2.8.6.2. Использование помощника
Этот способ даёт возможность получить справку только по объек-
там VBA и их свойствам, методам и событиям. При этом можно в свобод-
ной форме задать вопрос о сущности, по которой необходимо получить
справку. Например, для получения сведений о свойствах объекта
Worksheet нужно выполнить следующие действия.
1. Находясь в окне Microsoft Visual Basic, следует выбрать пункт меню
Help, и в приведённом ниже выпадающем меню
37

выбрать пункт “Справка: Microsoft Visual Basic”, в результате чего поя-


вится “Помощник”, который предложит ввести вопрос к справочной сис-
теме (рис. 8).

Рис. 8. Помощник в окне справочной системы

2. Ввести вопрос What add the new worksheet в окне помощника и в


появившемся диалоговом окне выбирать пункт Worksheets Property
(рис. 9).

Рис. 9. Вод вопроса и выбор пункта ответа

На экран будет выведена справка Worksheets Property по свойству


Add для рабочего листа.

Примеры, приводимые в справочной системе, помогают при разра-


ботке приложений VBA. Их содержание можно копировать непосредствен-
но в разрабатываемый проект.
38
2.9. Ввод и вывод данных
В этом пункте рассматриваются следующие средства ввода и вывода
данных при помощи диалоговых окон:
− использование функции MsgBox;
− использование функции InputBox;
− применение метода InputBox;
− именование аргументов,
− использование объединения текстовых строк.
2.9.1. Функция MsgBox
Функция MsgBox служит для организации диалоговых окон, содер-
жащих какие-либо сообщения. После своего появления на экране окно со-
общения ждет, пока пользователь щелкнет на одной из кнопок, присутст-
вующих в окне. В зависимости от того, на какой кнопке щелкнул пользова-
тель, функция возвращает определенное целое число. Функция MsgBox
имеет следующий формат:
MsgBox (Prompt [, Buttons] [, Title] [, Helpfile, Context])
Аргументы рассматриваемой функции означают следующее.
Prompt (Приглашение) – обязательный аргумент этой функции. Зна-
чением этого аргумента служит строка текста, которая появляется как со-
общение в диалоговом окне. Эта строка текста должна быть заключена в
двойные кавычки. Круглые скобки в синтаксисе MsgBox указывают на то,
что в данном случае MsgBox является функцией, возвращающей какое-
либо значение.
Если скобки опущены, то для VBA это признак того, что данное вы-
ражение значение не возвращает и результатом выполнения инструк-
ции MsgBox является только вывод диалогового окна.
Все остальные аргументы этой функции не обязательны.
Buttons (Кнопки) – числовое выражение, представляющее сумму зна-
чений, которые указывают число и тип отображаемых кнопок, тип исполь-
зуемого значка, основную кнопку и способ, каким используется окно сооб-
щения; аргумент необязателен. Значение по умолчанию этого аргумента
равняется 0; его можно задать в виде констант VBA или целым числом.
Если не указан аргумент Кнопки, то VBA предполагает, что в диалоговом
окне сообщения присутствует только кнопка ОК. Аргумент Кнопки позво-
ляет управлять следующими параметрами окна сообщения:
− количество кнопок в окне;
− типы кнопок и их размещение в окне;
− пиктограмма, отображаемая в окне;
− какая кнопка назначается кнопкой по умолчанию;
− режим окна сообщения.
39

Значения констант, определяющих число и тип кнопок используемого


значка, приведены в таблице 1, 2 и 3.
Таблица 1. Значения аргумента buttons процедуры MsgBox, определяю-
щие отображаемые кнопки в диалоговом окне
Константа Значение Отображаемые кнопки

vbOKOnly 0

VbOKCancel 1

VbAbortRetrylgnore 2

VbYesNoCancel 3

VbYesNo 4

VbRetryCancel 5

Таблица 2. Значения аргумента buttons процедуры MsgBox, определяю-


щие отображаемые информационные значки в диалоговом окне
Константа Значение Значок сообщения
VbCritical 16

VbQuestion 32

VbExclamation 48

VbInformation 64

Таблица 3. Значения аргумента buttons процедуры MsgBox, определяю-


щие основную кнопку в диалоговом окне
Константа Значение Номер основной кнопки
VbDefaultButton1 0 1
VbDefaultButton2 256 2
VbDefaultButton3 512 3
VbDefaultButton4 768 4
40

При написании программ, в которых в зависимости от нажатой кнопки


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

Константа Значение Нажатая кнопка


vbOK 1 OK
vbCancel 2 Отмена (Cancel)
vbAbort 3 Прервать (Abort)
vbRetry 4 Повторить (Retry)
vbIgnore 5 Пропустить (Ignore)
vbYes 6 Да (Yes)
vbNo 7 Нет (No)
Чтобы не ошибиться при вводе значений аргумента кнопки, исполь-
зуйте список констант, который появляется после ввода знака "+". Знак "+"
используется для объединения нескольких констант при задании сложного
аргумента кнопки. Например, использование в процедуре выражения
vbYesNoCancel + vbQuestion + vbDefaultButton1
приведёт к появлению кнопок Да, Нет и Отмена (константа

vbYesNoCancel), значка (константа vbQuestion) и по умолчанию к ис-


пользованию первой кнопки (константа vbDefaultButton1).
Примечание
Чтобы просмотреть список всех внутренних констант VBA, необходи-
мо в окне программного кода VBA щёлкнуть левой кнопкой мыши по имени
любой константы и нажать клавишу F1. В появившемся окне можно найти
все внутренние константы Excel.
Title (Заголовок) – содержит заголовок окна сообщения; аргумент не-
обязательный. Без этого аргумента в заголовке будет выведено имя при-
ложения MS Office, из которого запускается программа на VBA (Excel,
Word и т.д.).
Helpfile (Справка) – строковое выражение, содержащее имя справоч-
ного файла Windows. Обычно это файл, созданный разработчиком прило-
жения с помощью Windows Help Compiler.
Context (Раздел) – численное выражение, указывающее раздел в
справочном файле, относящийся к отображаемому диалоговому окну.
Аргументы Helpfile и Context не обязательны. Они используются или
опускаются вместе.
Аргументы функции необходимо перечислять в том порядке, в каком
они размещены в её формате. Следовательно, в функции MsgBox они
должны располагаться следующим образом:
Prompt [, Buttons] [, Title] [, Helpfile, Context])
41

Если какой-либо аргумент опущен, то необходимо включать в список аргу-


ментов отмечающие запятые для следующего в списке аргумента.
Пример
В приведённой ниже процедуре ФункцияMsgBox() функция MsgBox
используется для:
− определения, какая из кнопок: Да, Нет или Отмена – нажата
(щёлкнута) в диалоговом окне этой функции;
− вывода на экран сообщения, какая кнопка была нажата и наимено-
вание примера использования этой функции.
Внутренняя константа vbExclamation используется в процедуре для выво-

да в окне сообщения символа . Определение значения нажатой кнопки


осуществляется при помощи инструкции If…Then…Else, синтаксис которой
будет подробно рассмотрен в дальнейшем.

Sub ФункцияMsgBox()
Dim Структура As String
Dim Кнопка As Integer
'
' В переменной Структура задается структура диалогового окна
Структура = vbYesNoCancel + vbQuestion + vbDefaultButton1
' В переменную Кнопка вводится целое число, возвращаемое MsgBox
'при нажатии кнопки Да, Нет или Отмена в окне сообщения функции
MsgBox
'
Кнопка = MsgBox("Выбрать Да, Нет или Отмена?", Структура, "Примеры
функции MsgBox")
'
' На экране отображается соответствующее сообщение '
' в зависимости от значения переменной Кнопка

MsgBox "Равно " & Кнопка, , "Возвращаемое значение"
If Кнопка = vbYes Then MsgBox "Выбрано Да", vbExclamation, "ПРИМЕР 1"
If Кнопка = vbNo Then MsgBox "Выбрано Нет", vbExclamation, "ПРИМЕР 2"
If Кнопка = vbCancel Then MsgBox "Выбрано Отмена",
vbExclamation,"ПРИМЕР 3"
End Sub
Ниже приведены диалоговые окна, выведенные на экран в процессе
выполнения процедуры ФункцияMsgBox(). Окна ПРИМЕР 1, ПРИМЕР 2 и
ПРИМЕР 3 появляются при нажатии кнопок, соответственно, Да, Нет и
Отмена. В окне Возвращаемое значение выводится число 6 при выполне-
нии инструкции MsgBox "Равно " & Кнопка, , "Возвращаемое значение", ес-
ли нажата кнопка Да.
42

2.9.2. Функция InputBox


Функцию MsgBox целесообразно использовать в случае, если от
пользователя надо получить типа Да–Нет или ОК–Отмена. Если необхо-
димо ввести число или текст, то применяется функция InputBox. Эта функ-
ция отображает запрос в диалоговом окне ввода, ожидает ввода пользо-
вателем строки (или щелчка по кнопке окна) и возвращает строку из поля
ввода окна. Функция InputBox имеет следующий формат:
InputBox(Prompt[, Title] [, Default] [, Xpos] [, Ypos] [, Helpfile, Context])
Эта функция требует обязательного задания только аргумента
Prompt. Так же, как и в функции MsgBox, значением аргумента Prompt слу-
жит текстовая строка, которая отображается в диалоговом окне ввода в
качестве сообщения. Строковое значение prompt может содержать не-
сколько строк. Для разделения строк допускается использование символа
возврата каретки (Сhr(13)), символа перевода строки (Chr (10)) или комби-
нацию этих символов (Chr( 13) & Chr (10)).
Аргумент title используется для задания текста, который помещается
в строке заголовка окна ввода. Если этот аргумент не задан, то в строке
заголовка отображается слово Ввод.
Аргумент default задает значение, которое отображается по умолча-
нию в поле ввода, пока пользователь не введет свое значение. Если этот
аргумент опустить, то отображается пустое поле ввода.
Необязательные аргументы xpos и ypos задают положение окна вво-
да на экране.
xpos – числовое выражение, задающее расстояние по горизонтали
между левой границей диалогового окна и левым краем экрана. Если этот
аргумент опущен, диалоговое окно выравнивается по центру экрана по го-
ризонтали.
ypos – числовое выражение, задающее расстояние по вертикали ме-
жду верхней границей диалогового окна и верхним краем экрана. Если
43

этот аргумент опущен, диалоговое окно помещается по вертикали пример-


но на одну треть высоты экрана.
Аргументы helpfile и context используются в том случае, если в при-
ложении создаётся собственная система справки.
Возвращаемым значением функции InputBox является значение,
введенное пользователем в поле ввода.
Пример
Sub ФункцияInputBox()
Dim Данное As Variant
Данное = InputBox("Введите данное")
MsgBox "Введённое данное равно " & Данное
ActiveCell.Value = Данное
End Sub
Тип возвращаемого значения определен как Variant, т.е. тип опреде-
ляется введенным значением.
2.9.3. Метод InputBox
В Excel имеется еще один способ ввода данных пользователем в ин-
терактивном режиме, который имеет называние метод InputBox. Формат
метода:
Application.InputBox(Prompt,Title,Default,Left,Top,HelpFile,HelpContextId,Type)
Метод InputBox является методом объекта Application, и поэтому
здесь присутствует слово Application. Аргументы этого метода, кроме
Type, такие же, как и у функции InputBox. Основное отличие синтаксиса
метода InputBox от синтаксиса одноименной функции заключается в по-
следнем аргументе Type. Необязательный аргумент Type позволяет явно
указать тип возвращаемого значения. В приведённой ниже таблице со-
держатся значения, которые может принимать этот аргумент.
Значения аргумента Type
Значение Возвращаемое значение
0 Формула
1 Число
2 Текст (строка)
4 Логические значения, такие как ИСТИНА и ЛОЖЬ
8 Ссылка на ячейку
16 Значение ошибки
64 Массив значений
Пример
Sub Пример()
Dim Данное As Integer
Данное = Application.InputBox("Введите число:", , , , , , , 1)
44

MsgBox "Введённое данное равно " & Данное


End Sub
Запятые в выражении Application.InputBox указывают места пропущенных
аргументов. Последний аргумент – Type имеет значение 1. Это показыва-
ет, что допустимыми вводимыми значениями являются только числа.
Преимуществом метода InputBox является возможность обнаружения
ошибок при вводе данных. Например, если при выполнении процедуры
Пример введено не число, то будет выведено следующее сообщение об
ошибке:

Можно суммировать значения аргумента Type. Например, если нуж-


но, чтобы метод мог возвращать как текст, так и числа, следует сделать
аргумент Type равным 3 (1 + 2). Если аргумент Type не задан, то метод
InputBox по умолчанию возвращает текст.
Пример
Sub ФункцияInputBox2()
Dim Данное As Variant
Данное = Application.InputBox("Введите данное:", , , , , , , 3)
MsgBox "Введённое данное равно " & Данное
End Sub
Пропуск отмечающих запятых, а также перестановка аргументов
функции приводит к ошибкам несовпадения типов. Для предотвращения
ошибок программирования функций при вводе аргументов VBA предос-
тавляет возможность передавать значения аргументов функции, исполь-
зуя именованные аргументы функций. Приведённая ниже процедура При-
мер2 иллюстрирует использование именованных аргументов функций
Prompt, Title и Type; она решает ту же задачу, что и процедура Пример.
Sub Пример2()
Dim Данное As Integer
Данное = Application.InputBox(Promp t:= "Введите число:", _
Title:="Проверка типа данных", Type:=1)
MsgBox Prompt := "Введённое данное равно " & Данное, _
Title:="Проверка ввода данных"
End Sub
Следует обратить внимание на то, что:
− имя аргумента отделяется от его значения символом “:=” (двоето-
чие и равно);
− порядок перечисления именованных аргументов не обязательно
совпадает с их порядком в формате функции;
45

− список аргументов функции MsgBox не заключается в скобки;


− в операторе Данное = Application.InputBox … функция InputBox ис-
пользуется как метод приложения Application, и поэтому её аргу-
менты заключаются в скобки.
Ниже приведены результаты выполнения процедуры Пример2.

2.9.4. Объединение текстовых строк


Если надо объединить несколько текстовых строк в одну, использу-
ется символ конкатенации &. Его применение, а также применение других
символьных констант, используемых при выводе сообщений, на экран по-
казано в приведённой ниже процедуре ОбъединениеСтрок.
Sub ОбъединениеСтрок()
Dim Имя As String
Dim Сообщение As String
Имя = InputBox("Введите ваше имя: ")
'Следующая строка для окна сообщения объединяет
'слово "Привет" со значением переменной Имя
MsgBox "Привет, " & Имя & "!"
Сообщение = "Это пример объединения нескольких"
Сообщение = Сообщение & " строк в одну большую"
Сообщение = Сообщение & " строку." & vbNewLine
Сообщение = Сообщение & "vbNewLine - константа, позволяющая"
Сообщение = Сообщение & " начинать новую строку"
MsgBox Сообщение
End Sub
Ниже приведены результаты выполнения процедуры ОбъединениеСтрок.
46
2.10. Концепция событий Excel
Событие представляет собой действие, распознаваемое объектом,
например, щелчок мышью или нажатие клавиши, перемещение мыши или
выход из программы, для которого можно запрограммировать отклик, т.е.
реакцию объекта на произошедшее событие. В этом случае говорят, что
процедура обрабатывает событие. Процедура обработки события – это
специально именованная процедура, которая запускается при возникнове-
нии определённого события.
Excel реагирует на большое количество событий. При возникновении
определённого события Excel может запускать указанную процедуру об-
работки. Примерами событий, распознаваемых Excel, являются:
− открытие и закрытие рабочей книги;
− активизация окна;
− активизация или деактивизация рабочего листа;
− ввод данных в ячейку или редактирование данных в ячейке;
− сохранение рабочей книги;
− щелчок на объекте;
− обновление данных на диаграмме;
− нажатие определённой клавиши или сочетание клавиш;
− двойной щелчок на ячейке;
− наступление определённого времени суток.
Обработать можно события следующих объектов Excel:
− Application
− WorkBook
− WorkSheet
− Chart
− UserForm.
2.10.1. Типы событий Excel
Excel в процессе работы может управлять большим количеством со-
бытий, которые могут быть классифицированы следующим образом.
− События объекта Application происходят в приложении Excel. На-
пример, событие WorkbookBeforeClose, возникает при закрытии
одной из рабочих книг.
− События объекта WorkBook происходят в конкретной рабочей кни-
ге. Например, событие Open, возникает при открытии или создании
рабочей книги.
− События объекта WorkSheet происходят в конкретной рабочем
листе. Например, событие Change, возникает при изменении со-
держимого ячейки листа.
− События объекта UserForm происходят в диалоговом окне
UserForm или в одном из объектов этого диалогового окна. Напри-
мер, элемент управления CommandButton, расположенный в диа-
логовом окне UserForm, поддерживает событие Click, возникающее
при щелчке на этой кнопке.
47

− События, не связанные с объектами: OnTime и OnKey. Эти собы-


тия работают иначе, чем остальные.
Каждая процедура обработки события имеет своё предопределённое
имя, задаваемое в соответствии со следующим форматом
Объект_Событие
т.е. состоит из имени объекта и наименования события, разделённых сим-
волом “подчёркивание” (_).
Примеры
− WorkBook_Open
− Workbook_SheetActivate
− Worksheet_SelectionChange
− Worksheet_BeforeRightClick
Процедуры событий объекта WorkBook хранятся в модуле ЭтаКнига, объ-
екта WorkSheet – в модулях Лист1, Лист2, Лист3, объекта UserForm – в
модулях UserForm (Рис. 10).

Рис. 10. Объекты Microsoft Excel


В отличие от других событий, доступ к событиям OnTime и OnKey
осуществляется при помощи методов OnTime и OnKey объекта
Application. Они программируются при помощи инструкций, расположенных
в модуле общего назначения Module1, Module2,…, Module№.
2.10.2. События объекта Workbook
События объекта Workbook происходят в пределах определённой
рабочей книги. Их количество равно 23. Ниже приведена таблица, в кото-
рой перечислены наиболее часто используемые события объекта Work-
book и краткое их описание.
Таблица события объекта Workbook
Событие Действие, к которое приводит к возникновению события
BeforeClose Начало закрытия рабочей книги
BeforePrint Перед началом печати рабочей книги
BeforeSave Перед сохранением рабочей книги
Open При открытии рабочей книги
SheetActivate При активизации рабочего листа
48

Список событий можно просмотреть, как показано на рис. 11, 12 и 13.


Для получения справки по событию нужно ввести его имя в поле
справки “Ведите вопрос”, например, BeforePrint, нажать клавишу Enter и
выбрать BeforePrint Event. На экран будет выведена справка по этому со-
бытию.
BeforePrint Event
See Also Applies To Example Specifics
Occurs before the workbook (or anything in it) is printed.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel False when the event occurs. If the event procedure sets this argument to True,
the workbook isn't printed when the procedure is finished.
Example
This example recalculates all worksheets in the active workbook before printing any-
thing.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
For Each wk in Worksheets
wk.Calculate
Next
End Sub
Код процедуры обработки события можно ввести полностью вруч-
ную. Однако объявление этой процедуры лучше сделать при помощи ре-
дактора VBE. Для этого нужно открыть редактор Visual Basic (клавиши
Alt + F11 или кнопка ), выбрать двойным щелчком мыши из Microsoft
Excel Objects модуль ЭтаКнига (или Лист1 (2, 3)) и из раскрывающегося
списка справа сверху General выбрать объект Workbook (или Worksheet)
(рис.11) и щёлкнуть по нему. Появится диалоговое окно со “скелетом” про-
цедуры обработки события Open() (рис. 12).

Рис. 11. Выбор объекта для обработки события рабочей книги


49

Рис. 12. “Скелет” процедуры обработки события Open()

Рис. 13. Выбор события SheetActive

Для выбора другого события нужно раскрыть список событий и выбрать


его, например, SheetActive (рис. 13).
На экран будет выведено диалоговое окно со “скелетом” процедуры Work-
book_SheetActivate (рис.14).

Рис. 14. Процедуры Workbook_Open и Workbook_SheetActivate


Процедуру Workbook_Open, если она не нужна, следует удалить.
50

Предположим, что процедура Workbook_SheetActivate должна выда-


вать сообщение об имени активизируемого рабочего листа. Ниже приве-
дён текст такой процедуры и диалоговое окно при активизации Листа3.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox ("Активный лист-" & Sh.Name)
End Sub

Необходимо помнить, что процедуры обработки событий объекта


Workbook должны находиться в модуле ЭтаКнига ( ), а объекта
Worksheet – в модулях Лист1, Лист2, Лист3.
Как видно из рис. 14, процедуры обработки событий могут иметь ар-
гументы. Аргумент Sh в приведённой выше процедуре представляет акти-
визированный рабочий лист. В данном случае переменная Sh имеет тип
Object.
Примечание
Как для любой переменной VBA в приведённом выше примере вместо Sh
можно использовать любое другое допустимое имя, например, Имя_Листа.
Некоторые процедуры обработки событий используют аргумент
Cancel с типом данных Boolean. В приводимой ниже процедуре значение
аргумента Cancel, которое передаётся в процедуру, равно False, т.е. пе-
чать разрешена (Cancel= False означает, что отмена не действует). Одна-
ко можно установить это значение равным True, что приведёт к отмене пе-
чати.
Private Sub Workbook_BeforePrint (Cancel As Boolean)
Сообщение = "Бумага загружена?"
Ответ = MsgBox(Сообщение, vbYesNo, "Печать")
If Ответ = vbNo Then Cancel = True
End Sub
Процедура Workbook_BeforePrint выполняется при выдаче команды
на печать. Она отображает окно сообщения, приведённое ниже.

если пользователь щёлкнет по кнопке Нет (константа vbNo), то аргумент


Cancel примет значение True, и печать будет отменена.
51

В следующей процедуре выводится диалоговое окно с именем акти-


вируемого листа. Процедура выполняется при смене активного листа.
Private Sub Workbook_SheetActivate(ByVal Имя_Листа As Object)
("Имя активируемого листа - " & Имя_Листа.Name)
End Sub

2.10.3. События объекта Worksheet


События объекта Worksheet относятся только к конкретным рабочим
листам, для которых имеются модули листа: Лист1 (Лист1), Лист2 (Лист2) и
т.д. Ниже приведена таблица наиболее часто используемых событий
объекта Worksheet.

Событие Действие, к которое приводит к возникновению события


Activate Активизация рабочего листа
BeforeDoubleClick Дойной щелчок на рабочем листе
BeforeRightClick Щелчок правой кнопкой мыши на рабочем листе
SelectionChange Перемещение курсора на рабочем листе
Пример
Приводимая ниже процедура выполняется при изменении значения
данного в какой-либо ячейке рабочего листа, в модуле которого хранится
эта процедура.
Private Sub Worksheet_Change (ByVal Target As Range)
MsgBox "Диапазон " & Target.Address & " изменился"
End Sub
Если будет изменено данного в ячейке A2, то на экран будет выведено
следующее диалоговое окно:

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

события BeforerightClick, и появление контекстного меню в текущем рабо-


чем листе отменяется.
Private Sub Worksheet_BeforerightClick _
(ByVal Target As Excel.Range, Cancel As Boolean)
Cancel = True
MsgBox "Контекстное меню недоступно"
End Sub
При щелчке правой кнопкой мыши на рабочем листе, в модуле которого
хранится эта процедура, будет выведено следующее диалоговое окно:

2.10.4. События объекта Application


К событиям уровня Application следует обращаться, когда нужно про-
контролировать возникновение событий для всех открытых рабочих книг
или рабочих листов. Для этого необходимо создать новый модуль класса.
Необходимость использования этих событий возникает довольно редко, и
в настоящей работе эти события не рассматриваются.
2.10.5. События объекта UserForm
Эти события будут рассмотрены при изложении технологии работы с
пользовательскими формами.
2.10.6. События, не связанные с конкретными объектами
Рассмотренные выше события связаны с объектами: Application,
WoorkBook, Sheet и т.д. В этом пункте описаны события, которые не свя-
заны с определёнными объектами: OnTime и Onkey. Доступ к ним произ-
водится с помощью методов объекта Application. Другими словами, на-
стройка событий OnTime и OnKey осуществляется с помощью методов
OnTime и Onkey.
В отличие от событий, рассмотренных выше, события OnTime и
Onkey программируются с помощью инструкций, расположенных в модуле
кода общего назначения: Module1, Module2 и т.д.
2.10.6.1. Метод OnKey
Метод OnKey устанавливает выполнение указанной процедуры при
нажатии заданной комбинации клавиш.
Формат метода
OnKey (Key, Procedure), где
53

Key – обязательный параметр, задающий строку, определяющую


комбинацию клавиш, которая должна быть нажата. В этой строке можно
также указывать специальные клавиши, используя коды.
Procedure – необязательный параметр, задающий имя процедуры,
выполняемой при нажатии указанной в Key комбинации клавиш. Если па-
раметр опущен, то выполняется действие, которое зарезервировано в сис-
теме за этой комбинацией клавиш. Допустимо использование одновре-
менно нажатой специальной клавиши и клавиши модификатора.
В таблице, приведённой ниже, указаны коды некоторых специальных
клавиш и клавиш модификаторов.

Специальная клавиша Код


От F1 до F15 От {F1} до {F15}
{LEFT}
{RIGT}
{DOWN}
{UP}
End {END}
Insert { INSERT}

Клавиша-модификатор Код
Shift +
Ctrl ^
Alt %
Пример
В следующем примере для вызова процедуры Пример1 назначена клави-
ша F1, а для процедуры Пример2 – комбинация клавиш Ctrl и Стрелка
вверх ( ). Назначение клавиш этим процедурам производится в процедуре
Setup_OnKey, которая автоматически вызывается процедурой автозапуска
Auto_Open при загрузке рабочей книги Excel. Это необходимо для назна-
чения клавишей процедурам.
Sub Auto_Open()
Call Setup_OnKey
'MsgBox "AUTO_EXEC"
End Sub
Sub Setup_OnKey()
Application.OnKey "{F1}", "Пример1"
Application.OnKey "{UP}", "Пример2"
End Sub
Sub Пример1()
d = "Дата " & Date
MsgBox "Переназначение клавиш_1" & Chr(13) & "Дата " & Date & Chr(13) &
"Клавиша F1"
54

End Sub
Sub Пример2()
MsgBox "Переназначение клавиш_2" & Chr(13) & "Клавиши Ctrl и Стрелка
вверх"
End Sub
Ниже приведены диалоговые окна, выводимые в рассматриваемом при-
мере.

2.10.6.2. Событие OnTime


Событие OnTime происходит в заданное время суток. Доступ к нему
производится с помощью метода объекта Application OnTime. В приведён-
ной ниже процедуре ИнтервалВремени осуществляется вызов процедуры
ВыходПоВремени через 45 минут от момента её вызова, т.е. текущего
времени, которое задаётся функцией Now. Функция TimeValue преобразу-
ет строковое значение аргумента (в нашем случае "00:45:00") в формат
времени (45 минут).
Sub ИнтервалВремени()
Application.OnTime Now + TimeValue("00:45:00"), "ВыходПоВремени"
End Sub
В процедуре ВыходПоВремени строка Ваше время истекло! Помещается
в ячейку E5 Листа2, и его содержимое (параметр Contents) защищается от
изменений (использован метод Protect).
Sub ВыходПоВремени()
Sheets("Лист2").Range("E5").Value = "Ваше время истекло!"
Sheets("Лист2").Protect Contents:=True
End Sub
2.11. Формы пользователя
Формы пользователя – это диалоговые окна, предназначенные для
создания собственного интерфейса при работе с программными модулями
проекта, используя объект UserForm. При помощи форм пользователя
VBA , которые называются также экранными формами, можно создавать
диалоговые окна для вывода данных или получения значений от пользо-
вателя в виде, требуемом программе пользователя. Хотя во многих случа-
ях для этих целей можно применять функции MsgBox и InputBox (или ме-
тод InputBox), при разработке сложных проектов возможности их недоста-
точны. В экранных формах пользователя можно в одном диалоговом окне
55

задавать сразу несколько опций, выбирать пункты из списка или вводить


несколько значений, наподобие диалоговым окнам приложений MS Office.
Для вставки экранной формы в приложение нужно выполнить сле-
дующие действия.
1. Открыть рабочую книгу.
2. Войти в редактор Visual Basic, нажав комбинацию клавиш
<Alt+F11> или щёлкнув по кнопке .
3. Если в окне проекта не появится окно Project – VBAProject, то вы-
брать в меню View пункт Project Exsplorer.
4. В окне проекта щёлкнуть правой кнопкой мыши на элементе
ЭтаКнига.
5. В контекстном меню выполнить команду Insert>UserForm (Вставка >
Экранная форма). В рабочую книгу будет вставлена экранная форма
UserForm1 и Панель элементов ToolBoox (рис.15).

Рис. 15. Вставленная новая экранная форма

Новая экранная форма представляет собой пустое окно со строкой


заголовка UserForm1. Это та основа, на которой пользователь может соз-
дать собственные диалоговые окна и окна других типов. Если панель
ToolBoox не появится, нужно выбрать в меню View пункт ToolBoox или на-
жать кнопку на панели Microsoft Visual Basic.
2.11.1. Свойства, методы и события экранных форм
Форма представляет собой интерфейс пользователя. Она может со-
держать меню, кнопки, окна списков, полосы прокрутки и другие элементы,
существующие в программах MS Office. VBA по умолчанию предлагает
форму, которая имеет имя UserForm1, со стандартной сеткой (группа рав-
номерно расположенных точек). Сетка служит для удобства размещения
56

элементов пользовательского интерфейса. Шаг сетки можно изменить вы-


полнив команду Сервис, Параметры (Tool, Options), закладка Общие
(General). Форма UserForm1 может быть переименована, и её размеры мо-
гут быть изменены при разработке приложения. При необходимости можно
добавить новые формы. Каждая форма при работе программы будет ок-
ном пользовательского интерфейса. Форма (UserForm) является объектом
и обладает большим набором свойств, методов и событий.
2.11.1.1. Некоторые свойства форм
Большая часть основных свойств относится к внешнему виду, разме-
рам и местонахождению окон.
− Свойство Name задаёт имя формы. После создания первой
формы в проекте она по умолчанию получает стандартное имя
UserForm1, второй – UserForm2, и т.д., которое рекомендуется
заменить на такое, чтобы оно указывало на назначение формы.
− Свойство Caption задаёт заголовок формы. Значение этого свой-
ства также рекомендуется назначить таким, чтобы оно указывало
на назначение формы, например, "Выполнение плана".
− Свойство Enabled используется для временного отключения
формы.
2.11.1.2. Некоторые методы форм
Во время редактирования формы её можно запускать нажатием кла-
виши F5. После того, как форма будет готова, нужно обеспечить её запуск
в документе. Для этого нужно воспользоваться методом Show:
UserForm1.Show
Если форма уже была загружена в память, она просто станет види-
мой, если еще нет, то будет автоматически загружена (произойдет собы-
тие Load).
Эту команду, можно вызвать, например:
− из обычного макроса, назначенного кнопкой или комбинацией
клавиш или запускаемого файлом автозапуска Auto_Exec;
− из кода для элемента управления, расположенного в самом до-
кументе, например, CommandButton или на другой форме – для
перехода между формами.
После того, как пользователь введет или выберет нужные данные
на форме и нажмет на требуемую кнопку, форму необходимо убрать.
Можно для этой цели воспользоваться двумя способами:
− использовать метод Hide:
UserForm1.Hide
Форма будет убрана с экрана, но останется в памяти. Потом при помо-
щи метода Show() можно будет опять ее вызвать в том же состоянии, в
каком она была на момент удаления с экрана. Окончательно форма
удалится из памяти при закрытии документа.
57

− если форма в процессе работы приложения больше не потребу-


ется, можно ее удалить из памяти при помощи команды Unload:
Unload UserForm1
Остальные методы относятся либо к обмену данными через бу-
фер обмена: Copy, Cut, Paste, либо к служебным возможностям фор-
мы: PrintForm, Repaint, Scroll.
Важнейшая концепция VBA – события. Событие (event) – это то,
что происходит с программой и может быть ей распознано. Например, к
событиям относятся щелчки мышью, нажатия на клавиши, открытие и
закрытие форм, перемещение формы по экрану и т.п. VBA построен
таким образом, чтобы создавать на нем программы, управляемые со-
бытиями.
2.11.1.3. Некоторые события форм
Часто используемые события форм:
− Initialize происходит при подготовке формы к открытию (появле-
нию перед пользователем). Обычно в обработчик для этого со-
бытия помещается код, связанный с открытием соединений базы
данных, настройкой элементов управления на форме, присвое-
ние им значений по умолчанию и т.п.
− Click и DblClick – реакция соответственно на одиночный и двой-
ной щелчок мыши. Обычно обработчик щелчков используется
для кнопок элементов управления CommandButton.
− Error – это событие используется при возникновении ошибки в
форме и применяется пользователем для исправления сделан-
ной им ошибки.
− Terminate – событие используется при нормальном завершении
работы формы и выгрузке ее из памяти, например, по команде
Unload.
Остальные события связаны либо с изменением размера окон, либо с на-
жатиями клавиш, либо с активизацией или деактивизацией.
Главное событие формы – Initialize. Все остальные события обычно
используются для расположенных на ней элементов управления.
2.11.2. Элементы управления
Элементы управления используются для взаимодействия пользова-
теля с приложением. Элементы управления реагируют на события, кото-
рые генерирует пользователь (нажатие на кнопку, ввод значения, переме-
щение ползунка и т.п.). Их можно размещать в документах непосредствен-
но на рабочем листе и на пользовательских формах VBA.
Элементы управления находятся на Панели элементов в виде кно-
пок. Ниже приведена панель “Элементы управления” на рабочем листе
58

и панель “Toolbox” – в пользовательской форме.

На рис. 16 а, б представлены элементы управления с англоязычным и


русскоязычным обозначением кнопок.

Рис. 16,а. Стандартная панель элементов (англоязычные обозначения)

Рис. 16,б. Стандартная панель элементов (русскоязычные обозначения)


Ниже рассмотрено использование элементов управления сначала в
пользовательских формах, а затем – на рабочем листе.
Добавление элементов управления на форму обычно производится
при помощи панели элементов ToolBoox (рис. 15). Для этого необходимо
59

выбрать элемент управления в Toolbox и перетащить его на форму или


выделить элемент управления в Toolbox и затем на форме выделить ту
область экрана, которую будет занимать этот элемент управления. После
добавления в форму элемента управления ему назначается имя, которое
состоит из названия типа элемента управления и порядкового номера. На-
пример, если добавить элемент управления Label в пустую форму, то этот
элемент управления получит название Label1; если добавить в окно вто-
рой элемент управления Label, то он получит название Label2.
2.11.2.1. Элемент управления Label (Надпись)
Надпись – это просто область формы, в которой выводится какой-то
текст. На рис. 17 таким текстом является “Элемент управления Label”.

Рис. 17. Пример значения элемента управления Label на форме


2.11.2.1.1. Окно свойств формы
Для просмотра и изменения свойств формы или элементов управле-
ния во время проектирования используется окно свойств Properties
(рис.18). Для получения справки по какому-либо свойству формы нужно
выделить его в окне свойств и нажать клавишу F1.

Рис. 18. Окно свойств формы Properties


Открыть окно свойств можно одним из трёх способов:
с помощью команды Вид, Окно свойств (View, Properties Window);
с помощью пиктограммы ;
с помощью клавиши F4.
После выполнения одного из этих действий в окне Properties появится
список свойств объекта и их значения. Чтобы изменить значение свойства,
нужно найти его в левой колонке и изменить значение в правой колонке.
60

Если в области значений появились три точки, то нужно щелкнуть на них,


чтобы открылось диалоговое окно. Если появилась указывающая вниз
стрелка, то щелчок на ней раскрывает список возможных значений.
Отобразить форму на экране можно двумя способами.
1. Из окна проектирования формы UserForm щёлкнуть клавишей
F5.
2. Запустить процедуру, которая вызывает метод Show объекта
UserForm. Если объект UserForm называется
ПЛАН_ОТГРУЗКИ, то следующая процедура отобразит это
пользовательское диалоговое окно.
Sub ПЛАН_ОТОБРАЗИТЬ()
ПЛАН_ОТГРУЗКИ. Show
End Sub
Эта процедура должна находиться в стандартном модуле VBA, а
не в модуле формы!
Изменим свойство Font элемента управления Label: выделим эле-
мент управления Label на форме, установим для него размер шрифта
равным 14 и начертание – курсив. Кроме того, выделим форму и зададим
свойству Name (имя формы) значение “ПЛАН_ОТГРУЗКИ” и свойству
Caption (заголовок) – значение “План отгрузки. Клавишей F5 запустим мо-
дуль формы ПЛАН_ОТГРУЗКИ на выполнение. Тогда на экран будет вы-
ведена форма, представленная на рис. 19.
Примечания
1. Имя формы, как и имя любого объекта VBA, не может содержать
символ “пробел”; вместо него рекомендуется использовать символ
“подчёркивание” (_).
2. Свойство Caption может иметь любое значение, в том числе и
совпадающее с именем объекта.

Рис. 19. Форма План_отгрузки


2.11.2.2. Элемент управления CommandButton (Кнопка)
Отображаемая пользовательская форма находится на экране до тех
пор, пока она не будет скрыта или выгружена. Диалоговое окно UserForm
автоматически выгружается из памяти при щелчке на кнопке в строке
заголовка окна формы. Обычно в пользовательскую форму вставляют
элемент управления CommandButton, который запускает процедуру закры-
тия формы. Эта процедура или выгружает пользовательскую форму с по-
мощью оператора Unload, или скрывает пользовательскую форму с экрана
с помощью метода Hide объекта UserForm. При вызове метода Hide диа-
логовое окно удаляется с экрана, но форма остаётся в памяти.
61

Щелчок по элементу управления вызывает событие, которое можно


обработать процедурой формы. Эта процедура находится в модуле фор-
мы и имеет имя, состоящее из имени элемента управления с порядковым
номером элемента в форме, и слова Click, разделённых символом “под-
чёркивание”, например, CommandButton1_Click.
При этом первый вставляемый в форму элемент данного типа имеет но-
мер 1, второй – 2 и т.д. Имя элемента управления, определяемое пара-
метром (Name), можно менять на смысловое в таблице свойств Propеrties,
например, на Ок или Выйти. В этом случае процедура обработки события
будет иметь имя соответственно Ок_Click и Выйти_Click.
Для создания процедуры обработки события, возникающего при
щелчке по элементу управления формой, нужно дважды щёлкнуть по это-
му элементу в окне редактора форм. Тогда произойдёт переход в модуль
формы, в котором отобразится “заготовка” процедуры обработки события
UserForm, например,
Private Sub CommandButton1_Click()
End Sub
или
Private Sub Ok_Click()
End Sub
если имя формы было заменено в окне Propеrties на Ok. В эту процедуру
нужно вставить операторы(инструкции) обработки события, например,
Private Sub Ok_Click()
Range(“A1”).Value = ShouКвартал.КВАРТАЛЫ.Value
R = ShouКвартал.КВАРТАЛЫ.Value
End Sub
Private Sub Ok_Click()
Unload Me
End Sub
При щелчке по кнопке Ok в первой процедуре ячейка A1 активного листа
получит значение элемента управления КВАРТАЛЫ формы ShouКвартал,
а вторая процедура вызовет выгрузку активной (текущей) формы.
Ключевое слово Me возвращает (указывает) имя активного окна.
Скрыть или выгрузить форму можно также при помощи стандартной
процедуры, которую можно вызвать из любой другой процедуры, в том
числе из процедуры формы. Приведённая ниже процедура
ПЛАН_СКРЫТЬ скрывает форму ПЛАН_ОТГРУЗКИ, а процедура
ПЛАН_УДАЛИТЬ удаляет форму ПЛАН_ОТГРУЗКИ из памяти.
Sub ПЛАН_СКРЫТЬ()
ПЛАН_ОТГРУЗКИ.Hide
End Sub
62

Sub ПЛАН_ УДАЛИТЬ ()


Unload ПЛАН_ОТГРУЗКИ
End Sub
Вместо операторов ПЛАН_ОТГРУЗКИ.Hide и Unload ПЛАН_ОТГРУЗКИ
можно использовать операторы Me.Hide и Unload Me.
2.11.2.3. Элемент управления TextBox (Текстовое поле)
Текстовое поле используется:
− для приема каких-либо текстовых данных, вводимых пользователем;
− для вывода пользователю текстовых данных с возможностью их
редактирования;
− для вывода текстовых данных с возможностью копирования и печати,
но без возможности изменения.
Наиболее часто используемые свойства этого элемента управле-
ния:
Value (или Text, эти два свойства для текстового поля идентичны) – то
текстовое значение, которое содержится в этом поле. Используется для
занесения исходного значения и для приема значения, введенного
пользователем, в строковую переменную.
AutoSize – возможность для текстового поля автоматически менять свой
размер, чтобы вместить весь текст.
ControlSource – ссылка на источник текстовых данных для поля. Может
ссылаться, например, на ячейку в Excel, на поле в Recordset и т.п. При
изменении пользователем данных в текстовом поле автоматически
изменится значение на источнике, определенном в ControlSource.
ControlTipText – текст всплывающей подсказки, которая появляется, когда
пользователь наводит указатель мыши на элемент управления.
Рекомендуется к заполнению для всех элементов управления (для самой
формы не предусмотрена).
Enabled – если переставить в False, то текст в поле станет серым и с
содержимым поля ничего сделать будет нельзя (ни ввести текст, ни
выделить, ни удалить). Обычно это свойство используется (для всех
элементов управления), чтобы показать пользователю, что этот элемент
управления отключен до выполнения каких-либо условий.
Locked – поле будет выглядеть как обычно, пользователь сможет
выделять и копировать данные из него, но не изменять их. Обычно
используется для показа неизменяемых данных типа лицензионных
соглашений, сгенерированных значений и т.п.
MaxLength – максимальная длина значения, которое можно ввести в поле.
Иногда можно использовать свойство AutoTab – при достижении
определенного количества символов управление автоматически
передается другому элементу управления.
63

MultiLine – можно ли использовать в текстовом поле несколько строк или


необходимо обойтись одной. Если вам нужно текстовое поле для приема
одного короткого значения, подумайте, нельзя ли вместо него обойтись
функцией InputBox.
PasswordChar – указать, за каким символом будут «прятаться» вводимые
пользователем значения. Используется, конечно, при вводе пароля.
ScrollBars – будут ли показаны горизонтальная и вертикальная полосы
прокрутки (в любом сочетании). Если текст может быть большим, без них
не обойтись.
WordWrap – настоятельно рекомендуется включать в тех ситуациях, когда
значение MultiLine стоит в True. В этом случае будет производиться
автоматический переход на новую строку при достижении границы
текстового поля.
Наиболее часто используемое событие для текстового поля – это со-
бытие Change, то есть изменение содержания поля. Обычно оно исполь-
зуется для проверки вводимых пользователем значений или синхрониза-
ция введенного значения с другими элементами управления, например,
сделать доступной кнопку, изменить текст надписи и т.п.
На рис.20 представлена форма ПЛАН_ОТГРУЗКИ, в которой отобра-
жён элемент управления TextBox с установленным свойством MultiLine в
True.

Рис. 20. Использование элемента управления TextBox


Форма ПЛАН_ОТГРУЗКИ загружается при выполнении процедуры
“Надпись”:
Public Sub Надпись()
ПЛАН_ОТГРУЗКИ.Show
End Sub
При внесении изменений в поле элемента управления, например, при вво-
де текста “Текстовое поле, введённое при помощи элемента управления
TextBox”, выполняется процедура формы ПЛАН_ОТГРУЗКИ
TextBox1_Change:
Private Sub TextBox1_Change()
Range(“A2”).Value = ПЛАН_ОТГРУЗКИ.TextBox1.Value
End Sub
64

в результате чего ячейка A2 получает значение текста, введенного в поле


элемента управления TextBox1. Выход из формы происходит при щелчке
по кнопке Ok. При этом вызывается процедура формы
CommandButton1_Click и выполняется оператор Unload Me.
2.11.2.4. Элемент управления ComboBox
(комбинированный список)
Этот элемент управления предоставляет пользователю возможность
выбирать существующие значения из раскрывающегося списка и вводить
в поле списка значение, которое отсутствует в списке.
Наиболее часто используются следующие свойства элемента
ComboBox.
− RowSource – это свойство указывает диапазон рабочего листа, кото-
рый содержит список значений элемента управления RowSource.
− Value (или Text) – позволяет программным способом установить вы-
бранное значение в списке или вернуть выбранное или введенное
пользователем значение.
− Остальные свойства: AutoSize, Enabled, Locked, ControlText,
ControlTipText, MaxLength – применяются точно так же, как и для
TextBox.
Основное событие элемента ComboBox – это Change, то же, что
и для TextBox. Обычно при обработке этого события проверяются
введенные пользователем значения, которые переносятся в текстовое
поле.
Список значений элемента управления ComboBox может быть оп-
ределён двумя способами:
− должен храниться в диапазоне ячеек рабочей книги;
− определяться, используя метод AddItem для добавления значения
списка в элемент управления ComboBox.
В первом способе в окне Properties устанавливается значение
свойства RowSource в виде ссылки на диапазон листа рабочей книги, в
котором хранятся значения списка, например, Лист1!B1:B4 или
КАРТАЛЫ, где КАРТАЛЫ – имя диапазона-строки или диапазона-
столбца (рис. 21,а и рис. 21,б).

Рис. 21,а. Диапазон значений элемента управления ComboBox


65

Рис. 21,б. Ссылка на диапазон значений элемента управления ComboBox


Значения диапазона ячеек рабочей книги можно менять программно.
Во втором способе значения элемента управления ComboBox созда-
ются программно перед использованием формы и пропадают после её за-
крытия. Ниже приведена процедура Заполнение_ComboBox, заполняющая
элемент управления ComboBox названиями кварталов с помощью метода
AddItem. В этой процедуре ShouКвартал – имя формы, КВАРТАЛЫ – имя
элемента управления ComboBox и значение свойства Caption формы
ShouКвартал.
Public R As Variant

Sub Заполнение_ComboBox()
' Заполнение элемента управления ComboBox
ShouКвартал.КВАРТАЛЫ.RowSource = “”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ1”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ2”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ3”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ4”
ShouКвартал.Show
MsgBox “R=” & R
End Sub
Кроме создания значений элемента управления ComboBox, в этой
процедуре осуществляется вывод на экран формы ShouКвартал (исполь-
зуется метод Show) и значения переменной R. Переменная R получает
значение в процедуре Ok_Click формы обработки события нажатия кнопки.
Переменная R должна быть объявлена как Public перед самой первой
стандартной процедурой. На рис.22 приведёна форма ShouКвартал, в
которой значения элемента ComboBox получены любым из приведённых
выше способов.
66

Рис. 22. Форма ShouКвартал


В форме ShouКвартал КВАРТАЛЫ – это заголовок формы, получен-
ный присвоением параметру Caption значения КВАРТАЛЫ. Щелчок по
кнопке Ok формы вызывает процедуру Ok_Click обработки этого события:
Private Sub Ok_Click()
Range(“A1”).Value = ShouКвартал.КВАРТАЛЫ.Value
R = ShouКвартал.КВАРТАЛЫ.Value
End Sub
В результате её выполнения ячейка A1 активного листа и переменная R
получат значение выбранной позиции в списке (на рис. 22 это КВ2).
При нажатии кнопки “Выйти” выполняется процедура Выйти_Click
формы модуля ShouКвартал:
Private Sub Выйти_Click()
Unload Me
End Sub
В результате выполнения процедуры Выйти_Click происходит выгрузка
формы ShouКвартал из памяти.
2.11.2.5. Элемент управления ListBox (список)
Этот элемент управления предоставляет пользователю возможность
выбирать только одно или несколько существующих значений из списка.
Основные свойства, методы и события у ListBox те же, что и у ComboBox.
Отличие состоит в том, что:

− имеется свойство MultiSelect, позволяющее пользователю выбирать


несколько значений (по умолчанию это свойство отключено);
− пользователь не может вводить свои значения.
На рис. 23 приведена форма Месяцы, в которой выбираются значения
из списка месяцы при помощи элемента управления ListBox. Значения
списка месяцы хранятся в блоке ячеек месяцы листа Excel.
67

Рис. 23. Форма Месяцы


Имя списка месяцы задаётся в качестве параметра RowSource в табли-
це Properties элемента ListBox (рис. 24).

Рис. 24. Задание свойства параметра RowSource формы Месяцы


Для выбора нужного месяца нужно выделить его мышью в списке и
щёлкнуть по кнопке Ok. При этом будет вызвана процедура обработки
события Click кнопки Выйти_Click:
Private Sub Ok_Click()
Range(“a1”).Value = Месяцы.Месяц.Value
r = Range(“a1”).Value
End Sub

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


и это же значение получит переменная r.

Загрузка формы осуществляется при помощи процедуры По-


ле_со_списком, хранящейся в стандартном модуле Module1:

Public r As Variant

Sub Поле_со_списком()
Месяцы.Show
68

MsgBox “R=” & r


End Sub
После закрытия формы при помощи процедуры
Private Sub Выйти_Click()
Unload Me
End Sub
кнопкой Выйти на экран будет выведено значение переменной r.
2.11.2.6. Элемент управления CheckBox (Флажок)
Элемент управления Флажок (CheckBox) дает возможность
 ыклзователю осуществить выбор типа Да/Нет. Можно создать группу
элементов, причём выбор значений для всех флажков в этой группе не за-
висит друг от друга. Вид элемента приведен на рис. 25.

Рис. 25. Элемент Флажок


Основные свойства элемента Флажок:
Caption: надпись, которая выводится рядом с элементом.
Value: True – флажок установлен;
False – флажок не установлен.
Основное событие для этого элемента – Click. Оно возникает при измене-
нии свойства Value с помощью мыши или программно. Ниже приведены
процедуры, обрабатывающие событие Click. Если установлен флажок
“Да”, то выводится сообщение “да”, а если “Нет”, то – “нет”.
Private Sub CheckBox1_Click()
If UserForm1.CheckBox1.Value = True Then MsgBox “да”
End Sub
Private Sub CheckBox2_Click()
If UserForm1.CheckBox2.Value = True Then MsgBox “нет”
End Sub

2.11.2.7. Элемент управления ToggleButton (Выключатель)


Элемент Выключатель (ToggleButton) предназначен для тех же
целей, что и элемент Флажок, но имеет вид кнопки, находящейся в “нажа-
том” (утопленном) или “отжатом” (отпущенном) состоянии. На рис.26 вы-
ключатель “Первый” включен (значение свойства Value = True), а
 ыклюючатель “Второй” – отключен (значение свойства Value = False).
Могут быть нажатыми несколько выключателей.
69

Рис. 26. Элемент Выключатель


Основные свойства элемента Выключатель:
Caption: надпись, которая выводится на элементе.
Value: True – выключатель установлен;
False – выключатель не установлен.
Основное событие для этого элемента – Click. Оно возникает при измене-
нии свойства Value с помощью мыши или программно. Ниже приведены
процедуры, обрабатывающие событие Click. Если нажат выключатель
“Первый”, то выводится сообщение “ Первый ”, а если “Второй”, то – “Вто-
рой”.
Private Sub ToggleButton1_Click()
If UserForm2.ToggleButton1.Value = True Then MsgBox “Первый”
End Sub
Private Sub ToggleButton2_Click()
If UserForm2.ToggleButton2.Value = True Then MsgBox “Второй”
End Sub
2.11.2.8. Элемент управления OptionButton (Переключатель)
Элементы Переключатели (OptionButton) предназначены для выбора
одного из двух взаимоисключающих значений: True (“Выбран”) и False
(“Не выбран”) (рис.27). Они обычно объединяются в группу. При выборе
нужного элемента остальные элементы в группе автоматически устанав-
ливаются в состояние “Не выбран”.

Рис. 27. Элемент Переключатель

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


элементы-контейнеры, например, Рамка. Если группа одна, то контейне-
ром может служить форма. Основные свойства элемента Переключатель:
Caption: надпись, которая выводится на элементе.
Value: True – переключатель установлен;
False – переключатель не установлен.
Основное событие элемента Переключатель – Click. Оно возникает
при изменении значения свойства Value. В группе переключателей собы-
тие возникает только для того элемента, чье значение становится True.
70

2.11.2.9. Элемент управления Image (Рисунок)

Элемент Рисунок (Image) предназначен для вывода содержимого


графических файлов в форме. Элемент не позволяет редактировать рису-
нок. Поддерживаются следующие форматы файлов: *.bmp, *.cur, *.gif, *.ico,
*.jpg, *.wmf.
2.11.2.10. Элемент управления ScrollBar (полоса прокрутки)

Полоса прокрутки (ScrollBars) используется в текстовых полях,


когда введенный текст полностью на экране не умещается. ScrollBar мож-
но использовать как отдельный элемент управления для выбора значения
из диапазона. Обычно такой элемент управления используется для выбо-
ра плавно меняющихся значений.
Главное событие для этого элемента управления – Change.
Наиболее часто используемые свойства элемента ScrollBars.
Max и Min – максимальное и минимальные значения, которые можно
задать при помощи этого элемента управления. Возможный диапазон – от
-32 767 до +32 767.
LargeChange и SmallChange – величина шага ползунка при переме-
щении его пользователем путем щелчка на полосе ниже ползунка или при
нажатии на кнопку направления соответственно.
Orientation – определяет расположение ползунка (вертикальное или
горизонтальное). По умолчанию для этого свойства установлено значение
1, что значит, что ориентация определяется автоматически в зависимости
от конфигурации отведенного элементу управления пространства на фор-
ме (что больше – длина или высота). Однако при помощи этого свойства
можно и явно указать вертикальное или горизонтальное расположение
ползунка.
ProportionalThumb – определяет размер ползунка: будет ли он про-
порционален размеру полосы прокрутки (по умолчанию) или фиксирован-
ного размера.
Value – главное свойство этого элемента управления. Определяет
положение ползунка и то значение, которое будет возвращать этот эле-
мент управления программе.
Применение ползунка без отображения выбранной при помощи него
информации не очень удобно. В простом случае значение, выбранное при
помощи ползунка, можно отобразить в текстовой надписи:
Private Sub ScrollBar1_Change()
Label1.Caption = ScrollBar1.Value
End Sub
В более сложном варианте пользователь может выбирать: использовать
ползунок или вводить значение в тестовом поле.
71

2.11.2.11. Элемент управления SpinButton (Счётчик)

Элемент управления SpinButton (Счётчик) – эта та же полоса


прокрутки, но без самой полосы и ползунка. SpinButton используется в тех
ситуациях, когда диапазон выбираемых значений небольшой. Все свойст-
ва, имеющиеся у SpinButton, совпадают со свойствами ScrollBar.
При щелчке на соответствующей стрелке изменяется значение само-
го элемента, но внешне это никак не выражается. Изменять значение дру-
гого элемента с помощью элемента Счетчик можно программно.
2.11.2.12. Элемент управления RefEdit (Поле со свёртыванием)
Элемент управления RefEdit (Поле со свёртыванием) аналогичен по-
лю ввода, но позволяет вводить в него ссылку на диапазон выбором на
рабочем листе. Свойство Value возвращает эту ссылку.
В качестве примера1 использования элемента управления RefEdit ис-
пользуем проект, определяющий некоторые статистические параметры
диапазона, а именно максимальное, минимальное значения и сумму всех
значений ячеек этого диапазона. Создаётся форма, на которой располо-
жены две кнопки: CommandButton1 и CommandButton2 и элемент управле-
ния RefEdit (рис. 30). Кнопка CommandButton1 предназначена для задания
значения диапазона элемента управления RefEdit, а кнопка
CommandButton2 – для выгрузки формы. Форма, приведённая на рис. 31,
загружается при выполнении процедуры СТАТИСТИКА2:
Sub СТАТИСТИКА2()
СТАТИСТИКА.Show
End Sub
находящейся в стандартном модуле Module1.

Рис. 28. Проект формы Рис. 29. Загруженная форма

1
При разработке примера использованы материалы из кн.: Гарнаев А.Ю. MS Excel
2002: разработка приложений. – СПб.: БХВ-Петербург, 2003. – C. 391–392.
72

Для задания диапазона необходимо сделать активным окно элемен-


та управления RefEdit и выделить нужный диапазон Лист1!$A$14:$A$17
(рис. 32). При выделении диапазона размер формы уменьшается, откры-
вая ячейки для его выделения. Отсюда название элемента “Поле со свёр-
тыванием”.

Рис. 30. Выделение диапазона

При нажатии на кнопку ok выполняется следующая процедура модуля


формы.
Private Sub CommandButton1_Click()
Dim r As String
Dim min As Double, max As Double, s As Double
r = RefEdit1.Value
Dim rgn As Range
Set rgn = Range
min = WorksheetFunction.min(rgn)
max = WorksheetFunction.max(rgn)
s = WorksheetFunction.Sum(rgn)
MsgBox RefEdit1.Value & vbCr & _
“min=” & min & vbCr & _
“max=” & max & vbCr & _
“s=” & s
End Sub
В этой процедуре инструкция r = RefEdit1.Value присваивает переменной r
значение ссылки на диапазон, инструкция Dim rgn As Range объявляет пе-
ременную rgn как объект Range, а инструкция Set rgn = Range® присваи-
вает значение ячеек выбранного диапазона переменной rgn.
Значения свойства Caption формы (Статистика), кнопки
CommandButton1 (ok) и кнопки CommandButton2 (Выйти) задаются при
инициализации следующей процедуры модуля формы:
Private Sub UserForm_initialize()
Me.Caption = “Статистика”
CommandButton1.Caption = “ok”
CommandButton2.Caption = “Выйти”
End Sub
Удаление формы из памяти осуществляется при нажатии кнопки
“Выйти”. При этом возникает событие Click, обрабатываемого следующей
процедурой формы:
73

Private Sub CommandButton2_Click()


Unload Me
End Sub
При использовании данного приложения действия производятся в
следующем порядке.
1. Запускается (пользователем или программно) процедура
СТАТИСТИКА2.
2. Эта процедура загружает форму СТАТИСТИКА, при инициализа-
ции которой выполняется процедура UserForm_initialize.
3. Пользователь выделяет на рабочем листе диапазон значений, на
который ссылается элемент управления RefEdit.
4. При нажатии на кнопку ok вызывается процедура
CommandButton1_Click, в результате выполнения которой осуще-
ствляется подсчёт минимума, максимума и суммы величин вы-
бранного диапазона при помощи свойств Min, Max и Sum объекта
WorksheetFunction, представляющие собой одноименные функции
рабочего листа и которые выводятся на экран при помощи функ-
ции MsgBox (рис. 33).

Рис. 31. Результаты выполнения приложения СТАТИСТИКА


5. При нажатии на кнопку Выйти выполняется процедура
CommandButton2_Click,в результате чего форма СТАТИСТИКА
выгружается.
2.11.2.13. Элементы управления на рабочем листе
Выше было указано, что элементы управления можно размещать в
пользовательских формах и непосредственно на рабочем листе, создавая
тем самым дружественный пользователю интерфейс. Панель инструмен-
тов Элементы управления отображается на рабочем листе Excel коман-
дой Вид | Панели инструментов | Элементы управления (рис. 36):

Рис. 32. Элементы управления на рабочем листе


Кроме панели инструментов Элементы управления в Excel имеется
похожая на неё панель Формы, набор кнопок которой практически такой
же, как на панели Элементы управления (рис. 37).
74

Рис. 33. Панель Формы


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

Рис. 34 а. Примеры элементов управления панели Формы

Рис. 34 б. Примеры элементов управления


панели Элементы управления
Следует отметить, что задание свойств элементам управления обеих
панелей различаются, т.к. панель инструментов Формы унаследована от
устаревшей версии MS Ecsel 5.0 и используется преимущественно со-
вместимости приложений, созданных в старых версиях.
Размещение элементов управления производится в режиме конст-
руктора, для перехода в который нужно нажать кнопку Режим конструк-
тора панели инструментов Элементы управления.
Как было показано выше, элементы управления являются объектами,
и как любые другие объекты обладают свойствами, методами и события-
ми. Значения свойств элементов управления устанавливаются как в коде,
так и так и на этапе их конструирования. Для установки значений свойств
на этапе конструирования нужно выбрать элемент управления и нажать
кнопку Свойства панели инструментов Элементы управления. На эк-
ране отобразится окно Properties (рис. 39).
75

Рис. 35. Окно Properties


Код процедуры, обрабатывающий события, связанные с элементом
управления, расположенном на рабочем листе (Лист1, Лист2 и т.д.), наби-
рается в модуле этого рабочего листа (Лист1(Лист1), Лист2 (Лист2), и т.д.),
на котором расположен элемент управления. Для входа в этот модуль
нужно выбрать элемент управления и нажать кнопку Исходный текст
панели инструментов Элементы управления.
По окончании конструирования элемента управления необходимо
выйти из режима конструирования, нажав кнопку Режим конструктора.
Properties
В качестве примера рассмотрим проектирование на рабочем листе
элемента управления Кнопка. Последовательность действий следующая.
1. Нажать кнопку Режим конструктора панели инструментов Эле-
менты управления.
2. Нажать кнопку панели инструментов Элементы управления и на-
рисовать на рабочем листе кнопку , на поверхности
которой появится надпись CommandButton1. При создании второго
элемента управления Кнопка на её поверхности появится надпись
CommandButton2 и т.д.
3. Щёлкнуть по созданной кнопке правой кнопкой мыши и в появив-
шемся диалоговом окне выбрать пункт Свойства панели инстру-
ментов Элементы управления. На экране появится окно Properties.
Установить в этом окне значение свойства Name равным КнПривет, а
свойства Caption равным ПРИВЕТСТВИЕ.
4. Выбрать созданную кнопку и щёлкнуть по кнопке Исходный текст
панели инструментов Элементы управления. В результате про-
изойдёт переход в редактор VBA и автоматически создана первая и
последняя инструкция обработки события Click кнопки, возникающего
при её нажатии (щелчке):
Private Sub CmdПривет_Click()
End Sub
5. Добавить в процедуру обработки события Click функцию MsgBox, ко-
торая отобразит на экране диалоговое окно с приветствием (рис. 40):
76

Private Sub CmdПривет_Click()


MsgBox "Желаем вам успехов" & Chr(13) + Chr(10) & _
"в изучении VBA!", vbExclamation
End Sub

Рис. 36. Результат выполнения процедуры CmdПривет_Click

В этой процедуре выражение Chr(13) + Chr(10) вызывает возврат ка-


ретки и перевод строки. Вместо него можно использовать смешанную кон-
станту vbCrLf.
Такой же самый результат можно получить, используя элемент Кноп-
ка панели элементов Формы (рис. 37). В этом случае последовательность
действий следующая.
1. Выполнить команду Вид | Панели инструментов | Формы.
2. Нажать кнопку панели инструментов Формы и нарисовать на ра-
бочем листе кнопку, на поверхности которой появится надпись Кноп-
ка1. При создании второго элемента управления Кнопка на её по-
верхности появится надпись Кнопка2 и т.д.
3. Щёлкнуть по созданной кнопке правой кнопкой мыши и в появив-
шемся диалоговом окне выбрать пункт Изменить текст и ввести
слово ПРИВЕТСТВИЕ, щёлкнуть правой кнопкой мыши и появив-
шемся диалоговом окне выбрать пункт Завершить изменение тек-
ста.
4. Щёлкнуть мышью по любой ячейке рабочего листа вне области кнопки.
5. Вставить в стандартный модуль Module1 следующую процедуру:
Sub ПРИВЕТ ()
MsgBox "Желаем вам успехов" & Chr(13) + Chr(10) & _
"в изучении VBA!", vbExclamation
End Sub
6. Щёлкнуть правой кнопкой мыши по элементу Кнопка ПРИВЕТ на ра-
бочем листе и в появившемся меню выбрать пункт Назначить мак-
рос…
7. В диалоговом окне “Назначить макрос объекту” выбрать макрос
ПРИВЕТ.
Если щёлкнуть теперь по кнопке ПРИВЕТ, то на экран будет выведено
диалоговое окно с текстом "Желаем вам успехов в изучении VBA!".
77
2.12. Инструкции VBA

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


Оператор присваивания – это инструкция VBA , выполняющая ма-
тематическое вычисление и присваивающая результат переменной или
объекту.
Формат оператора:
[Let] имя переменной или свойства = выражение
Элемент Let необязателен. Он унаследован от ранних версий Visual
Basic.
Выражение определяется как комбинация ключевых слов, операто-
ров, переменных и констант. Эта комбинация возвращает в результате
строку, число или объект. Выражение может осуществлять вычисление,
обрабатывать символы или тестировать данные, присваивать значение
переменной и ячейке рабочего листа или использоваться как значение
свойства.
В VBA оператором присваивания выступает знак равенства (=).
Примеры
х=1
x=x+1
х = (у * 2) / (г * 2)
Cells(1, 2).Value = "План выпуска"
FileOpen = True
FileOpen = Not FileOpen
Range ("The Year").Value = 2009
Зачастую в выражениях применяются функции. Это могут быть
встроенные функции VBA, функции рабочих листов Excel или специальные
функции, разработанные в VBA. Операции, выполняемые оператором
присваивания, приведены в п.2.6.
2.12.2. Инструкция Set
Инструкция Set присваивает ссылку на объект переменной или свой-
ству объекта. При этом переменной присваивается значение объектного
выражения или значение, возвращаемое объектной функцией.
Формат инструкции Set:
Set объектная переменная = [ New] объектное выражение | Nothing
− объектная_переменная – имя переменной или свойство,
− New – необязательеый; задает создание нового экземпляра класса,
− Объектное выражение – выражение, состоящее из имени объекта,
переменной соответсвующего объектного типа, функции или метода,
− Nothing – разрывает связь элемента объектная переменная с ка-
ким-либо определенным объектом.
Пример
Set Диапазон = Range(“A1:А10”)
– переменной Диапазон присваивается диапазон A1:А10.
78
2.12.3. Циклы
Циклы предназначены для многократного выполнения группы инст-
рукций. ВVBA для организации циклов используются инструкции For...
Next, White…Wend, Do …Loop и For Each…Next.

2.12.3.1. Инструкция For… Next


Эта инструкция повторяет выполнение группы инструкций указанное
число раз.
Формат инструкции For… Next
For Счетчик = Начало То Конец [Step Шаг]
[Инструкции1]
[Exit For]
[Инструкции2]
Next [Счётчик]
Формат инструкции For… Next содержит следующие элементы:

Элемент инструкции Описание элемента


Счетчик Обязательный. Числовая переменная, используемая в каче-
стве счётчика цикла
Начало Обязательный. Начальное значение для Счетчик
Конец Обязательный. Конечное значение для Счетчик
Шаг Необязательный. Шаг изменения значения Счетчик после
каждого цикла. По умолчанию используется значение 1
Инструкции Необязательный. Один или более операторов, выполняемых
определённое число раз

Пример1
В приведённой ниже процедуре TestFor подсчитывается сумма не-
чётных чисел в заданном диапазоне, причём числа формируются в цикле с
нарастанием на 1.
Option Explicit_________________________________________________
Sub TestFor()
'Подсчёт суммы нечётных чисел в заданном диапазоне
Dim i As Integer
Dim n As Integer
Dim Sum As Integer
Dim r As Integer
n = InputBox("Ведите количество чисел", "Количество нечётных чисел")
r=0
For i = 1 To n Step 2 '(сумма нечётных чисел от 1 до n)
Sum = Sum + i
r=r+1
79

Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне от 1 до " &
n & _" равна " & Sum, Buttons:=vbExclamation, _
Title:="Количество нечётных чисел"
End Sub
Ниже приведены диалоговые окна, появляющиеся при выполнении мак-
роса TestFor.

Пример2
В приведённой ниже процедуре TestFor1 подсчитывается сумма нечётных
чисел в диапазоне A1:J10 таблицы Excel.

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


цикла i и вложенный цикл с параметром цикла j.
Option Explicit_________________________________________________
Sub TestFor1()
'Подсчёт суммы нечётных чисел в заданном диапазоне
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim n As Integer
Dim Sum As Integer
Dim r As Integer
n = InputBox("Ведите количество чисел в столбце", _
"Количество нечётных чисел")
m = InputBox("Ведите количество чисел в строке", _
"Количество нечётных чисел")
r=0
For i = 1 To n Step 2 '(сумма нечётных чисел от 1 до n)
80

For j = 1 To m Step 1
Sum = Sum + Cells(i, j)
r=r+1
Next j
Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне" _
& Chr(13) + Chr(10) _
& " от 1 до " & n * m & " равна " & Sum, Buttons:=vbExclamation
End Sub
В процедуре TestFor2 реализован алгоритм ввода данных с клавиа-
туры в ячейки рабочего листа; заполнение производится последовательно
столбец за столбцом двумя циклами.
Sub TestFor2()
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim n As Integer
m = InputBox("Ведите количество чисел в столбце", _
"Количество нечётных чисел")
n = InputBox("Ведите количество чисел в строке", _
"Количество нечётных чисел")
For i = 1 To n Step 1 '(сумма нечётных чисел от 1 до n)
For j = 1 To m Step 1
Cells(j, i) = InputBox("Ведите значение в ячейку " & Chr(64 + i) & j, _
"Ввод данных в таблицу")
Next j
Next i
End Sub
В процедуре TestFor2 функция Chr(64 + i) возвращает (выдаёт значе-
ние) строку, содержащую символ, код которого указан в качестве аргумен-
та. Код 65 соответствует латинской букве A, 66 – букве B и т.д. Ниже пока-
зано диалоговое окно, соответствующее функции InputBox во вложенном
цикле цикле процедуры TestFor2.

2.12.3.2. Инструкция While…Wend


Инструкция While…Wend выполняет некоторую последовательность
инструкций до тех пор, пока заданное условие имеет значение True (Истина).
Формат инструкции While…Wend
81

While Условие
[Инструкции]
Wend
Формат инструкции While…Wend содержит следующие элементы:
Элемент инструкции Описание элемента
Условие Обязательный. Числовое или строковое выражение, резуль-
татом вычисления которого являются значения True или
False
Инструкции Необязательный. Одна или более инструкций, выполняе-
мых, если условие равно значению True

Если Условие имеет значение True, то выполняется весь набор ин-


струкций, расположенных до инструкции Wend. После этого управление
возвращается инструкции While и опять проверяется условие. Если Ус-
ловие имеет значение True, то снова выполняются все инструкции до
Wend, В противном случае выполнение программы передается на ин-
струкцию, следующую за инструкцией Wend.
Циклы While...Wend могут иметь любую глубину вложенности. При
этом каждая инструкция Wend соответствует предшествующей инструк-
ции While.
Пример
Подсчёт суммы четных чисел от 0 до 10.
Sub TWW()
Dim k As Integer
Dim i As Integer
While k < 10
k=k+i
i=i+2
Wend
MsgBox "i=" & i & " k=" & k
End Sub
Ниже приведён результат выполнения процедуры TWW.

2.12.3.3. Инструкция Do... Loop


Для выполнения инструкциb For необходимо задать параметры.
Эти параметры могут вычисляться или задаваться во время выполнения
программы, как в последней процедуре, которые точно определяют,
сколько раз должен выполняться инструкция цикла. Иногда это свойство
82

инструкции For является ограничительным, и в этом случае VBA предла-


гает другую инструкцию – Do... Loop, которая также может организовать
повторяющиеся вычисления, но момент прекращения вычислений здесь
определяется с помощью логических условий.
Существует два типа инструкции Do: Do While и Do Until. Первый из
них повторяет выполнение блока инструкции до тех пор, пока заданное
логическое условие истинно. Второй инструкция, Do Until, выполняет
циклические вычисления до тех пор, пока изначально ложное логическое
условие не станет истинным. Формат этих инструкций следующий:
Формат1
Do [{While | Until} условие]
[инструкции]
[Exit Do]
[инструкции]
Loop
Формат2
Do
[инструкции]
[Exit Do]
[инструкции]
Loop [{While | Until} условие]
Формат инструкции Do … Loop содержит следующие элементы:
Элемент инструкции Описание элемента
Условие Необязательный. Численное или строковое выражение,
имеющее значение True или False
Инструкции Одна или более инструкций, которые повторяются, если ус-
ловие равно значению True, или до тех пор, пока оно не
станет равным True
В теле инструкции (цикла) может быть любое количество инструкций
Exit Do, которые являются дополнительными средствами для окончания
цикла (выхода из инструкции Do … Loop). Инструкция Exit Do часто ис-
пользуется внутри Do … Loop с применением инструкции If…Then , кото-
рый проверяет некоторое дополнительное условие для выхода из цикла.
Различие между этими двумя форматами состоит в следующем. В
соответствии с форматом 1 логическое условие помещается в начало цик-
ла. В этом случае, если логическое условие не выполняется, то инструк-
ции цикла не выполняются ни разу. Во втором формате логическое усло-
вие помещено в конце цикла. Поэтому инструкции цикла в любом случае
будут выполнены хотя бы один раз. Инструкция Exit Do используется для
экстренного выхода из цикла; обычно для этого применяются условные
инструкции If и Select Case.
Пример
В процедуре DWU пользователю предлагается ввести свое имя или
выйти из программы. Здесь значение vbYesNo функции MsgBox при-
сваивается переменной iResponse, которое анализируется инструкцией
83

If…Then…Else, и в случае равенства его внутренней константе vbYes


(нажата кнопка Ok в диалоговом окне функции MsgBox) и переменная
sName имеет пустое значение, выдаётся сообщение "Вы не ввели имя",
и происходит выход из процедуры по инструкции Exit Sub. (Инструкция
If…Then…Else будет рассмотрена позже). Если же имя введено (даже
пробел!), то произойдёт выход из цикла по условию sName <> "", и вы-
водится диалоговое окно с введённым именем.
Sub DWU()
Dim sName As String
Dim iResponse As Integer
sName = ""
Do While sName = ""
sName = InputBox("Введите свое имя: ")
If sName = "" Then
iResponse = MsgBox("Вы хотите выйти из программы?", vbYesNo)
If iResponse = vbYes Then
MsgBox "Вы не ввели имя "
Exit Sub
End If
End If
Loop
MsgBox "Вы ввели имя " & sName
End Sub
При запуске процедуры DWU выводится окно,

и если имя введено, то выводится окно с сообщением введённого имени.

Если же имя не введено и нажата кнопка OK или Cancel, то выводится


диалоговое окно
84

и при нажатии кнопки “Да” выводится диалоговое окно

В отличие от цикла Do While цикл Do Until выполняется до тех пор,


пока выражение условия имеет значение False.
Пример
Sub DUN()
Dim j As Integer
Range("K1") = 0
j=0
Do Until Range("K1") > 8
Range("K1") = Range("K1") + j
j=j+1
Loop
End SubTextBox1.Text = Sum
В результате выполнения этого примера в ячейке K1 активного листа бу-
дет выведено вычисленное значение, равное 10.
2.12.3.4. Инструкция For Each…Next
Инструкция For Each применяется для выполнения одного и того же
набора операторов для элемента массива или коллекции. Инструкция For
Each имеет следующий формат:
For Each элемент In группа
[Инструкции]
[Exit For]
[Инструкции]
Next
Формат инструкции Do … Loop содержит следующие элементы:
Элемент инструкции Описание элемента
Элемент Обязательный. Переменная, используемая для итерации по
элементам коллекции или массива. Может быть только
Variant-переменной.
Группа Обязательный. Имя коллекции объектов или массива.
Инструкции Необязательный. Один или более операторов, которые вы-
полняются для каждого элемента в Группа
Блок For Each… выполняется, если в Группа имеется, по крайней
мере, один элемент. Все инструкции цикла выполняются для каждого эле-
мента Группа. После этого управление передаётся инструкции, следую-
щей за ключевым словом Next.
85

Цикл For Each...Next похож на For...Next за исключением того, что он


повторно выполняет одну и ту же группу операторов для каждого элемента
набора объектов или массива. Это особенно полезно в том случае, когда
не известно число элементов в наборе или когда их количество может из-
мениться, пока работает процедура.
В приведённой ниже процедуре ForEach используется динамический
массив Мас, размерность которого L определяется как целая часть произ-
ведения значения случайной функции Rnd в инструкции ReDim. Опреде-
ление целой части производится при помощи встроенной функции VBA
Int. Если количество элементов массива равно 0, то об этом выдаётся со-
общение и происходит выход из процедуры.
По инструкции For i = 1 To L производится присвоение значений эле-
ментам массива Мас случайными числами и вывод их на экран.
По инструкции For Each… осуществляется присвоение значений
ячейкам A1:AL ячейкам активного рабочего листа A1: AL случайных чисел.

Option Base 1
Option Explicit
––––––––––––––––––––––––––––––––––––––––––––––––––––––
Sub ForEach()
Dim Мас() As Single
Dim L As Integer, i As Integer, k As Integer
Dim n As Variant
L = Int(Rnd * 10)
If L = 0 Then
MsgBox "Количество элементов массива равно " & L
Exit Sub
End If
MsgBox "Количество элементов массива равно " & L
ReDim Мас(L) ' Устанавливается размер динамического массива
For i = 1 To L
Мас(i) = Rnd
MsgBox "Мас(" & i & ")=" & Мас(i)
Next i
k=0
For Each n In Мас
k=k+1
Cells(1, k) = n
Next n
End Sub
В процедуре РабочиеЛисты, приведенной ниже, применена конст-
рукция For Each - Next коллекции Sheets активной рабочей книги.
Sub РабочиеЛисты()
Dim ЛИСТ As Worksheet
Dim s As String
86

s=" "
For Each ЛИСТ In ActiveWorkbook.Worksheets
s = s & " " & Item.Name
Next ЛИСТ
MsgBox "Рабочие Листы:" & vbCrLf & s
End Sub
При выполнении этой процедуры функция MsgBox отображает строку, со-
стоящую из свойств Name (Имя листа) каждого рабочего листа:

2.12.4. Инструкции перехода


Инструкции перехода часто используются в языках программирова-
ния. В них проверяется соответствие каким-то условиям и в зависимости
от этого выполнение программы направляется по одной или другой ветви,
или осуществляется безусловный переход в определённое место про-
граммы. В VBA предусмотрено две инструкции условного перехода:
If… Then... Else
Select Case
и инструкция безусловного перехода GoTo. К этой группе инструкций так-
же относятся:
− инструкции On Error GoTo метка, On Error Resume Next и On Er-
ror GoTo 0, служащие для перехода к обработчику ошибок;
− инструкция Resume, возобновляющая выполнение процедуры по-
сле того, как заканчивает работу процедура обработки ошибок;
− инструкция GoSub…Return, которая передаёт и возвращает
управление выполнением процедуры подпрограмме внутри проце-
дуры;
− инструкции On…GoSub и On…GoTo, предназначенные для пере-
дачи управления выполнением программы на одну из нескольких
определённых строк программы в зависимости от значения неко-
торого параметра;
− инструкции Exit Do, Exit For, Exit Function и Exit Sub, используе-
мые для прерывания выполнения блока Do…Loop, For…Next,
Function и Sub.

2.12.4.1. Инструкция условного перехода If…Then…Else


Инструкция If...Then...Else задает выполнение определенных групп
инструкций в зависимости от значения выражения. Она может иметь од-
нострочный и два блоковых формата.
87

Однострочный формат:
If условие Then инструкции
Первый блоковый формат:
If условие Then [инструкции] [Else инструкции]
[Else
[инструкции_Else]]
End If
Второй блоковый формат:
If условие Then
[инструкции]
[ElseIf условие Then
[инструкции_elseIf]]…
[Else
[инструкции_else]]
End If
При этом ElseIf …Тhen может повторяться несколько раз.
В основу этой инструкции положен следующий принцип: если условие вы-
полняется, то выполняются инструкция, находящиеся после Then.
Формат инструкции If...Then...Else содержит следующие элементы:
Элемент инструкции Описание элемента
Условие Обязательный. Одно или более выражений следующих двух
типов: численное или строковое выражение, которое приво-
дится к значениям True или False.
Инструкции Необязательный в блочной форме, но обязательный в од-
нострочной форме, которая не имеет ветви Else. Один или
несколько операторов; выполняются, если Условие имеет
значение True.
Однострочная форма допускает выполнение нескольких инструкций в ре-
зультате проверки одного условия If…Then. При этом все инструкции долж-
ны находиться на одной строке и разделяться двоеточием, как показано в
приведенном ниже примере:
Sub IfThenElse ()
Dim a As Single
Dim b As Single
Dim c As Single
a = Range("A1").Value
b = Range("A2").Value
If b = 0 Then MsgBox "Деление невозможно!" Else c = a / b: MsgBox "c=" & c
End Sub

Пример блоковой формы:


Sub IfThenElse1 ()
Dim a As Single
88

Dim b As Single
Dim c As Single
a = Range("A1").Value
b = Range("A2").Value
If b=0 Then
MsgBox "Деление на ноль невозможно!"
Else
c=a/b
MsgBox "c=" & c
End If
End Sub
Инструкция If…Then... Else применяется в следующих случаях:
1. Нужно проверить на соответствие одному или нескольким ус-
ловиям и в случае соответствия сделать какое-то действие:
Option Compare Text
––––––––––––––––––––––––––––––––––––––––––––––––––
Sub IfThenElse2()
Dim КурсРаб As String
If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then
MsgBox "Небходимо защитить курсовую работу "
End If
End Sub
2. Нужно проверить на соответствие одному или нескольким ус-
ловиям и в случае соответствия сделать какое-то действие, а в
случае несоответствия выполнить другое действие:
Sub IfThenElse3()
Dim КурсРаб As String
If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then
MsgBox "Необходимо защитить курсовую работу"
Else
MsgBox "К экзамену по информатике допущен"
End If
End Sub
Примечание
На уровне стандартного модуля, в котором находится процедура
IfThenElse2, помещена инструкция Option Compare Text. Инструкция Option
Compare применяется на уровне модуля перед первой процедурой модуля
для задания используемого по умолчанию способа сравнения строковых
данных.
Формат инструкции:
Option Compare Binary | Text | Database
Инструкция Option Compare указывает способ сравнения строк Bi-
nary, Text или Database для модуля. Если модуль не содержит инструк-
89

цию Option Compare, то по умолчанию используется способ сравнения


Binary. Инструкция Option Compare Binary задает сравнение строк на ос-
нове порядка сортировки, определяемого внутренним двоичным пред-
ставлением символов. В Microsoft Windows порядок сортировки опреде-
ляется кодовой страницей символов. В следующем примере представлен
типичный результат двоичного порядка сортировки:
A<B<E<Z<a<b<e<z<Б<Л<Ш<б<л<ш
Инструкция Option Compare Text задает сравнение строк без учета
регистра символов на основе системной национальной настройки. Тем же
символам, что и выше, при сортировке с инструкцией Option Compare
Text соответствует следующий порядок:
(A=a) < (B=b) < (E=e) < (Z=z) < (Б=б) < (Л=л) < (Ш=ш)
Инструкция Option Compare Database может использоваться только
в Microsoft Access.
Пример
В данном примере инструкция Option Compare используется для за-
дания метода сравнения строковых данных, используемого по умолчанию.
Option compare Binary ' т.е. "AAA" < "aaa"
' Устанавливает метод сравнения строковых данных Binary.
Option compare Text ' т. е. "AAA" = "aaa".
' Устанавливает метод сравнения строковых данных Text.
Для Option Compare Text буквы верхнего регистра эквивалентны буквам
нижнего регистра, например, тексты Отлично и отлично не различаются.
Option Compare Database можно использовать только в MS Access.
3. В случае, если первая проверка вернула False, нужно прове-
рить на соответствие еще нескольким условиям (в этом случае
удобно использовать ElseIf).
Sub IfThenElse4()
If Range("a6").Value >= 0.84 Then
MsgBox "Ваша оценка """ & "Отлично" & """"
ElseIf Range("A6") < 0.84 And Range("A6") >= 0.67 Then
MsgBox " Ваша оценка """ & "Хорошо" & """"
ElseIf Range("A6") < 0.67 And Range("A6") > 0.5 Then
MsgBox " Ваша оценка """ & "Удовлетворительно" & """"
Else
MsgBox " Ваша оценка """ & "Неудовлетворительно" & """"
End If
End Sub
Некоторые замечания по использованию If…Then... Else:
− ключевое слово Then должно находиться в одной строке с If и ус-
ловием. Если вы перенесете его на следующую строку, будет вы-
дано сообщение об ошибке;
− если разместить команду, которую нужно выполнить при истинно-
сти проверяемого условия на одной строке с If и Then, то End If
можно не писать:
90

− если используется несколько команд или конструкции Else|ElseIf,


то End If в конце нужно писать обязательно, иначе возникнет син-
таксическая ошибка.
− для выражения If…Then рекомендуется использовать отступы для
выделения блоков команд, иначе трудно будет читать код.
− операторы If…Then можно вкладывать друг в друга:
If R = 5 Then
MsgBox “Отлично”
If R = 4 Then
MsgBox “Хорошо”
End If
End If
2.12.4.2. Инструкция Select…Case
Инструкция If…Then... Else может содержать большое количество
выражений ElseIf и поэтому бывает трудной для проектирования и вос-
приятия. В подобных случаях альтернативой этой инструкции может быть
инструкция Select Case, которая легче для восприятия и лучше приспо-
соблена для работы в ситуациях со многими выходами. Инструкция Select
Case выполняет одну из нескольких групп инструкций в зависимости от
значения некоторого выражения. Она имеет следующий формат:
Select Case выражение
[Case список_выражений-n
[инструкции-n]] ...
[Case Else
[инструкции_еlsе]]
End Select
Формат инструкции Select Case содержит следующие элементы:
Элемент инструкции Описание элемента
Выражение Обязательный. Любое числовое или строковое выражение
Список_выражений-n Обязателен в случае использования Case. Список (сраздели-
телями) из одной или более следующих форм:
выражение
выражение To выражение
Is оператор_сравнения выражение
Ключевое слово To определяет диапазон значений, в котором
меньшее значение должно быть перед ключевым словом To.
Ключевое слово Is следует использовать с операторами
сравнения для указания диапазона значений. Если этот аргу-
мент не используется, автоматически подставляется ключе-
вое слово Is.
Инструкции-n Необязательный. Одна или более инструкций, выполняемых,
если выражение совпадает с любым значением из Спи-
сок_выражений-n.
Инструкции_еlsе Необязательный. Одна или более инструкций, выполняемых,
если Выражение не совпадает ни с каким Case-
предложением список_выражений-n
91

Если выражение совпадает с любым из Case-выражений спи-


сок_выражений-n, выполняются инструкции инструкции-n, следующие за
этим Case-предложением (до следующего Case-предложения или по-
следнего Case-предложения – до End Select). Управление выполнением
программы передаётся инструкции, следующей за предложением End
Select. Если выражение совпадает с список_выражений-n в нескольких
Case-предложениях, выполняются инструкции, соответствующие перво-
му совпадению. Предложение Case Else используется для указания
группы инструкций инструкции_еlsе, которые следует выполнять, если
ни в одном Case-предложении не нашлось совпадений. Конструкция
Select Case допускает вложения. Инструкцию Case Else целесообразно
использовать при выборе между тремя и более вариантами.
Приведённая ниже процедура CaseSelect позволяет решить ту же
задачу, которую решает процедура IfThenElse4.
Sub CaseSelect()
Select Case Range ("A6")
Case Is >= 0.84
MsgBox "Ваша оценка """ & "Отлично" & """"
Case 0.68 To 0.83
MsgBox " Ваша оценка """ & "Хорошо" & """"
Case Is > 0.5
MsgBox " Ваша оценка """ & "Удовлетворительно" & """"
Case Else
MsgBox " Ваша оценка """ & "Неудовлетворительно" & """"
End Select
End Sub
2.12.4.3. Инструкция безусловного перехода GoTo
Инструкция GoTo изменяет ход выполнения программы без провер-
ки каких-либо условий, передавая управление на метку в коде. Формат ин-
струкции GoTo:
GoTo метка
Обязательный аргумент метка может быть текстовым или числовым, при-
чём текстовая метка должна обязательно начинаться с буквенного сим-
вола. Метка заканчивается символом двоеточие (:).
В приведённой ниже процедуре БезУслПереход на экран выводится
число 10, если значение r = 1 и строка m20, в противном случае.
Sub БезУслПереход ()
Dim r
r = InputBox("Иллюстрация инструкции безусловного перехода")
If r = 1 Then GoTo 10 Else GoTo m20
10:
MsgBox 10
92

Exit Sub
m20:
MsgBox "m20"
End Sub
Использование GoTo удобно в очень редких случаях, например, ко-
гда нам нужно добиваться от пользователя ввода правильного значения
неизвестное число раз. Однако использование GoTo считается признаком
плохого тона и категорически не рекомендуется, потому что код становит-
ся трудночитаемым. Инструкцию GoTo можно заменить инструкцией орга-
низации циклов, используя инструкцию If или Select Case, как это сделано
в приведённой ниже процедуре УслОператор, реализующий тот же алго-
ритм, что и процедура БезУслПереход:
Sub УслОператор()
Dim r
r = InputBox("Иллюстрация инструкции условного перехода")
If r = 1 Then MsgBox 10 Else MsgBox "m20"
End Sub
2.12.4.4. Инструкции перехода к обработчику ошибок On Error
Инструкция On Error делает доступным обработчик ошибок и опре-
деляет его положение внутри процедуры и используется также для запре-
та обработки ошибок. Она имеет следующий формат:
On Error GoTo строка
On Error Resume Next
On Error GoTo 0
Инструкция On Error имеет следующие формы:
On Error GoTo стро- Делает доступным обработчик ошибок, который начинается
ка со строки, определённой аргументом строка. Этот аргумент
может быть числом или буквенно-числовым. При возникно-
вении ошибки управление выполнением программы переда-
ётся на строку кода с меткой строка. Таким образом проис-
ходит активизация обработчика ошибок. Метка строка долж-
на находиться в той же процедуре, что и инструкция On
Error.
On Error Resume Указывает на то, что при возникновении ошибки управление
Next выполнением программы передаётся на инструкцию, сле-
дующую непосредственно за тем, в котором произошла
ошибка. Эта инструкция позволяет продолжить выполнение
программы, несмотря на возникновение ошибки времени вы-
полнения (run-time).
On Error Goto 0 Отключает пользовательский обработчик ошибок в данной
процедуре. Эта инструкция не указывает метку 0 в качестве
начала обработчика ошибки, даже если в процедуре дейст-
вительно имеется такая метка.
Пользовательские обработчики ошибок позволяют реагировать на
ошибки во время работы пользователя, например, когда вместо числа
пользователь вводит текстовое данное или вообще не вводит данное.
93

В приведённой ниже процедуре ПримерOnErrorGoto возникает ошиб-


ка ввода до тех пор, пока не будет введено число, управление передаётся
на метку Ошибка, и инструкция Resume возвращает управление инструк-
ции Num = InputBox("Введите число").
Sub ПримерOnErrorGoto()
Dim Num As Single
On Error GoTo Ошибка
Num = InputBox("Введите число")
MsgBox "Введено число " & Num
Exit Sub
Ошибка:
MsgBox "Число не введено "
Resume
End Sub
В процедуре ПримерOnErrorResumeNext при возникновении ошибки
ввода управление передаётся инструкции If, и на экран выводится сооб-
щение "Число не введено".
Sub ПримерOnErrorResumeNext()
Dim Num As Single
On Error Resume Next
Num = InputBox("Введите число,не равное 0")
If Num <> 0 Then
MsgBox "Введено число " & Num
Else
MsgBox "Число не введено"
End If
On Error GoTo 0
End Sub
В приведённой ниже процедуре ПримерOnErrorGoto_0 инструкция
On Error GoTo 0 отключает пользовательский обработчик ошибок в данной
процедуре и может быть использована для восстановления нормальной
обработки ошибок перед выходом из процедуры.

Sub ПримерOnErrorGoto_0()
Dim Num As Single
On Error GoTo 0
Num = InputBox("Введите число")
MsgBox "Введено число " & Num
Resume
End Sub
При возникновении ошибки ввода выводится следующее диалоговое окно,
сообщающее о несоответствии типа данного введённому значению (“Пус-
то” или “Не число”).
94

2.12.4.5. Инструкции прерывания выполнения блока Exit


Имеются следующие варианты инструкции Exit:
− Инструкция Exit Do позволяет выйти из цикла Do…Loop.
− Инструкция Exit For позволяет выйти из цикла For…Next или
For Each…Next.
− Инструкция Exit Function позволяет выйти из функции, в кото-
рой имеется данная инструкция.
− Инструкция Exit Sub позволяет выйти из процедуры Sub, в ко-
торой имеется данная инструкция.
Пример
Приведённая ниже процедура ПримерExit использует инструкцию Exit
для выхода из циклов For...Next и Do...Loop и процедуры Sub. Символ
двоеточие используется для разделения инструкций в одной строке кода.
Sub ПримерExit ()
Dim I, MyNum
Do ' Устанавливается бесконечный цикл.
For I = 1 To 5 ' Цикл повторяется 5 раз.
MyNum = Int(Rnd * 10) ' Генерируется случайное число.
Select Case MyNum ' Определяется значение случайного числа.
Case 3: MsgBox "Case 3": Exit For ' Если 3, то выход из For...Next.
Case 2: MsgBox "Case 2": Exit Do ' Если 2, то выход из Do...Loop.
Case 5: MsgBox "Case 5": Exit Sub ' Если 5, то выход из процедуры.
End Select
Next I
Loop
End Sub
2.12.4.6. Инструкция передачи управления выполнением проце-
дуры подпрограмме внутри процедуры GoSub… Return
Инструкция имеет следующий формат:
GoSub метка
[инструкции или процедура]
метка
[инструкции подпрограммы]
Return
95

Инструкции GoSub и Return можно использовать в любом месте


процедуры, но GoSub и соответствующая ему инструкция Return должны
быть в одной и той же инструкции. Подпрограмма может иметь более од-
ной инструкции Return.
Пример
В приводимой ниже процедуре ПримерGosub вводится с клавиатуры
число и выполняется подпрограмма, имеющая метку Ппр1, если число по-
ложительное, или подпрограмма, имеющая метку Ппр2, если число отри-
цательное. Процедура завершается выполнением инструкции
If Num > 0 Then MsgBox " Результат деления = " & Num.
Sub ПримерGosub()
Dim Num As Single
Num = InputBox("Введите положительное число")
If Num > 0 Then
GoSub Ппр1
' Подпрограмма Ппр1 выполняется,
' если пользователь вводит положительное число.
Else
GoSub Ппр2
End If
If Num > 0 Then MsgBox "Результат деления = " & Num
Exit Sub
Ппр1:
Num = Num / 2
Return 'Возврат из подпрограммы Ппр1
'в управление выполнением процедуры ПримерGosub.
Ппр2:
MsgBox "Введено отрицательное число " & Num
Return
End Sub

2.12.4.7. Инструкция передачи управления выполнением проце-


дуры на одну из нескольких строк кода On…GoSub и
On…GoTo
Инструкции On…GoSub и On…GoTo предназначены для передачи
управления выполнением программы на одну из нескольких определённых
строк программы в зависимости от значения некоторого параметра. Эти
инструкции имеют следующий формат:
On выражение GoSub список_назначений
On выражение GoTo список _назначений
Формат инструкций On…GoSub и On…GoTo содержит следующие
элементы:
96

Элемент инструкции Описание элемента


Выражение Обязательный. Любое числовое выражение, которое имеет
целое значение от 0 до 255 включительно. Если выражение
является нецелым числовым выражением, оно округляется до
его оценки
Список_назначений Обязательный. Список номеров строк или меток строк, разде-
ляемых запятыми
Замечания
Значение элемента выражение определяет, к какой строке из элемента
список_назначений выполняется переход. Если значение выражения
меньше 1 или превышает число элементов списка, происходит одно из
следующих событий:

Если выражение то
Равняется 0 Управление передается инструкции, следующей за
On...GoSub или On...GoTo
Превышает число Управление передается инструкции, следующей за
элементов списка On...GoSub или On...GoTo
Отрицательное Возникает ошибка
Больше 255 Возникает ошибка
В одном списке допускается совместное использование номеров и
меток строк. Не существует практического ограничения на число меток и
номеров строк, используемых с инструкциями On...GoSub... и On...GoTo.
Однако при использовании большего число меток или номеров, чем может
уместиться на одной строке, необходимо применять символ продолжения
строки для распространения логической строки на несколько физических
строк. Инструкция Select Case обеспечивает более структурированный и
гибкий способ выполнения множественных ветвлений.
Пример
В данном примере инструкции On...GoSub и On...GoTo используются
для перехода к подпрограммам и строкам с указанными метками.
Sub OnGosubGoto()
Dim №_стр, Строка, n
Ввод:
№_стр = InputBox("Введите номер метки/строки")
If №_стр = "" Then GoTo Ввод
On №_стр GoSub М1, М2 ' Управление возвращается сюда
' после выполнения On...GoSub
On №_стр GoTo 1, 2 ' Управление не возвращается сюда
' после выполнения On...GoTo.
Exit Sub
М1:
MsgBox "Выполнен переход на метку М1": Return
М2:
MsgBox "Выполнен переход на метку М2": Return
97

1:
MsgBox "Выполнен переход на строку 1"
2:
MsgBox "Выполнен переход на строку 2"
End Sub
2.13. Функции VBA
Функция – это подпрограмма, которая выполняет действия и воз-
вращает единственное значение. В VBA различают следующие виды
функций:
− встроенные функции,
− функции, определённые пользователем.
2.13.1. Встроенные функции
Ниже представлены таблицы с кратким описанием наиболее часто
используемых функций VBA.
2.13.1.1. Математические функции
N означает любое численное выражение. Все аргументы функций
являются обязательными, если не указано иначе.

Функция(аргумент) Действие
Abs(N) Возвращает абсолютное значение аргумента N
Atn(N) Возвращает арктангенс N (радиан)
Cos(N) Возвращает косинус N (радиан)
Возвращает целую часть N. Не округляет число, а отбрасывает лю-
Fix(N) бую дробную часть. Если N отрицательное число, то возвращается
ближайшее отрицательное целое большее, чем или равное N
Возвращает случайное число: аргумент является необязательным.
Rnd(N) Используется только после инициализации генератора случайных
чисел (оператор Randomize)
Возвращает знак числа: -1, если N – отрицательное; 1, если N – по-
Sgn(N)
ложительное; 0, если N равно 0
Sin(N) Возвращает синус N (радиан)
Возвращает корень квадратный из N. Если N является отрицатель-
Sqr(N)
ным числом – возвращается ошибка времени исполнения
Tan(N) Возвращает тангенс N (радиан)

2.13.1.2. Функции преобразования данных

N – любое численное значение; S – любое строковое значение; E – выра-


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

Функция(аргумент) Действие
Возвращает строку из одного символа, соответствующего коду сим-
Chr(N) вола N, который должен быть числом между 0 и 255 (обратна пре-
дыдущей)
Возвращает строку, содержащую значение, представленное выра-
Format(E,S) жением Е, в формате в соответствии с инструкциями, содержащим-
ся в S
Возвращает целое типа Long, представляющее значение основных
RGB(N,N,N) цветов изображения. N для каждого аргумента должно быть целым и
лежать в пределах от 0 до 255
Str(N) Возвращает строку, эквивалентную численному выражению N
Возвращает численное значение, соответствующее числу, пред-
Val(S) ставленному строкой S, которая должна содержать только цифры и
одну десятичную точку, иначе возвращается 0
Возвращает значение типа Date. E может быть любым допустимым
CDate(E) выражением (строкой или числом), представляющим дату в диапа-
зоне 1/1/100 - 12/31/9999
Возвращает численное значение типа Integer. Е – любое допустимое
CInt(E) численное или строковое выражение, которое может быть преобра-
зовано в число
Возвращает численное значение типа String. Е – любое допустимое
CStr(E) численное или строковое выражение, которое может быть преобра-
зовано в число

2.13.1.3. Функции даты и времени


N – любое допустимое численное значение; D – любое допустимое выражение
типа Date (либо выражение, которое может быть преобразовано к типу Date).
Аргументы каждой функции являются обязательными, если не указано иначе.

Функция(аргумент) Действие
Date Возвращает системную дату
Time Возвращает системное время
Now Возвращает системные дату и время
Возвращает целое, являющееся частью выражения типа Date и со-
Year(D)
держащее год. Год возвращается как число между 100 и 9999
Возвращает целое, являющееся частью выражения типа Date и со-
Month(D)
держащее месяц. Месяц возвращается как число между 1 и 12
Возвращает целое, являющееся частью выражения типа Date и со-
Day(D)
держащее день. День возвращается как число между 1 и 31
Возвращает целое, содержащее часы как часть времени, содержа-
щегося в выражении типа Date. Часы возвращаются как число меж-
Hour(D)
ду 0 и 23. Если аргумент не содержит значения времени, то возвра-
щается 0
Возвращает целое, содержащее минуты как часть времени, содер-
жащегося в выражении типа Date. Минуты возвращаются как число
Minute(D)
между 0 и 59. Если аргумент не содержит значения времени, то воз-
вращается 0
Возвращает значение типа Date, эквивалентное дате, заданной ар-
DateValue(E) гументом Е, который может быть строкой, числом или константой,
представляющей время
Возвращает значение типа Date, содержащее время, заданное ар-
TimeValue(E) гументом Е, который может быть строкой, числом или константой,
представляющей время
99
2.13.1.4. Строковые функции

N – любое допустимое численное значение; S – любое допустимое строковое


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

Функция(аргумент) Действие
Возвращает положение S2 в S1. N1 – начальное положение для поис-
InStr(N1,S1,S2,N2) ка. N2 определяет, следует ли выполнять поиск с учетом регистра.
N1, N2 – необязательные аргументы
Возвращает строку (тип String), содержащую копию S со всеми сим-
Lcase(S) волами верхнего регистра, преобразованными в символы нижнего
регистра
Возвращает строку: копирует N символов из S, начиная с левого
Left(S,N)
крайнего символа S
Возвращает число символов в S, включая начальные и конечные про-
Len(S)
белы
Возвращает копию строки S после удаления символов пробела из ле-
Ltrim(S)
вой части строки (начальные пробелы)
Возвращает строку: копирует N2 символов из S, начиная с позиции
символа в S, заданной аргументом N1. N2 – необязательный аргу-
Mid(S,N1,N2)
мент, если он опущен, то возвращаются все символы в строке S от
позиции N1 до конца строки
Возвращает значение типа String: копирует N символов из S, начиная
Right(S,N)
с правого крайнего символа S
Возвращает копию строки S после удаления символов пробела из
Rtrim(S)
правой части строки (конечные пробелы)
Space(N) Возвращает строку пробелов длиной N символов
Сравнивает S1 с S2 и возвращает число, обозначающее результат
сравнения: -1, если S1<S2; 0 - S1=S2; 1 - S1>S2. N является необяза-
StrComp(S1,S2,N)
тельным аргументом и указывает следует ли выполнять сравнение с
учетом регистра
Возвращает строку, преобразованную в новую форму в зависимости
от числового кода, заданного аргументом N. VBA предоставляет внут-
ренние константы для использования с функцией StrConv. Наиболее
StrConv(S,N) полезными являются: vbProperCase (преобразует строку так, что каж-
дая буква, начинающая слово, становится заглавной), vbLowerCase
(преобразует строку в буквы нижнего регистра) и vbUpperCase (пре-
образует строку в буквы верхнего регистра)
Возвращает строку длиной N символов, состоящую из символа, за-
String(N,S)
данного первым символом в S
Возвращает копию строки S после удаления начальных и конечных
Trim(S)
символов пробела из этой строки
Возвращает S со всеми символами нижнего регистра, преобразован-
Ucase(S)
ными в символы верхнего регистра
100
2.13.1.5. Примеры использования функций VBA

2.13.1.5.1. Удаление ненужных символов


Зачастую строки в программе содержат ненужные символы пробелов
в конце или в начале строки, которые необходимо удалить, т.к. посторон-
ние начальные или конечные пробелы в строке могут вызвать "неполадки"
в работе программы. В VBA имеются три функции, предназначенные для
удаления начальных и конечных пробелов из строки: LTrim, RTrim, Trim.
Эти функции не изменяют исходную строку, а возвращают копию строки с
удаленными лишними пробелами.
Пример
Sub Встр_функции_1()
Dim Стр0, Стр1, Стр2, Стр3
Стр0 = " Строка "
Стр1 = RTrim(Стр0)
Стр2 = LTrim(Стр0)
Стр3 = Trim(Стр0)
MsgBox "(" & Стр1 & ")" & Chr(13) & _
"(" & Стр2 & ")" & Chr(13) & _
"(" & Стр3 & ")"
End Sub
При выполнении этой процедуры выводится диалоговое окно

2.13.1.5.2. Определение длины строки


Длину строки, как правило, надо знать при форматировании сообщений
для пользователя или при форматировании строковых данных, вводимых
процедурой в рабочий лист Excel или документ Word. VBA для этих целей
использует функцию Len. В приведенным ниже листинге между знаками
круглых скобок и словом присутствует по два пробела.
Пример
Sub Встр_функции_2()
Dim Стр0 As String, Стр1 As Byte
Стр0 = " Строка "
Стр1 = Len(Стр0)
MsgBox "Стр1=" & Стр1
End Sub
Строка фиксированной длины имеет всегда одну и ту же длину, и по-
этому функция Len всегда возвращает объявленную длину строки, незави-
101

симо от фактической длины строки. Например, если в строковой перемен-


ной фиксированной длины Стр0 определить длину, равную 20 символам, а
фактически находится слово "Строка", то функция Len(Стр0) возвратит
результат, равный 20.
Примеры
Sub Встр_функции_3()
Dim Стр0 As String * 20, Стр1 As Byte
Стр0 = "Строка"
Стр1 = Len(Стр0)
MsgBox "Стр1=" & Стр1
End Sub
Чтобы в таком случае узнать фактическую длину строки (в нашем
случае – 6), необходимо использовать комбинацию функций
Len(Trim(StrokeName)):
Sub Встр_функции_4() End Sub
Dim Стр0 As String * 20, Стр1 As Byte

Стр0 = "Строка"
Стр1 = Len(Trim(Стр0))
MsgBox "Стр1=" & Стр1
2.13.1.5.3. Сравнение и поиск строк
В VBA имеются две функции, помогающих сравнивать строки:
StrComp и InStr.
Функция StrComp
Формат функции:
StrComp (String1, String2 [, Compare])
где String1, String2 – любые два строковых выражения, которые необходи-
мо сравнивать. Compare – необязательный аргумент, может быть любой
из следующих предопределенных констант:
− vbBinaryCompare – бинарное сравнение двух строк;
− vbTextCompare – текстовое сравнение двух строк.
При бинарном сравнении коды символов упорядочены в соотвествии
с их двоичным значением, и коды строчных и прописных букв раразлича-
ются при сравнении. При текстовом сравнении VBA прописные и строчные
буквы не различает. Если аргумент Compare опускается, то используется
текущая установка Option Compare.
Если аргумент Compare опускается, то используется текущая установка
инструкции Option Compare (см. Примечание к п. Инструкция условного
перехода If…Then…Else).
102

Пример
В данном примере инструкция Option Compare используется для за-
дания метода сравнения строковых данных, используемого по умолчанию.
Option compare Binary ' т.е. "AAA" < "aaa"
' Устанавливает метод сравнения строковых данных Binary.
Option compare Text ' т. е. "AAA" = "aaa".
' Устанавливает метод сравнения строковых данных Text.
При выполнении процедуры StrComp возвращает следующее значене:
− -1, если String1 меньше String2;
− 0, если String1 и String2 равны;
− 1, если String1 больше String2.
Пример
Sub Встр_функции_5()
Dim R1 As String, R2 As String, R3 As String
R1 = StrComp("Строка1", "Строка2", vbTextCompare)
R2 = StrComp("Строка1", "Строка1", vbTextCompare)
R3 = StrComp("Строка2", "Строка1", vbTextCompare)
MsgBox "R1=" & R1 & " " & "R2=" & R2 & " " & "R3=" & R3
End Sub
В первой инструкции присваивания текстовое выражение Строка1
меньше, чем Строка2, и поэтому значение R1=–1, во втором они равны
(R2=0) и в третьем Строка2 больше, чем Строка1 (R3=1).
Функция InStr
Функция InStr дает возможность определить, содержит ли одна стро-
ка другую строку.
Формат функции:
InStr ([Start,] String1, String2 [, Compare])
String1, String2 – любые допустимые строковые выражения. Функция про-
веряет, содержится ли String1 в String2.
Start – необязательный аргумент, является численным выражением и ука-
зывает положение символа в String1, с которого должна начинаться про-
верка. Аргумент Start является обязательным, если указывается аргумент
Compare.
Compare имеет тот же смысл, что и в функции StrComp.
InStr возвращает число, обозначающее положение символа в String1, где
было обнаружено String2. Если InStr не находит String2 в String1, то воз-
вращается 0. Если String1 (или String2) имеет значение Null (“Пусто”), то
функция также возвращает Null.
Пример
Sub Встр_функции_6()
Dim R1 As String, R2 As String
R1 = "Строка ввода"
R2 = "Ввод"
MsgBox "R2 входит в R1 с позиции " & _
103
InStr(1, R1, R2, vbTextCompare)
End Sub

2.13.1.5.4. Выделение части строки


Задачу выделения части строки в VBA решают три функции:
Left, Right и Mid.
Функция Left
Формат функции:
Left (String, Length)
String – любое допустимое строковое выражение;
Length – любое численное значение.
Функция возвращает копию String, начиная с первого символа и
включая количество символов, заданных с помощью Length. Если Length
является числом, большим, чем фактическая длина String, то возвращает-
ся всё строковое выражение String.

Функция Right
Формат функции:
Right (String, Length)
String – любое допустимое строковое выражение;
Length – любое численное значение.
Функция возвращает копию String, начиная с последнего символа и
включая справа налево количество символов, заданных с помощью
Length. Если Length является числом, большим, чем фактическая длина
String, то возвращается все строковое выражение String. Функция Right
всегда копирует символы от конца строки к ее началу.

Функция Mid
Формат функции:
Mid (String, Start, [, Length])
String – любое допустимое строковое выражение;
Length, Star t – любые численные значения.
Функция Mid возвращает копию String, начиная с положения символа
в String, задаваемого с помощью аргумента Start . Необязательный аргу-
104

мент Length определяет количество копируемых в Mid символов из String.


Если Start содержит большее число, чем фактическая длина String, то воз-
вращается пустая строка.
Пример
Sub Встр_функции_7()
Dim R1 As String, R2 As String, _
R3 As String, R4 As String
R4 = "Ваша оценка Отлично"
R1 = Left(R4, 4)
R2 = Mid(R4, 6, 6)
R3 = Right(R4, 7)
MsgBox "R4=" & R4 & Chr(13) & _
"R1=" & R1 & Chr(13) & _
"R2=" & R2 & Chr(13) & _
"R3=" & R3
End Sub
2.13.1.5.5. Форматирование значений данных
Форматирование значений данных можно выполнить при помощи функции
Format, которая идентична функции Format в Excel и использует те же
символы-заполнители форматирования данных.
Формат функции:
Format (Expression [, Format[, Firstdayofweek [, Firstweekofyear]]])
Expression – любое допустимое выражение (обязательный аргумент).
Format – допустимое выражение именованного или определенного пользо-
вателем формата.
Firstdayofweek – константа, которая определяет первый день недели.
Firstweekofyear – константа, которая определяет первую неделю года.
Чтобы использовать функцию Format, надо либо задать предопреде-
ленный формат, либо создать образ определенного формата, используя
символы-заполнители. В качестве символов-заполнителей используются
символы 0, #, $, m, d, q и другие, используемые в Excel.
Пример
Sub Встр_функции_8()
Dim Дата As Date
Дата = Date
MsgBox Format(Дата, "Long Date") & vbCr _
& Format(Дата, "Medium Date") & vbCr _
& Format(Дата, "Short Date") & vbCr _
& Format(Дата, "dd mmmm yy") & vbCr _
& Format(Дата, "dd mm yy") & vbCr _
& Format(Дата, "dd mm yyyy")
End Sub
105
2.13.2. Функции, определённые пользователем
Функция, определённая пользователем, называемая также процеду-
рой-функцией, – это особый вид процедуры VBA, возвращающей резуль-
тат. Пользовательские процедуры-функции, как и встроенные функции
VBA, могут иметь необязательные и именованные аргументы. Для записи
функции-процедуры нельзя использовать макрорекордер, хотя можно ре-
дактировать записанный рекордером макрос и превращать его в функцию-
процедуру.
Основное различие между процедурой-функцией и другими процеду-
рами, помимо того, что функции возвращают значение, а процедуры – нет,
состоит в том, что в функции-процедуре используются ключевые слова
Function и End Function.
Формат процедуры-функции:
Function Name([Arglist]) [As Type]
VBA Statements
[Name = expression]
End Function
Function – ключевое слово, объявляющее начало функции.
Name – имя функции. Имена функций следуют тем же правилам, что
и имена других идентификаторов VBA.
Arglist – список аргументов данной функции, необязательный эле-
мент.
Type – любой тип возвращаемого значения функции. Если тип не оп-
ределен, результат, который возвращает функция-процедура, имеет тип
Variant.
Name = expression – присваивание функции, которое указывает VBA,
какое значение должна возвращать функция, необязательный элемент.
Тем не менее, всегда следует включать оператор присваивания в функ-
ции-процедуры.
End Function – ключевые слова, заканчивающие функцию.
Даже если функция не имеет аргументов (например, Now, Date) в
объявлении функции необходимо использовать круглые скобки.
Обычно функция предназначается для выполнения вычисления и
для возвращения результата. При объявлении функции-процедуры указы-
вается имя каждого аргумента, передаваемого функции. Имена аргумен-
тов в списке отделяются друг от друга запятой и должны следовать прави-
лам, применяемым к любому идентификатору VBA.
Ниже приведён пример, в котором используется функция, вычис-
ляющая сумму комиссионных. Суть задачи состоит в следующем. В таб-
лице, приведённой ниже, требуется подсчитать суммы комиссионных и
оплаты. Суммы комиссионных подсчитываются в процедуре-функции
Комиссионные, обращение к которой осуществляется в процедуре
Расчёт_Комиссионных при помощи инструкции
Cells(i, 3) = Комиссионные(Cells(i, 2)),
106

параметром которой является сумма продаж, находящаяся в ячейке Excel


B3÷B6 (Cells(3, 2) – это ячейка B3 и т.д.).

Sub Расчёт_Комиссионных()
Sheets("Лист1").Select
Dim i As Integer
i=3
While Cells(i, 1) <> ""
Cells(i, 3) = Комиссионные(Cells(i, 2))
Cells(i, 4) = Cells(i, 2) + Cells(i, 3)
i=i+1
Wend
End Sub

Function Комиссионные(Продажи As Double) As Double


Dim РасчётКом As Double, Надбавка As Double
РасчётКом = Продажи * 0.05
If Продажи > 5000 Then
Надбавка = 0.01 * (Продажи - 5000)
РасчётКом = РасчётКом + Надбавка
End If
If Продажи > 10000 Then
Надбавка = 0.02 * (Продажи - 10000)
РасчётКом = РасчётКом + Надбавка
End If
107

If Продажи > 15000 Then


Надбавка = 0.03 * (Продажи - 15000)
РасчётКом = РасчётКом + Надбавка
End If
Комиссионные = РасчётКом
End Function
Подсчёт оплаты выполняется при помощи инструкции
Cells(i, 4) = Cells(i, 2) + Cells(i, 3)
в процедуре Расчёт_Комиссионных.
Ниже приведена таблица с результатом решения задачи.

VBA передает все аргументы в функцию-процедуру как типы Variant.


Можно объявлять определенные типы данных для каждого аргумента в
списке аргументов. Определение типов аргументов для функции-
процедуры помогает пользователю при вызове функции вводить аргумен-
ты правильного типа в правильном порядке.
2.14. Файлы VBA

2.14.1. Типы файлов в VBA


В VBA допустима работа с тремя типами текстовых файлов.
Файл последователь- Последовательность строк произвольной длины,
ного доступа разделенных специальными символами. Чтение
и запись в файл производится построчно
Файл произвольного Состоит из записей фиксированной длины и раз-
доступа мер записи указывается при его открытии. Это
позволяет локализовать любую запись в файле
по ее номеру
Бинарный файл Является частным случаем файла произвольного
доступа. Размер записи в бинарном файле счи-
тается равным 1 байту
108
2.14.2. Открытие и закрытие файла
Обсудим инструкции, связанные с открытием файла для операций
ввода/вывода, а также с закрытием файла по завершению работы с ним.

Open
Разрешает выполнение операций ввода/вывода при работе с файлом.
Формат инструкции:
Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла
[Lеn=Длина]
− Путь – строковое выражение, указывающее имя файла
− Режим – устанавливает режим работы с файлом. Допустимые Зна-
чения: Append, Binary, Input, Output или Random
− Доступ – устанавливает операции, разрешенные с открытым фай-
лом. Допустимые значения: Read, Write или Read Write
− Блокировка – устанавливает операции, разрешенные с открытым
файлом другим процессам. Допустимые значения: Shared, Lock
Read, Lock Write и Lock Read Write
− Номер-файла – допустимый номер файла. Число в интервале от 1 до
255.
− Длина – число, меньшее либо равное 32 767 (байт).

Close
Завершает операции ввода/вывода с файлом, открытым с помощью инст-
рукции Open.
Формат инструкции:
Close [СписокНомеровФайлов]
Аргумент СписокНомеровФайлов может представлять один или несколько
номеров файлов. При этом используется следующий синтаксис, где но-
мерФайла представляет любой допустимый номер файла: [[#] номерФай-
ла] [, [#] номерФайла] ...
Если СписокНомеровФайлов не указан, инструкция Close закрывает все
активные файлы, открытые инструкцией Open.
Reset
Закрывает все активные файлы, открытые с помощью инструкции Open, и
записывает содержимое всех буферов файлов на диск, открытых с помо-
щью инструкции Open.
Формат инструкции:
Reset
FreeFile
Функция возвращает доступный номер, который может использоваться в
инструкции Open.
109

Приведем пример инструкции, открывающей для записи бинарный файл


Первый из рабочей папки, и затем инструкции, закрывающей этот бинар-
ный файл.
Open "Первый" For Binary Access Write As #1
Close #1

2.14.3. Ввод данных в файл последовательного доступа


Print
Записывает форматированные данные в файл последовательного доступа.
Формат инструкции:
Print # НомерФайла, [СписокВывода]
− Номерфайла – любой допустимый файловый номер
− СписокВывода – выражение или список выражений, записываемое в
файл. В аргументе СписокВывода разделителем списка выводимых
выражений является ";" (данные выводятся подряд) или "," (данные
выводятся по зонам).
Write #
Записывает неформатированные данные в файл последовательного дос-
тупа. В отличие от инструкции Print, инструкция write вставляет запятые
между элементами и заключает строки в кавычки по мере записи их в
файл.
Формат инструкции:

Write #НомерФайла, [СписокВывода]

− НомерФайла – любой допустимый файловый номер


− СписокВывода – выражение или список выражений, записываемых в
файл Данные, записанные с помощью инструкции Write, обычно счи-
тываются из файла с помощью инструкции Input.
Приведем две процедуры, использующие инструкции Print и Write для соз-
дания файлов последовательного доступа.
Sub ПримерИспользованияPrint()
Open "Новый" For Output As #1
'
Print #1, "Тест"
' Печатает текст в файл
'
Print #1,
' Печатает пустую строку в файл
'
Print #1, "Зона 1"; Tab; "Зона 2"; Spc(3); "3 пробела"
' Печатает в двух зонах печати
110

'
Close #1
End Sub
Sub ПримерИспользованияWrite()
Open "ЕщеПример" For Output As #1
Write #1, "Пример"; "использования"
Write #1, "инструкции"
Write #1, "Write"
x=1
Write #1, "Число";
Close #1
End Sub
Результатом описанных выше инструкций будет файл со следующим со-
держимым:
"Пример","использования" "инструкции","Write" "Число",1
Следует обратить внимание на автоматическое размещение в файле
разделителей – запятых и то, что строковая информация берется в кавыч-
ки. В процедуре ПримерИспользованияWrite вторая инструкция Write спе-
циально заканчивается знаком ";". Это обеспечивает вывод данных треть-
ей инструкцией Write в ту же строку файла, в которую выводила вторая
инструкция.

2.14.4. Вывод данных из файла последовательного доступа


Input #
Считывает данные из открытого файла последовательного доступа и при-
сваивает их переменным. Данные, считываемые с помощью инструкции
Input #, обычно записываются в файл с помощью инструкции Write #.
Формат инструкции:
Input # НомерФайла, СписокПеременных
− Номерфайла – любой допустимый файловый номер
− СписокПеременных – список разделённых запятыми переменных,
которым следует присвоить значения, считанные из файла
Line Input #
Считывает одну строку из открытого файла последовательного доступа и
присваивает ее переменной типа String. Данные, считываемые с помощью
инструкции Line input #, как правило, записываются в файл с помощью ин-
струкции Print #.
Формат инструкции:
Line Input #НомерФайла, ИмяПеременной
111

Синтаксис инструкции Line Input # содержит следующие элементы:


− НомерФайла – номер файла
− ИмяПеременной – имя переменной типа Variant или String
Функция Input
Возвращает значение типа String, содержащее символы из файла, откры-
того в режиме Input или Binary. Функция input считывает данные, записы-
ваемые в файл с помощью инструкции Print # или Put.
Формат инструкции:
Input (Число, [#] НомерФайла)
Число задает число возвращаемых символов. Если аргумент Число равен
1, то производится посимвольное считывание данных.
Функция EOF
Функция возвращает значение True при достижении конца файла.
Формат инструкции:
EOF (НомерФайла)
При последовательном считывании информации из файла часто исполь-
зуется следующий цикл:
Do While Not EOF(l) Loop или While Not EOF (I) Wend.
Пример
Ниже приведены две процедуры: ЗаписьПоследоватФайла и
ЧтениеПоследоватФайла,– в которых создаётся, а затем читается файл
Ведомость, размещаемый в папке E:\VBA_INTERNET. При чтении файла,
созданного процедурой ЗаписьПоследоватФайла, отличие действия инст-
рукций Input и Line Input в процедуре ЧтениеПоследоватФайла проявятся
при чтении записи, созданной инструкцией Write #1, "Алексеев С.С.",
206709, "Информатика", "Отлично". Инструкция Line Input #1, Ввод счи-
тает ее целиком в переменную Ввод, в то время, как инструкция Input #1,
Ввод считывает записи последовательно, и для чтения всей строки дол-
жен выполниться четыре раза.
Sub ЗаписьПоследоватФайла()
Open "e:\VBA_INTERNET\Ведомость" For Output As #1
Print #1, "Алексеев С.С.", 206709
Print #1, "Информатика"
Write #1, "Отлично"
Write #1, "Алексеев С.С.", 206709, "Информатика", "Отлично"
Close #1
End Sub
Sub ЧтениеПоследоватФайла()
Dim Ввод
Open "e:\VBA_INTERNET\Ведомость" For Input As #1
Input #1, Ввод: MsgBox Ввод
Input #1, Ввод: MsgBox Ввод
112

Input #1, Ввод: MsgBox Ввод


Line Input #1, Ввод: MsgBox Ввод
Close #1
End Sub
Ниже приведены диалоговые окна, выводимые инструкцией MsgBox.

2.14.5. Работа с файлом произвольного доступа

Приведем инструкции ввода/вывода информации при работе с фай-


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

Put
Записывает содержимое переменной в файл произвольного доступа.
Формат инструкции:
Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
− НомерФайла – номер файла
− НомерЗаписи – номер записи (режим Random) или номер байта
(режим Binary), с которого следует начать запись. Если аргумент
НомерЗаписи опущен, то записывается на то место, где был уста-
новлен указатель после выполнения последней инструкции Get
или Put, либо куда он переведен с помощью функции Seek
− ИмяПеременной – имя переменной, содержащей данные, которые
следует записать в файл
Get
Читает данные из открытого файла произвольного доступа в переменную.
Формат инструкции:
Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
− НомерФайла – номер файла
− НомерЗаписи – номер записи (для файлов в режиме Random) или
номер байта (для файлов в режиме Binary), с которого следует на-
чать чтение
113

− Имяпеременной – имя переменной, в которую следует поместить


считанные данные
Seek
Функция возвращает значение типа Long, определяющее текущее поло-
жение указателя чтения/записи внутри файла, открытого с помощью инст-
рукции Open.
Формат функции:
Seek (НомерФайла)

LOF
Функция возвращает значение типа Long, представляющее размер файла
в байтах, открытого с помощью инструкции Оpen . Для определения раз-
мера закрытого файла следует использовать функции FileLen.

Формат функции:
LOF (НомерФайла)

FileLen
Функция возвращает значение типа Long, содержащее размер файла в
байтах.
Формат функции:
FileLen (Путь )
Как видно из приведенного в предыдущем разделе примера для счи-
тывания информации при помощи инструкции Input #, файл последова-
тельного доступа иногда удобно задавать как последовательность запи-
сей, причем каждая из записей формируется из группы полей. В файле
последовательного доступа существует только одна внутренняя структура,
образованная разделителями: запятыми или специальными символами,
обозначающими переход на новую строку.
В противоположность файлам последовательного доступа, в файлах
произвольного доступа запись является встроенным элементом. Файл
произвольного доступа – это файл, упорядоченный по номерам записей,
что позволяет быстро переместиться на любую запись, минуя предыду-
щие.
При создании файла произвольного доступа указывается макси-
мальная длина каждой записи. Само собой разумеется, что в любую за-
пись можно вводить данные, занимающие не всё место, выделенное для
записи, но нельзя ввести данные, требующие больше места, чем допусти-
мая длина записи. Лишняя информация будет просто усекаться.
Отметим, что при открытии файла произвольного доступа, в отличие
от файла последовательного доступа, не надо специально указывать, от-
крывается он для ввода или вывода информации. Ввод и вывод информа-
ции определяют команды Put и Get.
Приведем пример работы с файлом произвольного доступа Ведо-
мость. Файл создается с помощью процедуры ЗаписьВФайлПД, которая
114

последовательно считывает данные из первого и второго столбца рабоче-


го листа и затем вводит их в файл. В этой процедуре число вводимых за-
писей фиксировано и равно 3. Процедура СчитываниеИзФайлаПД произ-
водит обратное действие – считывает данные из файла и вводит их в
ячейки третьего и четвертого столбца рабочего листа.
При работе с файлом произвольного доступа можно определить чис-
ло записей, не пересчитывая их. Число записей равно отношению размера
файла к длине одной записи. Длина записи устанавливается при создании
файла произвольного доступа и определяется типом переменной, при по-
мощи которой файл был создан. Размер открытого файла определяется
функцией LOF, а еще не открытого – функцией FileLen. В рассматривае-
мом случае число записей в файле равно LOF(l) / Len(Студент).
Структура записи Студент определяется на модульном уровне, т.е.
перед первой процедурой модуля.
Type Студент
Фамилия As String * 20
Оценка As String * 5
End Type

Sub ЗаписьВФайлПД()
Dim Студент As Студент
Dim i As Integer
Open "Список" For Random As #1 Len = Len(Студент)
For i = 2 To 4
With Студент
.Фамилия = Cells(i, 1).Value
.Оценка = Cells(i, 2).Value
End With
Put #1, i, Студент
Next i
Close #1
End Sub

Sub СчитываниеИзФайлаПД()
Dim Студент As Студент
Dim i As Integer
Dim n As Integer
Open "Список" For Random As #1 Len = Len(Студент)
n = LOF(1) / Len(Студент) + 1
For i = 2 To n
Get #1, i, Студент
With Студент
Cells(i, 3).Value = .Фамилия
Cells(i, 4).Value = .Оценка
End With
115

Next i
Close #1
End Sub

Ниже приведены таблицы Excel до и после выполнения процедуры Счи-


тываниеИзФайлаПД.

2.15. Создание процедуры


Создание первой процедуры проекта требует выполнения двух по-
следовательных шагов:
1. вставка модуля в рабочую книгу;
2. написание процедуры в этом модуле.
Приложение может содержать один или несколько модулей. Имея не-
сколько модулей, можно организовать их по назначению, виду и т.п. Соз-
дадим процедуру, которая будет выводить на экран окно сообщения. Для
создания этой процедуры нужно выполнить следующие действия.
1. Открыть новую рабочую книгу.
Выполнить команду Сервис > Макрос > Редактор Visual Basic. Откроется
окно редактора Visual Basic. В левой части окна редактора Visual Basic
появится окно проектов Project Explorer. Если окно проектов не появится,
надо нажать комбинацию клавиш <Ctrl+R>.
116

2. Если окно проектов VBAProject (Книга1) не откроется, то открыть его,


щелкнув левой кнопкой мыши по значку + элемента VBAProject
(Книга1).
3. Щелкнуть правой кнопкой мыши на элементе ЭтаКнига. В появив-
шемся контекстном меню выбрать команду Insert > Module. В прило-
жение будет добавлен модуль.
117

В верхней части окна кода модуля находится инструкция Option


Explicit, которая принуждает явно описывать все переменные с помощью
инструкций Dim, Private, Public, ReDim и Static. Если попытаться использо-
вать переменную без её объявления, то при компиляции кода будет выда-
на ошибка. Эта инструкция в новом модуле появляется только тогда, когда
в диалоговом окне Options на вкладке Editor установлен флажок опции
Require Variable Declaration. Диалоговое окно Options открывается коман-
дой Tools > Options.
4. Выполнить команду Insert > Procedure. Откроется диалоговое окно
Add Procedure.
5. Ввести имя процедуры, например, ПерваяПроцедура. В секции Туре
установить переключатель Sub.
6. Щелкнуть на кнопке ОК. В пустой строке находится текстовый курсор,
предлагая начать ввод кода процедуры.
7. Нажать клавишу Таb и ввести следующий текст:
MsgBox "Это процедура VBA"
После того как введено MsgBox и нажата клавиша пробела, появится
окно с информацией о данной инструкции. Делать отступ текста с помо-
щью клавиши Таb не обязательно. Отступ делается для более легкого
чтения кода.
7. Нажать клавишу Enter.
Ниже приведена введённая процедура.
118

VBA требует выполнения определенных правил для имен подпро-


грамм и функций. Эти правила таковы.
− Первые три символа имени должны быть буквами.
− Имя может содержать буквы, цифры и знаки подчеркивания.
− Имя не может содержать пробелы, точки, запятые, восклицатель-
ные знаки (!) и символы @, &, $, #.
− Имя не должно иметь более 255 символов.
2.16. Выполнение процедуры
После создания процедуры её можно сразу выполнить. Для этого су-
ществует несколько способов. Можно использовать команду Run
Sub|UserForm (Выполнить подпрограмму|экранную форму) из меню Run
(Выполнить) или щелкнуть на кнопке Run Sub|UserForm стандартной пане-
ли инструментов или нажать клавишу F5. Итак, чтобы выполнить процеду-
ру, нужно сделать следующее.
1. Щёлкнуть кнопкой Run Sub|UserForm стандартной панели инструмен-
тов редактора Visual Basic. Процедура выполнится и отобразит окно
сообщения:

2. Щёлкнуть кнопкой ОК. Произойдёт возврат в окно редактора Visual


Basic.
2.17. Сохранение процедуры
Чтобы сохранить новую процедуру, надо сохранить рабочую книгу, где
находится эта процедура. Можно сохранить рабочую книгу из редактора
Visual Basic. Для этого нужно:
1. выполнить команду File > Save Книга (Файл > Сохранить книгу). Если
рабочая книга еще ни разу не сохранялась, дать ей имя;
2. ввести Первая в качестве имени книги и нажать клавишу Enter.
Рабочая книга, модуль и процедура будут сохранены.
2.18. Запись последовательности действий пользователя
Excel позволяет записывать последовательность действий пользова-
теля, а затем преобразовать их в код VBA. Записанный VBA код макроса
может служить основой для дальнейших разработок, а также является хо-
рошим учебным материалом для изучения VBA. Например, чтобы узнать,
как в VBA записать последовательность каких-либо действий, нужно запи-
сать макрос, выполняющий эти действия, и затем проанализировать код
макроса и при необходимости внести изменения в него.
Пример
119

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


пользователя, для решения следующей задачи.
При работе в Excel необходимо часто вводить на рабочий лист на-
именование и “шапку” таблицы, приведённой ниже.

Для этого нужно выполнить следудующие действия:


1. Выделить блок ячеек A1:D1.
2. Объединить ячейки блока.
3. Ввести наименование таблицы (слово ВЕДОМОСТЬ) шрифтом.
4. Ввести шапку таблицы (Фамилия И.О., №зач.кн., Дисциплина,
Оценка).
5. Обвести рамкой каждую ячейку шапки таблицы.
Порядок записи макроса следующий.
1. Открыть новую рабочую книгу.
2. Выполнить команду Сервис > Макрос > Начать запись. Поя-
вится диалоговое окно Запись макроса, показанное ниже.

3. Ввести название макроса, например ВЕДОМОСТЬ_1, и


щёлкнуть кнопку OK.
4. Выполнить действия по формированию заголовка и шапки
таблицы, перечисленные выше в п.п. 1÷5
5. Щёлкнуть на кнопке Остановить запись одноименной пане-
ли инструментов. Сеанс записи макроса закончен.
Обычно (но не всегда!) на экране появляется панель инструментов
Остановить запись.

Если эта панель не появилась, то нужно щёлкнуть правой кнопкой


мыши на любой панели инструментов и в открывшемся контекстном меню
120

панели выбрать команду Настройка, а затем в одноименном диалоговом


окне в списке Панели инструментов установить флажок возле пункта
Остановить запись. Как альтернативу можно выполнить команду Сервис
> Макрос > Остановить макрос.
Для выполнения макроса необходимо выполнить команду Сервис >
Макрос > Макросы. Отобразится диалоговое окно Макрос. Выделить мак-
рос ВЕДОМОСТЬ_1 и щёлкнуть на кнопке Выполнить.
Можно также выполнить макрос из окна редактора VBA, используя
команду Run Sub|UserForm из меню Run или щелкнуть на кнопке Run
Sub|UserForm стандартной панели инструментов или нажать клавишу F5.
2.19. Просмотр кода макроса
По ходу записи макроса Excel запоминает действия пользователя и
одновременно преобразует их в код VBA. Чтобы увидеть полученный код,
нужно выполнить следующие действия.
1. Выберать команду Сервис > Макрос > Макросы. Отобразится диало-
говое окно Макрос.
2. Выделите макрос ВЕДОМОСТЬ_1 и щёлкнуть на кнопке Изменить.
Откроется окно редактора Microsoft Visual Basic, в котором отобра-
зится код этого макроса.

Sub ВЕДОМОСТЬ_1()
'
' ВЕДОМОСТЬ_1 Макрос
' Макрос записан 15.06.2009 (VAM)
'
Range("A1:D1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Range("A1:D1").Select
ActiveCell.FormulaR1C1 = "ВЕДОМОСТЬ"
With ActiveCell.Characters(Start:=1, Length:=9).Font
.Name = "Arial Cyr"
.FontStyle = "полужирный"
.Size = 12
.Strikethrough = False
121

.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("A2").Select
ActiveCell.FormulaR1C1 = "Фамилия И.О."
Range("B2").Select
ActiveCell.FormulaR1C1 = "№зач.кн."
Range("C2").Select
ActiveCell.FormulaR1C1 = "Дисциплина"
Range("D2").Select
ActiveCell.FormulaR1C1 = "Оценка"
Range("A2:D2").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
122

Количество строк в коде макроса не соответствует тому незначи-


тельному количеству действий, которые совершены при записи макроса.
Дело в том, что хотя устанавливался только формат шрифта и вид рамки
ячеек, в коде макроса сохранена вся информация, представленная кноп-
кой Ж выбора шрифта панели инструментов и характеристикой границы
ячеек. Кроме того, здесь используется относительная адресация ячеек,
для которой необходимо выделять ячейки.
В приведённом ниже макросе ВЕДОМОСТЬ_2 удалена вся лишняя
информация и изменён способ адресации ячеек, что привело к значи-
тельному уменьшению макроса и увеличению его наглядности. Это оказа-
лось проще, чем разрабатывать макрос на пустом месте.
Sub ВЕДОМОСТЬ_2()
'
' ВЕДОМОСТЬ Макрос
' Макрос записан 15.06.2009 (VAM)
Range("A1:D1").Select
Selection.HorizontalAlignment = xlCenter
Selection.Merge
ActiveCell.FormulaR1C1 = "ВЕДОМОСТЬ"
With ActiveCell.Characters(Start:=1, Length:=9).Font
.FontStyle = "полужирный"
End With
Range("A2") = "Фамилия И.О."
Range("B2") = "№Зач.кн."
Range("C2") = "Дисциплина"
Range("D2") = "Оценка"
Range("A2:D2").Select
Selection.Borders(xlEdgeLeft).Weight = xlThin
Selection.Borders(xlEdgeTop).Weight = xlThin
Selection.Borders(xlEdgeBottom).Weight = xlThin
Selection.Borders(xlEdgeRight).Weight = xlThin
Selection.Borders(xlInsideVertical).Weight = xlThin
End Sub
3. Отладка программ
В редакторе VBA имеется большой набор инструментов и средств для
тестирования и отладки разрабатываемых приложений.
В этом пункте рассматриваются следующие вопросы.
− Тестирование и отладка программ.
− Остановка выполнения приложений.
− Использование окна Immediate.
− Пошаговое выполнение процедур.
− Отслеживание значений переменных и свойств.
123
3.1. Тестирование и отладка как этап разработки приложений
Тестирование – это процесс выполнения процедуры и исследование
всех аспектов ее работы. Цель тестирования – проверить правильность
результатов выполнения процедуры и ее реакцию на разнообразные дей-
ствия пользователя. Если во время работы процедуры получены невер-
ные результаты вычислений, непредвиденная реакция на те или иные
действия пользователя, либо вообще произошла остановка выполнения,
то это говорит о том, что код процедуры имеет ошибки.
Необходимо вводить комментарии в коде процедур. Комментарии
позволяют разобраться в назначении того или иного фрагмента кода и тем
самым облегчить поиск ошибок. Кроме того, без понятных комментариев
трудно поддерживать приложение в будущем.
Ошибки в коде процедур подразделяются на три типа:
− синтаксические ошибки,
− ошибками выполнения,
− логические ошибки.
Синтаксические ошибки. Это ошибки, связанные с неправильным
форматом кода. По умолчанию редактор Visual Basic отслеживает синтак-
сические ошибки в коде процедур после нажатия клавиши Enter. Это по-
лезное средство, но при желании его можно отключить (или восстановить),
удалив (или установив) флажок опции Auto Syntax Check (Автоматическая
проверка синтаксиса) на вкладке Editor (Редактор) диалогового окна
Options (Параметры).
Ошибки выполнения (runtime error). Это такие ошибки, которые при-
водят к остановке выполнения приложения. Например, введено имя объ-
екта с ошибкой. VBA может обнаружить такую ошибку только во время вы-
полнения программы. Ошибки выполнения также могут быть реакцией на
действия пользователя, которые не предусмотрены в программе, напри-
мер, на ввод некорректного значения аргумента функции, которая вы соз-
дана.
Логические ошибки (logic error). VBA не может отследить такой тип
ошибок, так как в этом случае обычно нет грамматических и синтаксиче-
ских ошибок в написании операторов, т.е. нарушена логика выполнения
операторов.
3.1.1. Отладка
Процесс локализации и исправления ошибок называется отладкой
(debugging). Для этих целей можно использовать функцию MsgBox и спе-
циальные средства отладки.
Функцию MsgBox можно использовать для вывода значений перемен-
ных в любом месте процедуры, чтобы контролировать изменение пере-
менных в процессе выполнения процедуры. В процессе отладки можно по-
следовательно выявлять ошибки, и чтобы ускорить процесс отладки мож-
но “нейтрализовать” выполнение функции MsgBox, помещая перед ней
символ “одиночная кавычка” ( ' ), превращая тем самым строку кода в при-
124

мечание. После отладки программы строки с отладочными строками мож-


но удалить.
К специальным средствам отладки VBA относятся:
− окно быстрого выполнения Immediate,
− наблюдение за значениями переменных,
− точки останова,
− пошаговое выполнение кода.
Чтобы исследовать процесс отладки на практике, необходимо создать
процедуру, содержащую ошибку. Для этого нужно выполнить следующие
действия.
1. Закрыть все открытые книги.
2. Открыть новую рабочую книгу.
3. Нажать комбинацию клавиш <Alt+F11> для открытия редактора
Visual Basic.
4. Вставить модуль в текущую рабочую книгу.
5. Создать новую процедуру и назвать её, например, Ошибка.
6. Ввести код этой процедуры
Sub Ошибка()
Dim response
response = Application.InputBox("Введите ваше имя")
If response = "" Then
MsgBox "Процедура завершена"
Exit Sub
Else
MsgBox "Ваше имя - " & response
End If
End sub

7. Выполнить процедуру. В окне ввода ввести ваше имя и нажать кла-


вишу Enter. Появится окно сообщения, содержащее введённое имя.
Итак, пока процедура работает как надо.
1. Щёлкнуть на кнопке ОК для закрытия окна сообщения.
8. Нажать F5 для повторного выполнения процедуры.
9. В окне ввода щёлкнуть на кнопке Отмена. на экран будет выведено
следующее диалоговое окно:

В диалоговом окне получено сообщение Ваше имя False! Но должны


были получить Процедура завершена!
125

10. Щёлкнуть на кнопке ОК для удаления окна сообщения.


Итак, процедура работает неправильно. Она определенно содержит
ошибку, но как найти эту ошибку? На примере этой процедуры рассмотрим
различные методы отладки.

3.1.1.1. Режим останова


Чтобы отладить процедуру "вручную", необходимо просмотреть каж-
дую строку кода. В VBA для локализации ошибки имеется несколько спо-
собов остановить выполнение процедуры в определенных точках кода.
Это называется перевести процедуру в режим останова. Режим останова
временно приостанавливает выполнение процедуры. В этом режиме мож-
но проверить значения переменных и свойств, применить другие средства
отладки. Режим останова позволяет выполнить следующие действия.
• Редактировать код процедуры.
• Просматривать значения переменных, свойств и выражений.
• Изменять значения переменных и свойств.
• Выполнять операторы Visual Basic в окне быстрого выполнения
Immediate.
В рассматриваемой процедуре ошибка как-то связана с оператором
InputBox. Поэтому после его выполнения следует остановить процедуру.
Место в коде программы, где остановится выполнение процедуры, назы-
вается точкой останова (breakpoint). Есть несколько способов пометить
строку кода точкой останова.
• Выбрать строку кода и выполнить команду Debug > Toggle
Breakpoint (Отладка > Установка точки останова).
• Выбрать строку кода и нажать клавишу F9.
Точку останова можно установить только на строке, содержащей ис-
полняемый код. В строке, содержащей неисполняемый код, установить
точку останова нельзя. К неисполняемому коду относятся комментарии,
операторы объявления переменных и констант, пустые строки. Когда на
строке кода установлена точка останова, то она меняет цвет (в соответст-
вии с текущими установками среды редактора VBA).
Удалить точки останова можно точно теми же описанными выше способа-
ми, что и установить. Если в коде установлены несколько точек останова,
чтобы удалить их все за один раз, нужно выполнить команду Debug >
Clear All Breakpoint (Отладка > Удалить все точки останова) или нажать
комбинацию клавиш <Ctrl+Shift+F9>.
В процедуре Ошибка точку останова надо установить после строки,
содержащей оператор InputBox. Для этого нужно выполнить следующие
действия.
− Поместить текстовый курсор где-нибудь в строке, расположенной
ниже строки, содержащей оператор InputBox.
− Нажать клавишу F9. Строка изменит цвет.
Можно установить больше одной точки останова.
126

Теперь необходимо выполнить процедуру Ошибка и посмотреть, ка-


кой эффект произведет точка останова.
1. Выполнить процедуру Ошибка.
2. В окно ввода ввести свое имя и нажать клавишу Enter. Появится окно
редактора Visual Basic, где будет выделена строка, на которой уста-
новлена точка останова:

Теперь процедура находится в режиме останова, и есть возможность


узнать значение, которое в данный момент приняла переменная response.
Самый простой путь сделать это – поместить указатель мыши на имя пе-
ременной. Появится маленькое окошко, показывающее текущее значение
переменной: response = “МАРИЯ”

Таким же образом можно просмотреть значения других переменных и


свойств. Просмотр значений переменных – это самое наименьшее, что
можно сделать для поиска и устранения ошибок.
Имеются и другие способы просмотра значений переменных и
свойств, например, использование окна Immediate, которое позволяет не
только просматривать значения переменных и свойств, но и изменять их.
3.1.1.2. Использование окна Immediate
Окно быстрого выполнения Immediate предоставляет доступ ко всем
переменным и свойствам, используемым в процедуре. С помощью этого
окна можно решать различные задачи, включая следующие.
− Задать значения переменных и свойств.
127

− Изменить значения переменных и свойств.


− Увидеть результат отладочных действий.
− Вызвать на исполнение любую процедуру.
− Ввести новые операторы и сразу их выполнить. Это позволяет
экспериментировать с различными вариантами кода процедуры.
− Копировать и вставлять фрагменты кода процедуры в окно
Immediate и сразу их выполнять.
3.1.1.2.1. Просмотр значений в окне Immediate
Как было показано ранее, можно просмотреть текущие значения перемен-
ных в режиме останова, поместив указатель мыши на имя переменной.
Другой путь просмотра значений переменных и свойств – окно Immediate.
Для этого также предусмотрено несколько способов. Во-первых, в окне
Immediate можно ввести слово Print (Печать) или знак вопроса (?), а за-
тем – имя переменной или свойства. Во-вторых, можно ввести непосред-
ственно в процедуру оператор Debug.Print, который будет показывать в
окне Immediate значения заданных переменных. Ниже рассмотрены оба
эти способа.
Сначала испробуем способ со словом Print (или что то же самое, со
знаком вопроса).
1. Если процедура Ошибка все еще находится в режиме останова,
нужно привести её в исходное состояние, выполнив команду Run >
Reset (Выполнить > Восстановить) или щелкнув на кнопке Reset
стандартной панели инструментов.
2. Начать выполнение процедуры, нажав клавишу F5. В окне ввода
щёлкнуть на кнопке Отмена. Поскольку при выполнении процедуры
достигнута точка останова, то откроется редактор VBA.
3. Если в окне редактора отсутствует окно Immediate, нажать комби-
нацию клавиш <Ctrl+G>. Откроется окно Immediate. Его также можно
открыть с помощью команды View > Immediate Window (Вид > Окно
Immediate).
4. Чтобы узнать значение переменной response, щёлкнуть в окне
Immediate и ввести ?response (между знаком ? и словом response
не должно быть пробела!).
5. Нажать клавишу Enter. В следующей строке окна Immediate появится
значение переменной response. В данном случае эта переменная
имеет значение False:

Выше указано, что в окне Immediate можно не только просмотреть


значения переменных, но и задавать эти значения. Это позволяет прове-
рить логику выполнения программы. В нашей процедуре оператор If дол-
128

жен вывести соответствующее окно сообщения, если переменная


response имеет значение пустой строки. Для проверки этого необходимо:

1. В окне Immediate ввести строчку response = ""


2. Нажать клавишу Enter. Теперь переменная response имеет значение
пустой строки.
3. Нажать клавишу F5, чтобы продолжить выполнение процедуры. На эк-
ран будет выведено диалоговое окно:

4. Щёлкнуть на кнопке ОК в окне сообщения для завершения процедуры.


В предыдущем примере для получения доступа к окну Immediate бы-
ла установлена точка останова, которая переводила процедуру в режим
останова. Но если по каким-либо причинам нет необходимости останавли-
вать выполнение процедуры, но нужно знать значения переменных или
свойств во время выполнения, то необходимо использовать оператор
Debug.Print. Этот оператор вставляется непосредственно в код процеду-
ры и выводит соответствующий текст в окно Immediate во время ее вы-
полнения. Чтобы воспользоваться этим оператором в процедуре Ошибка,
нужно проделать следующее.
1. Выполнить команду Debug > Clear All Breakpoints для удаления
всех точек останова из процедуры.
2. Удалить текст из окна Immediate.
3. Измените код процедуры следующим образом (изменения выделены
полужирным шрифтом):

Public Sub Ошибка_2()


Dim response
response = Application.InputBox("Введите свое имя")
Debug.Print "Значение response: " & response
If response = " " Then
MsgBox "Процедура завершена"
Exit Sub
Else
MsgBox "Ваше имя - " & response.
End If
End Sub

4. Нажав клавишу F5, начать выполнение процедуры.


5. Ввести имя в окне ввода и нажать клавишу Enter.
6. Щёлкнуть на кнопке OK для закрытия окна сообщения.
129

7. Снова выполнить процедуру.


8. В окне ввода щёлкнуть на кнопке Отмена, а затем на кнопке OK, что-
бы закрыть последующее окно сообщения.
9. Вернуться в редактор Visual Basic.

В окне Immediate появятся две строки текста. Первая строка появилась во


время первого выполнения процедуры, вторая – при повторном выполне-
нии.

3.1.1.3. Пошаговое выполнение программ


В большинстве случаев при отладке проверяется логика выполнения
процедуры, поэтому необходимо отслеживать порядок исполнения строк
кода. Это особенно необходимо при проверке работы операторов If и
Select. Для этого применяется особый режим выполнения программ – по-
шаговое выполнение, когда программа останавливается после исполнения
каждой строки кода.
Существует два режима пошагового выполнения: Step Into (Тоталь-
ное пошаговое выполнение) и Step Over (Пошаговое выполнение с пере-
шагиванием через процедуры). Оба режима позволяют пошагово выпол-
нять весь код процедуры и отслеживать значения переменных и свойств.
Есть и различия между этими режимами. Если отлаживается проце-
дура, которая вызывает другие процедуры, и нет необходимости их вы-
полнять в пошаговом режиме, то используется режим Step Over. В этом
режиме вызываемые процедуры выполняются в обычном режиме, а не
пошагово. Если нужно просмотреть в пошаговом режиме и вызываемые
процедуры, то применяется режим Step Into.
Обычно в пошаговом режиме выполняется не вся процедура. Чаще
точка останова устанавливается в том месте кода процедуры, которое вы-
зывает сомнение. Затем процедура выполняется, доходит до точки оста-
нова, останавливается, а далее применяется пошаговый режим. Покажем,
как выполняется пошаговый режим на примере нашей процедуры Ошибка.

1. Удалить инструкцию Debug.Print из процедуры.


2. Установить точку останова в строке после оператора InputBox.
3. Нажать клавишу F5, чтобы начать выполнение процедуры.
4. Щёлкнуть на кнопке Отмена в окне ввода. Произойдёт переход в ок-
но редактора Visual Basic, так как процедура достигла точки остано-
ва. Следующий выполняемый оператор – оператор If. Надо просле-
дить, как выполняется этот оператор. По логике, сейчас условное
выражение в операторе If имеет значение True и должен выполнять-
130

ся оператор вывода окна сообщения о том, что процедура заверше-


на.
5. Нажать клавишу F8, чтобы перейти в пошаговый режим и выполнить
следующий оператор. После проверки условия оператора If процеду-
ра не стала выполнять оператор вывода окна сообщения, а перешла
к пункту Else и выделила его, т.е. определена инструкция, которая
работает не так, как было задумано.

5. Нажать клавишу F5, чтобы продолжить выполнение процедуры в


обычном режиме.
3.1.2. Исправление ошибок
Теперь можно исправить ошибку в процедуре Ошибка. Очевидно, что
метод InputBox при щелчке на кнопке Отмена возвращает значение
False, а не пустую строку, как первоначально ошибочно предполагалось.
Ниже приведён код исправленной процедуры.
Sub Ошибка()
Dim response
response = Application.InputBox("Введите ваше имя")
If response = False Then
MsgBox "Процедура завершена"
Exit Sub
Else
MsgBox "Ваше имя - " & response
End If
End Sub

Следует протестировать эту процедуру ещё раз, чтобы убедиться в том,


что она работает так, как задумано.
131

Библиографический список

1. Гарнаев А.Ю. MS Excel 2002: разработка приложений. – СПб.: БХВ-


Петербург, 2003.
2. Кузьменко В.Г. VBA 2002. – М.: ЗАО «Издательство БИНОМ», 2002.
3. Пол Сана и др. Visual Basic для приложений (версия 5) в подлиннике: пер. с
англ. – СПб.: BHV – Санкт-Петербург, 1997.
4. Уокенбах, Джон. Профессиональное программирование на VBA в Excel
2003: Пер. с англ. – М.: Издательский дом “Вильямс”, 2005.
5. http://college.biysk.secna.ru/Acces/Glava%2013/Index13.htm
6. http://text.fdc.seua.am/avtor/vba_intuit/index-2.htm
7. http://tid.com.ua/tid1/addonres.php?id=6285)
8. http://window.edu.ru/window_catalog/pdf2txt?p_id=21859
9. http://www.askit.ru/custom/vba_office/vba_office_plan.htm
10. http://www.askit.ru/custom/vba_office/vba_office_plan.htm
11. http://www.csu.ac.ru/~rusear/VBA/9_VarTypeConst.htm
12. http://www.eusi.ru/lib/podlin_programmirovanie_microsoft_excel_24/1.shtml
13. http://www.firststeps.ru/vba/vbahelp/vbahelp1.html
14. http://www.manage.ru/itm/excel/pikuza/01.shtml -Автомати. бизнес-проц.VBA
15. http://www.eusi.ru/lib/podlin_programmirovanie_microsoft_excel_24/index.shtml
132

Оглавление

1. Объектно-ориентированное программирование ................................... 3


2. Основные понятия .................................................................................... 7
2.1. Алфавит и словарь языка ..................................................................... 8
2.2. Переменные ......................................................................................... 10
2.3. Константы ............................................................................................. 13
2.4. Строковые переменные ...................................................................... 14
2.5. Массивы ................................................................................................ 15
2.6. Пользовательские типы данных ......................................................... 19
2.7. Операции VBA ...................................................................................... 20
2.8. Объектная модель Excel ..................................................................... 21
2.8.1. Свойства и методы объектов .......................................................... 21
2.8.2. Отображение объектной модели Excel .......................................... 22
2.8.2.1. Иерархия объектной модели ........................................................ 24
2.8.2.2. Ссылка на объекты в коде VBA .................................................... 24
2.8.3. Работа с объектами .......................................................................... 25
2.8.3.1. Задание свойств объекта .............................................................. 25
2.8.3.2. Использование методов объекта ................................................. 25
2.8.3.3. Переменные-объекты .................................................................... 27
2.8.3.4. Коллекции ....................................................................................... 27
2.8.3.5. Метод Add ....................................................................................... 28
2.8.3.6. Свойство Count .............................................................................. 28
2.8.4. Свойства и методы основных объектов Excel ............................... 28
2.8.4.1. Объект Application .......................................................................... 28
2.8.4.2. Объект Worksheet .......................................................................... 30
2.8.4.3. Объект Range ................................................................................. 31
2.8.5. Просмотр объектов ........................................................................... 33
2.8.6. Использование справочной системы .............................................. 35
2.8.6.1. Использование функциональной клавиши F1 ............................ 35
2.8.6.2. Использование помощника ........................................................... 36
2.9. Ввод и вывод данных .......................................................................... 38
2.9.1. Функция MsgBox ................................................................................ 38
2.9.2. Функция InputBox .............................................................................. 42
2.9.3. Метод InputBox .................................................................................. 43
2.9.4. Объединение текстовых строк ........................................................ 45
2.10. Концепция событий Excel ................................................................. 46
2.10.1. Типы событий Excel .......................................................................... 46
2.10.2. События объекта Workbook ............................................................. 47
2.10.3. События объекта Worksheet ............................................................ 51
2.10.4. События объекта Application............................................................ 52
2.10.5. События объекта UserForm ............................................................. 52
2.10.6. События, не связанные с конкретными объектами ....................... 52
2.10.6.1. Метод OnKey .................................................................................. 52
2.10.6.2. Событие OnTime ............................................................................ 54
2.11. Формы пользователя ........................................................................ 54
133

2.11.1. Свойства, методы и события экранных форм ............................... 55


2.11.1.1. Некоторые свойства форм............................................................ 56
2.11.1.2. Некоторые методы форм .............................................................. 56
2.11.1.3. Некоторые события форм............................................................. 57
2.11.2. Элементы управления ...................................................................... 57
2.11.2.1. Элемент управления Label (Надпись) ......................................... 59
2.11.2.1.1. Окно свойств формы .................................................................. 59
2.11.2.2. Элемент управления CommandButton (Кнопка) ......................... 60
2.11.2.3. Элемент управления TextBox (Текстовое поле) ......................... 62
2.11.2.4. Элемент управления ComboBox .................................................. 64
2.11.2.5. Элемент управления ListBox (список) ......................................... 66
2.11.2.6. Элемент управления CheckBox (Флажок) ................................... 68
2.11.2.7. Элемент управления ToggleButton (Выключатель) .................... 68
2.11.2.8. Элемент управления OptionButton (Переключатель)................. 69
2.11.2.9. Элемент управления Image (Рисунок) ......................................... 70
2.11.2.10. Элемент управления ScrollBar (полоса прокрутки) ................. 70
2.11.2.11. Элемент управления SpinButton (Счётчик) .............................. 71
2.11.2.12. Элемент управления RefEdit (Поле со свёртыванием) .......... 71
2.11.2.13. Элементы управления на рабочем листе ................................ 73
2.12. Инструкции VBA ................................................................................ 77
2.12.1. Оператор присваивания ................................................................... 77
2.12.2. Инструкция Set .................................................................................. 77
2.12.3. Циклы ................................................................................................. 78
2.12.3.1. Инструкция For… Next ................................................................... 78
2.12.3.2. Инструкция While…Wend ............................................................ 80
2.12.3.3. Инструкция Do... Loop................................................................... 81
2.12.3.4. Инструкция For Each…Next .......................................................... 84
2.12.4. Инструкции перехода ...................................................................... 86
2.12.4.1. Инструкция условного перехода If…Then…Else ....................... 86
2.12.4.2. Инструкция Select…Case .............................................................. 90
2.12.4.3. Инструкция безусловного перехода GoTo ................................. 91
2.12.4.4. Инструкции перехода к обработчику ошибок On Error.............. 92
2.12.4.5. Инструкции прерывания выполнения блока Exit ....................... 94
2.12.4.6. Инструкция передачи управления выполнением процедуры
подпрограмме внутри процедуры GoSub… Return .................................... 94
2.12.4.7. Инструкция передачи управления выполнением процедуры
на одну из нескольких строк кода On…GoSub и On…GoTo ..................... 95
2.13. Функции VBA ..................................................................................... 97
2.13.1. Встроенные функции ........................................................................ 97
2.13.1.1. Математические функции ............................................................. 97
2.13.1.2. Функции преобразования данных ................................................ 97
2.13.1.3. Функции даты и времени ............................................................... 98
2.13.1.4. Строковые функции ....................................................................... 99
2.13.1.5. Примеры использования функций VBA ..................................... 100
2.13.1.5.1. Удаление ненужных символов ................................................ 100
2.13.1.5.2. Определение длины строки..................................................... 100
134

2.13.1.5.3. Сравнение и поиск строк ......................................................... 101


Функция StrComp ................................................................................ 101
Функция InStr ...................................................................................... 102
2.13.1.5.4. Выделение части строки .......................................................... 103
Функция Left ........................................................................................ 103
Функция Right ..................................................................................... 103
Функция Mid ........................................................................................ 103
2.13.1.5.5. Форматирование значений данных ........................................ 104
2.13.2. Функции, определённые пользователем ...................................... 105
2.14. Файлы VBA ...................................................................................... 107
2.14.1. Типы файлов в VBA ........................................................................ 107
2.14.2. Открытие и закрытие файла .......................................................... 108
2.14.3. Ввод данных в файл последовательного доступа ...................... 109
2.14.4. Вывод данных из файла последовательного доступа ................ 110
2.14.5. Работа с файлом произвольного доступа .................................... 112
2.15. Создание процедуры ...................................................................... 115
2.16. Выполнение процедуры ................................................................. 118
2.17. Сохранение процедуры .................................................................. 118
2.18. Запись последовательности действий пользователя ................. 118
2.19. Просмотр кода макроса .................................................................. 120
3. Отладка программ................................................................................. 122
3.1. Тестирование и отладка как этап разработки приложений ........... 123
3.1.1. Отладка ............................................................................................ 123
3.1.1.1. Режим останова ........................................................................... 125
3.1.1.2. Использование окна Immediate .................................................. 126
3.1.1.2.1. Просмотр значений в окне Immediate ........................................ 127
3.1.1.3. Пошаговое выполнение программ ............................................. 129
3.1.2. Исправление ошибок ...................................................................... 130
Библиографический список ........................................................................ 131
135

Учебное издание

Власовец Александр Михайлович

ВВЕДЕНИЕ В VBA

Учебное пособие

Редактор Т.Ф. Морозова

Подписано в печать 27.05.10. Формат 60×84 1/16.


Усл. печ. л. 8,4. Тираж 300 экз. Заказ 262. РТП изд-ва СПбГУЭФ.

Издательство СПбГУЭФ. 191023, Санкт-Петербург, Садовая ул., д. 21.