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

1

Предисловие
Данное пособие имеет целью практическое освоение основ про-
граммирования на языке VBA (Visual Basic for Application), ориентиру-
ясь преимущественно на работу пользователя в среде Excel MS
Office. Пособие является дополнением к следующим пособиям:
1.Истомин Е.П., Власовец А.М. Информатика и программирование:
Учебник. – СПб. ООО “Андреевский издательский дом”, 2010 г. – 293с.
2. Власовец А.М. Введение в VBA: Учебное пособие: СПб.: Изд-во
СПбГУЭФ, 2010,–135 c. В этих изданиях приводятся форматы ин-
струкций и функций, а также примеры инструкций и кодов VBA. Для
вывода на экран электронной версии пособия нужно щёлкнуть по ги-
перссылке Введение в VBA. Для удобства работы рекомендуется
настоящее пособие постоянно отображать на половине экрана.
Примечание. Файл “Введение в VBA” должен находиться в одной
папке с настоящим пособием.
При работе с пособием настоятельно рекомендуется сначала вы-
полнить все действия по составлению макросов и процедур, указан-
ные в пособии, работая непосредственно на компьютере и выполнить
упражнения, приведённые в конце каждого пункта пособия.
В настоящее время используются три версии Excel: Excel 97-
2003, Excel 2007 и Excel 2010, – различающиеся интерфейсом пользо-
вателя. Группа Excel 97-2003 включает в себя версии Excel 97, Excel
2000, Excel 2002 и Excel 2003. Интерфейс пользователя существенно
изменился в версиях Excel 2007 и Excel 2010, в которых кнопки и
вкладки сгруппированы совершенно иначе, чем в предыдущих верси-
ях. Ниже приведены примеры интерфейса табличного процессора
версий Excel 97-2003, Excel 2007 и Excel 2010.
Интерфейс Редактора Visual Basic во всех версиях одинаков.

Excel 97-2003

Excel 2007

Excel 2010
2

1. Создание процедур
Для автоматизации выполнения действий при помощи VBA необ-
ходимо создать программу (код) VBA, который хранится в процедуре.
Процедура состоит из операторов (инструкций) VBA. Добавить код в
модуль VBA можно тремя способами:
 ввести код с клавиатуры;
 записать последовательности действий пользователя с ав-
томатическим преобразованием их в код VBA;
 скопировать программный код VBA из существующего мо-
дуля и вставить его в модуль пользователя.
1.1. Ввод кода с клавиатуры
Создание первой процедуры требует выполнения двух шагов:
сначала надо вставить модуль в рабочую книгу, а затем в этом модуле
написать процедуру. Приложение может содержать несколько моду-
лей; в этом случае их можно организовать по назначению, виду и т.п.
Процедура “Начало_VBA”, разработка которой приведена ниже, выво-
дит на экран окно сообщения пользователю "Начинаем работать с
VBA". Для создания этой процедуры нужно выполнить следующие
действия, которые различаются для разных версий Excel.
А. Excel 2007–2010
Интерфейс приложений Excel 2007 и Excel 2010 осуществляется
при помощи “Ленты”, отображение которой приведено ниже.

Рис. 1,а. Лента Excel 2007

Рис. 1,б. Лента Excel 2010


Как следует из рис. 1,а и рис.2,б, интерфейсы рассматриваемых
приложений практически не отличаются. Основное отличие состоит в

том, что в Excel 2007 используется кнопка , а в Excel 2010 исполь-


зуется кнопка .

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


на вкладке Разработчик. Вкладка Разработчик в Excel 2007 и Excel
2010 по умолчанию не показана. Для вывода её на экран нужно вы-
3
полнить следующие действия, которые различаются в Excel 2007 и
Excel 2010.

Excel 2007

1. Щелкнуть значок Кнопка Microsoft Office ,а затем в по-


явившемся диалоговом окне “Microsoft Excel” щёлкнуть вкладку
, находящуюся внизу окна.
2. В группе Основные параметры работы с Excel

установить флажок Показывать вкладку "Разработчик" на ленте, а


затем нажать кнопку ОК.

Excel 2010
1. На вкладке Файл выбрать Параметры, чтобы открыть диалого-
вое окно Параметры Excel.
2. Щелкнуть Настройка ленты в левой части диалогового окна.
3. В разделе Выбрать команды из, расположенном слева в окне,
выбрать Популярные команды.
4. В разделе Настройка ленты, который находится справа в диа-
логовом окне, выбрать Основные вкладки, а затем установить
флажок Разработчик.
5. Нажать кнопку ОК.

Установка уровня безопасности


Макросы VBA Excel могут быть подвержены воздействию вирусов.
Поэтому для установки уровня безопасности, разрешающего вы-
полнение всех макросов, нужно выполнить следующие действия.
1. Щёлкнуть по вкладке “Разработчик” в группе Код (рис.2)

Рис.2
Щёлкнуть по кнопке “Безопасность макросов” .
4
2. В появившемся окне “Центр управления безопасностью” (рис.3) в
группе “Параметры макросов” выбрать переключатель “Включить
все макросы (не рекомендуется, возможен запуск опасной про-
граммы)” и нажать кнопку ОК.

Рис.3. Центр управления безопасностью


Примечание
Excel запоминает уровень безопасности, установленный на компь-
ютере. Поэтому, если он не изменялся, то его нет необходимости
устанавливать каждый раз при работе с VBA. Это замечание отно-
сится ко всем версиям Excel.
Составить процедуру с именем “Начaло_VBA”, в которой на экран
выводится сообщение "Начинаем работать с VBA".
1. На вкладке Разработчик в группе Код щёлкнуть по кнопке

или, удерживая клавишу Alt, нажать клавишу F11.


Отобразится окно проектов Project Explorer (рис. 4).

Рис. 4. Окно проектов Project Explorer


2. Щёлкнуть правой кнопкой мыши на элементе ЭтаКнига.
5
3. В появившемся контекстном меню (рис.5)

Рис.5. Контекстное меню


выбрать команду Insert > Module. В окно проектов приложения бу-
дет добавлен модуль Module1 (рис. 6).

Рис. 6. Окно проектов


В верхней части окна кода модуля находится инструкция Option
Explicit, которая требует явно описывать все переменные с помощью
операторов Dim, Private, Public, ReDim и Static. Эта инструкция в но-
вом модуле появляется только тогда, когда в диалоговом окне
Options на вкладке Editor установлен флажок опции Require Variable
Declaration (рис. 7). Хороший стиль программирования рекомендует
явно описывать все переменные. Диалоговое окно Options открыва-
ется командой Tools > Options (рис.8).
6

Рис. 7. Диалоговое окно Options Рис. 8. Команда Tools >


Option
При попытке использовать переменную без её объявления при
запуске процедуры на выполнение будет выдано сообщение об ошиб-
ке Variable not defined (Переменная не определена).
4. Выбрать в меню окна проектов команду Insert > Procedure
(рис.9).

Рис.9. Команда Insert > Procedure


Откроется окно Add Procedure (рис. 10).

Рис. 10. Окно добавления процедуры


7
5. В поле Name ввести имя процедуры, например, Начало_VBA. В
секции Туре установить переключатель Sub и щёлкнуть на кнопке
ОК. Как показано на рис.11, в модуль будет добавлена пустая
процедура Начало_VBA. Эта процедура имеет по умолчанию ста-
тус Public, что делает её доступной из любой другой процедуры
данной рабочей книги. В пустой строке находится текстовый кур-
сор, предлагая начать ввод кода процедуры.

Рис. 11. Пустая процедура VBA


6. Ввести за строкой “Public Sub Начало_VBA” инструкцию вывода
на экран сообщения:
MsgBox "Начинаем работать с VBA"
После нажатия клавиши пробела за словом MsgBox появится окно
(рис.12) с информацией о данной инструкции:
MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly]…)

Рис.12. Ввод инструкций процедуры Начало_VBA


Текст процедуры Начало_VBA показан на рис. 13.
8

Рис.13. Процедура Начало_VBA


Имена VBA для подпрограмм и функций, как и всех других объек-
тов VBA, образуются на основании следующих правил:
 первый символ имени должен быть буквой (латинского или рус-
ского алфавита);
 имя может содержать буквы, цифры и знаки подчеркивания;
 имя не может содержать пробелы, точки, запятые, восклица-
тельные знаки (!) и символы @, &, $, #; в качестве разделителей
слов рекомендуется использовать знаки подчеркивания;
 имя не должно иметь более 255 символов.

Выполнение процедуры
После создания процедуры её можно сразу выполнить. Это мож-
но сделать одним из двух способов:
- использовать команду Run Sub/UserForm из меню Run,
- нажать клавишу <F5>.
Выполним процедуру Начало_VBA первым способом:
1. Выбрать пункт Run стандартной панели инструментов редакто-
ра Visual Basic (рис.14)

Рис.14. Окно Run стандартной панели инструментов


2. В раскрывшемся меню выбрать пункт Run Sub/UserForm. По-
явится диалоговое окно с именем процедуры (рис.15)
9

Рис.15. Окно макросов


3. Щёлкнуть по кнопке Run или нажать клавишу Enter.

Процедура выполнится и отобразит окно сообщения (рис. 16).

Рис. 16. Результат выполнения процедуры Начало_VBA


4. Щелкнуть кнопку ОК; произойдёт возврат в окно редактора
Visual Basic.
Сохранение процедуры
Чтобы сохранить новую процедуру, надо сохранить рабочую кни-
гу, где находится эта процедура. Можно сохранить рабочую книгу из
редактора Visual Basic. Для этого нужно произвести следующие дей-
ствия.

1. Щелкнуть кнопку . На экран будет выведено меню форматов


сохранения текущего файла, представленное на рис. 17.
10

Рис. 17. Меню форматов сохранения текущего файла

2. Выбрать пункт
3. В окне “Сохранение документа” в строке “Имя файла:” ввести
“Начало_VBA” в качестве имени книги Excel”, выбрать место со-
хранения файла (папку) и нажать кнопку “Сохранить” или клави-
шу <Enter>. Рабочая книга, модуль и процедура будут сохране-
ны.
Следует обратить внимание на то, что имя сохранённого файла бу-
дет иметь расширение “xlsm”. Это означает, что это файл Excel
2007 или Excel 2010, содержащий макросы. Если же предполагает-
ся, что сохраняемый файл будет использоваться в Excel 97–2003,
то тогда для его сохранения в меню форматов нужно выбрать

пункт .
Кроме того, следует иметь в виду, что рабочие книги, в том числе
содержащие макросы, полученные в Excel 97–2003, можно исполь-
зовать в Excel 2007 и Excel 2010.
11

Б. Excel 97 – 2003
1. Вызвать Excel.
2. Открыть рабочую книгу, в которую нужно вставить процедуру,
или оставить Книга1, если создаётся новое приложение.
3. Выполнить команду Сервис | Макрос | Безопасность…
4. В диалоговом окне “Безопасность” на вкладке “Уровень безопас-
ности” нажать кнопку “Низкая (не рекомендуется)” и щёлкнуть
мышью OK. В противном случае при запуске Excel программные
средства VBA будут недоступны, и при открытии файла Excel,
для которого не был уровень безопасности “Низкая”, появится
сообщение о том, что макросы были отключены.
Примечание
Excel запоминает уровень безопасности, установленный на компь-
ютере. Поэтому, если он не изменялся, то его нет необходимости
устанавливать каждый раз при работе с VBA. Это замечание отно-
сится ко всем версиям Excel.
5. Выполнить команду Сервис > Макрос > Редактор Visual Basic.
Откроется окно редактора Visual Basic. Если окно проектов не
будет отражено, нажать комбинацию клавиш <Ctrl+R>. В левой
части окна редактора Visual Basic отобразится окно проектов
Project Explorer (рис. 1).

Рис. 1. Окно проектов Project Explorer


6. Щёлкнуть правой кнопкой мыши на элементе ЭтаКнига.
7. В появившемся контекстном меню (рис.2)
12

Рис.2. Контекстное меню


выбрать команду Insert > Module.
В приложение будет добавлен модуль Module1 (рис. 3).

Рис. 3. Окно проектов

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


Explicit, которая требует явно описывать все переменные с помощью
операторов Dim, Private, Public, ReDim и Static. Эта инструкция в но-
вом модуле появляется только тогда, когда в диалоговом окне
Options на вкладке Editor установлен флажок опции Require Variable
Declaration (Рис. 4). Хороший стиль программирования рекомендует
13
явно описывать все переменные. Диалоговое окно Options открыва-
ется командой Tools > Options (рис.5).

Рис.4. Диалоговое окно Options Рис.5. Выбор команды


Tools> Options
При попытке использовать переменную без её объявления при
запуске процедуры на выполнение будет выдано сообщение об ошиб-
ке “Variable not defined” (“Переменная не определена”).
8. Выбрать в меню окна проектов команду Insert > Procedure(рис.6).

Рис. 6. Выбор команды Insert > Procedure


9. Откроется окно добавления процедуры в проект Add Procedure, в
поле Name ввести имя процедуры, например, Начало_VBA. (рис.
7).
14

Рис. 7. Окно добавления процедуры


10. В секции Туре установить переключатель Sub и щёлкнуть на
кнопке ОК. Как показано на рис.8, в модуль будет добавлена пу-
стая процедура “Начало_VBA”. Эта процедура имеет по умолча-
нию статус Public, что делает её доступной из любой другой про-
цедуры данной рабочей книги. В пустой строке находится тексто-
вый курсор, предлагая начать ввод кода процедуры.

Рис. 8. Пустая процедура VBA


11. Ввести за строкой “Public Sub Начало_VBA” следующий текст:
MsgBox "Начинаем работать с VBA"
После нажатия клавиши пробела за словом MsgBox появится окно
(рис.9) с информацией о данной инструкции:
MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly]…)
15

Рис.9. Ввод инструкций процедуры Начало_VBA


Текст введённой процедуры показан на рис. 10.

Рис.10. Процедура Начало_VBA


Имена VBA для подпрограмм и функций, как и всех других объек-
тов VBA, образуются на основании следующих правил:
 первый символ имени должен быть буквой (латинского или рус-
ского алфавита);
 имя может содержать буквы, цифры и знаки подчеркивания;
 имя не может содержать пробелы, точки, запятые, восклица-
тельные знаки (!) и символы @, &, $, #; в качестве разделителей
слов рекомендуется использовать знаки подчеркивания;
 имя не должно иметь более 255 символов.

Выполнение процедуры
После создания процедуры её можно сразу выполнить. Это мож-
но сделать одним из двух способов:
16
1. использовать команду Run Sub/UserForm из меню Run,
2. нажать клавишу <F5>.
Выполним процедуру Начало_VBA первым способом.
1. Выбрать пункт Run стандартной панели инструментов редактора
Visual Basic (рис.11)

Рис.11. Окно Run стандартной панели инструментов


2. В раскрывшемся меню выбрать пункт Run Sub/UserForm.
3. Процедура выполнится и отобразит окно сообщения (рис. 12).

Рис. 12. Результат выполнения процедуры Начало_VBA


4. Щелкнуть кнопку ОК; произойдёт возврат в окно редактора Visual
Basic.
Сохранение процедуры
Чтобы сохранить новую процедуру, надо сохранить рабочую кни-
гу, где находится эта процедура. Можно сохранить рабочую книгу из
редактора Visual Basic. Для этого нужно произвести следующие дей-
ствия.
1. Выполнить команду File > Save Книга.
2. Если рабочая книга еще ни разу не сохранялась, дать ей имя.
3. Ввести Начало_VBA в качестве имени книги и нажать клавишу
<Enter>. Рабочая книга, модуль и процедура будут сохранены.
Упражнение 1
Составить процедуру с именем Упражнение1, в которой на экран вы-
водится сообщение “Да здравствует 1-е Мая!”.
17

Получение контекстно-зависимой справки VBA


Для получения справки по инструкции контекстно-зависимой
справки VBA необходимо перед ключевым (зарезервированным) в
тексте модуля или вне его поставить одиночную кавычку и нажать на
клавишу F1. Например, если записать ‘Dim, то будет выведено сооб-
щение, начальные строки которого будут иметь вид:
Dim Statement
Declares variables and allocates storage space.
Syntax

Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] var-


name[([subscripts])] [As [New] type]] . . .

The Dim statement syntax has these parts:


Part Description
WithEvents Optional. Keyword that specifies that varname is an object variable
used to respond to events triggered by an ActiveX object. WithEvents
is valid only in class modules. You can declare as many individual var-
iables as you like using WithEvents, but you can't create arrays with
WithEvents. You can't use New with WithEvents.
varname Required. Name of the variable; follows standard variable naming con-
ventions.
subscripts Optional. Dimensions of an array variable; up to 60 multiple dimen-
sions may be declared. The subscripts argument uses the following syn-
tax:
[lower To] upper [, [lower To] upper] . . .
When not explicitly stated in lower, the lower bound of an array is con-
trolled by the Option Base statement. The lower bound is zero if no
Option Base statement is present.
New Optional. Keyword that enables implicit creation of an object. If you
use New when declaring the object variable, a new instance of the ob-
ject is created on first reference to it, so you don't have to use the Set
statement to assign the object reference. The New keyword can't be
used to declare variables of any intrinsic data type, can't be used to de-
clare instances of dependent objects, and can’t be used with
WithEvents.
type Optional. Data type of the variable; may be Byte, Boolean, Integer,
Long, Currency, Single, Double, Decimal (not currently supported),
Date, String (for variable-length strings), String * length (for fixed-
length strings), Object, Variant, a user-defined type, or an object type.
Use a separate As type clause for each variable you declare.
18

2.1. Запись последовательности действий пользователя


Запись последовательности действий пользователя с автомати-
ческим преобразованием их в код VBA осуществляется с помощью
специальной функции записи макросов Excel. Как это делается, рас-
смотрим на примере создания таблицы “Поставка товаров” (рис.12).
Поставка товаров
Код Наименование Единица Цена Количество Сумма
товара товара измерения
101 Товар 1 шт. 10,00р. 5 50,00р.
102 Товар 2 шт. 15,00р. 10 150,00р.
103 Товар 3 шт. 20,00р. 20 400,00р.
104 Товар 4 кг. 20,00р. 10,5 210,00р.
Итого: 810,00р.
Рис.12. Таблица “Поставка товаров”
Суть задачи состоит в следующем.
Нужно создать один или несколько макросов, при выполнении которых
создаётся форма таблицы, таблица форматируется и заполняется
данными и формулами для расчёта построчных сумм для каждого то-
вара и общей суммы за поставку всех товаров.
Порядок действий следующий.
2.1.1. Excel 2007
1. Открыть рабочую книгу; по умолчанию активизируется Лист1.
2. На вкладке Разработчик в группе Код нажать кнопку Запись
макроса

В Excel отобразится диалоговое окно Запись макроса. Можно оста-


вить имя макроса по умолчанию, обычно Макрос1 (рис.13) или

Рис.13. Окно записи имени макроса


19
ввести любое другое имя, по возможности, чтобы оно соответство-
вало выполняемым макросам действиям. В рассматриваемом при-
мере создадим четыре макроса, которые решают следующие зада-
чи:
 ввод заголовка и “шапки” таблицы,
 форматирование таблицы,
 ввод расчётных формул,
 ввод исходных данных таблицы.
Для программного решения этих создадим следующие макросы:
 Шапка,
 Форматирование,
 Формулы,
 ВводДанных.
Поскольку в именах VBA, в т.ч. макросов, не допускаются про-
белы, их рекомендуется заменять символом “_” (подчёркивание,
например, Заголовок_шапка) или писать слова слитно, начиная
каждое слово с прописной (заглавной) буквы (ЗаголовокШапка).
Используем второй вариант – ЗаголовокШапка.
3. В списке Сохранить в выбрать книгу, в которой необходимо со-
хранить макрос.
4. После ввода имени макроса щёлкнуть кнопку OK, чтобы принять
параметры по умолчанию. Excel вставит новый модуль VBA в
проект.
Начиная с этого момента, Excel будет преобразовывать действия
пользователя в код VBA, сохраняя его в макросе.
3. После выполнения всех действий на рабочем листе текущей ра-
бочей книги, которые нужно записать, на вкладке Разработчик в
группе Код нажать кнопку Остановить запись .

Примечание
После начала записи действий пользователя в макрос кнопка
Запись макроса поменяется на кнопку Остановить запись .

2.1.1.1. Ввод заголовка и “шапки” таблицы


1. Ввести заголовок и шапку таблицы (рис.12), отображение кото-
рых на экране приведено на рис. 14:

Рис. 14. Заголовок и шапка таблицы


2. Щёлкнуть по кнопке Остановить запись .
Теперь можно проверить, что получится при выполнении макро-
са. Для этого нужно удалить заголовок и шапку и запустить макрос
ЗаголовокШапка на выполнение. Для этого нужно щёлкнуть в группе
20

Код кнопку , выбрать макрос ЗаголовокШапка в окне Макрос


(рис.15) и щёлкнуть по кнопке Выполнить.

Рис.15. Окно макросов


На активном листе появится таблица, приведённая на рис. 14.
Для просмотра или изменения макроса нужно щёлкнуть по име-
ни макроса (ЗаголовокШапка), а затем щёлкнуть по кнопке Изме-
нить(рис.15).
Ниже приведён текст макроса ЗаголовокШапка, сгенерированный
Excel при выполнении действий пользователя по вводу заголовка и
шапки таблицы.
Option Explicit

Sub Шапка()
'
' ЗаголовокШапка Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Поставка товаров"
Range("A2").Select
ActiveCell.FormulaR1C1 = "Код товара"
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
21
.ColorIndex = xlAutomatic
End With
Range("B2").Select
ActiveCell.FormulaR1C1 = "Наименование товара"
With ActiveCell.Characters(Start:=1, Length:=19).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("C2").Select
ActiveCell.FormulaR1C1 = "Единица измерения"
With ActiveCell.Characters(Start:=1, Length:=17).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("D2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Цена"
With ActiveCell.Characters(Start:=1, Length:=4).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
22
.ColorIndex = xlAutomatic
End With
Range("E2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Количество"
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("F2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Сумма"
With ActiveCell.Characters(Start:=1, Length:=5).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("A3").Select
End Sub
23
При записи макроса VBA кодирует все действия пользователя.
Для ввода данных в каждую ячейку текста VBA сгенерировал две
инструкции, первая из которых соответствует выделению ячейки –
используется свойство ячейки Range и метод Select, а вторая ис-
пользует свойство FormulaR1C1 ячейки, которое возвращает или
устанавливает формулу для объекта, используя нотацию (адреса-
цию) стиля R1C1 на языке макро. Кроме того, редактор VBA:
 указал свойства шрифта надписей, установленные им по
умолчанию;
 вставил инструкцию Option Explicit, которая требует явное
объявление переменных.
Для удобства проверки правильности функционирования макро-
сов переименуем листы Excel следующим образом:
Лист1 Шапка
Лист2 Формулы
Лист3 Форматирование
Лист4 ВводДанных
Макрос Шапка можно упростить следующим образом:
 удалить инструкции активизации ячеек;
 удалить строки кода, определяющие свойства шрифта
надписей;
 использовать инструкцию присваивания в стиле Range.
Option Explicit
Sub Шапка()
'
' ЗаголовокШапка Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("A1") = "Поставка товаров"
Range("A2") = "Код товара"
Range("B2") = "Наименование товара"
Range("C2") = "Единица измерения"
Range("D2") = "Цена"
Range("E2") = "Количество"
Range("F2") = "Сумма"
End Sub
Чтобы удостовериться в том, что при выполнении изменённо-
го макроса получился тот же самый результат, очистить заполнен-
ные ячейки, выполнить записанный макрос и сравнить результат с
рис.15.
Примечание
Если нет опасности перегрузить оперативную память компью-
тера или пользователь не обладает достаточной квалификацией в
области программирования на VBA, то лучше оставить макрос та-
ким, как его спроектировал Excel.
24
2.1.1.2. Ввод расчётных формул
1. На вкладке Разработчик в группе Код нажать кнопку Запись
макроса (рис.16).

Рис.16. Группа Код


2. Ввести в диалоговом окне рис.13 имя макроса Формулы.
3. Ввести в ячейку F3 формулу =D3*E3 и протянуть курсор авто-
заполнения с ячейки F3 по ячейку F10.
4. Ввести в ячейку E11 текст “Итого:”.
5. Ввести в ячейку F11 формулу =СУММ(F3:F10).
6. Нажать кнопку Остановить запись .
Ниже приведён текст макроса Формулы, сгенерированного
Excel, осуществляющего расчёты по приведённым выше форму-
лам.
Sub Формулы()
'
' Формулы Макрос
' Макрос записан 09.04.2010 (VAM)
Range("F3").Select
ActiveCell.FormulaR1C1 = "=RC[-2]*RC[-1]"
Selection.AutoFill Destination:=Range("F3:F10"), Type:=xlFillDefault
Range("E11").Select
ActiveCell.FormulaR1C1 = "Итого:"
Range("F11").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
End Sub
Отредактируем (упростим) макрос следующим образом1:
Sub Формулы()
'
' Формулы Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("F3").Select
ActiveCell = "=D3*E3"
Selection.AutoFill Destination:=Range("F3:F10"), Type:=xlFillDefault
Range("E11") = "Итого:"
Range("F11") = "=SUM(F3:F10)"
End Sub

1
См. Примечание на предыдущей странице
25
2.1.1.3. Форматирование таблицы
Для выполнения действий, перечисленных ниже в п.п. 1÷11 сле-
дует использовать пиктограммы групп Шрифт и Выравнивание
на вкладке Главная.

1. Выделить блок ячеек A2 : C2.


2. В группе Выравнивание на вкладке Главная:
- выбрать пункт Перенос текста .
- выровнять ячейки по горизонтали – по центру , по вер-
тикали – по верху .
3. Выделить блок ячеек A2:F2 и установить в нём шрифт “По-
лужирный”.
4. Установить в колонках A, B, C, E ширину колонок так, что-
бы по бокам ячеек были небольшие пробелы.
5. Установить по центру и выровнить по высоте значения
данных в ячейках строки 2.
6. В строке 2 выровнить текст по горизонтали по центру, а по
вертикали – по верхнему краю.
7. Выделить блок ячеек A1:F1 и установить в нём шрифт Arial
Cyr, размер 14, жирный, горизонтальное выравнивание –
по центру, вертикальное – по нижнему краю.
8. Границы ячеек разделить тонкими линиями.
9. Текст с данными таблицы сверху и снизу отделить двойны-
ми тонкими линиями.
10. Объединить ячейки A11:D11 .
11. Слово Итого: и общую сумму поставок товаров выделить
жирным шрифтом и курсивом.
26

2.1.1.4. Ввод данных


Ниже приведена таблица с исходными данными: Код товара,
Наименование товара, Единица измерения, Цена и Количество и ре-
зультатными данными, полученными при выполнении макросов Шап-
ка, Формулы, Форматирование и ВводДанных.
Поставка товаров
Код Наименование Единица Цена Количество Сумма
товара товара измерения
101 Товар1 шт 100,00р. 500 50 000,00р.
102 Товар2 шт 200,00р. 5000 1 000 000,00р.
103 Товар3 шт 300,00р. 50000 15 000 000,00р.
0,00р.
0,00р.
0,00р.
0,00р.
0,00р.
Итого: 16 050000,00р.
Макросы, которые были получены при выполнении пунктов:
1.2.1.Ввод заголовка и “шапки” таблицы
1.2.2.Ввод расчётных формул
1.2.3.Форматирование таблицы
1.2.4.Ввод данных
имеются в рабочих книгах:
Запись_макроса_исходная Исходный
Запись_макроса_отредактированная Отредактированный
Запись_макроса_шаблон Шаблон
Для загрузки нужной книги нужно щёлкнуть левой кнопкой мыши
по соответствующей гиперссылке: Исходный, Отредактированный или
Шаблон.
В рабочей книге Запись_макроса_исходная хранятся макросы,
полученные в результате записи в кодах VBA действий пользователя,
причём для каждого из перечисленных пунктов 1.2.1÷1.2.4 создавался
отдельный макрос, соответственно: Шапка, Формулы, Форматирова-
ние и ВводДанных. Конечно, все действия пользователя, включая
ввод исходных данных, можно записать в один макрос, но это неудоб-
но при отладке макросов.
В рабочей книге Запись_макроса_отредактированная макросы
отредактированы c целью их упрощения. В обеих этих книгах для
наглядности рабочие листы: Лист1, Лист2, Лист3, Лист4 – переимено-
ваны соответственно в Шапка, Формулы, Форматирование и Ввод-
Данных.
27
На рабочем листе Шапка приведён результат выполнения мак-
роса Шапка, на листе Формулы – последовательности макросов
Шапка Формулы, на листе Форматирование – последовательности
макросов Шапка Формулы Форматирование и на листе Ввод-
Данных – макросов Шапка Формулы Форматирование
ВводДанных.
В рабочей книге Запись_макроса_Шаблон рабочие листы не пе-
реименованы, и в конец макроса Шапка добавлены инструкции вызова
макросов Формулы, Форматирование и ВводДанных:
Call Формулы
Call Форматирование
Call ВводДанных
В результате выполнения макроса Шапка на рабочий лист Лист1 будут
введены название таблицы и заголовки столбцов и выполнены ин-
струкции макросов Формулы, Форматирование и ВводДанных, т.е.
получена таблица, приведённая в начале п.1.2.4.
Макрос ВводДанных приведён здесь в качестве иллюстрации
возможности записи в макрос исходных данных. На практике это мо-
жет быть использовано при вводе данных в таблицы, в которых меня-
ется небольшая часть их значений.
Упражнение 1
1. Спроектировать макрос, результатом работы которого является
получение макета таблицы “Продажи”, представленной на
рис.17. Значение в графе “Сумма” равно произведению реквизи-
тов “Цена” и “Количество продано”, а в строке “Итого” – сумме
этих произведений.
Продажи
№№ Наименование Количество
п/п товара Цена продано Сумма

Итого:

Рис.17. Макет таблицы “Продажи”


2. Запустить макрос на выполнение.
3. Заполнить таблицу произвольными исходными данными для
проверки правильности функционирования макроса.
28
2.2. Excel 97–2003

2.2.1. Запись последовательности действия пользователя


Запись последовательности действий пользователя с автомати-
ческим преобразованием их в код VBA осуществляется с помощью
специальной функции записи макросов Excel. Как это делается, рас-
смотрим на примере создания таблицы “Поставка товаров” (рис.12).

Поставка товаров
Код Наименование Единица Цена Количество Сумма
товара товара измерения
101 Товар 1 шт. 10,00р. 5 50,00р.
102 Товар 2 шт. 15,00р. 10 150,00р.
103 Товар 3 шт. 20,00р. 20 400,00р.
104 Товар 4 кг. 20,00р. 10,5 210,00р.
Итого: 810,00р.
Рис.12. Таблица “Поставка товаров”
Суть задачи состоит в следующем.
Нужно создать один или несколько макросов, при выполнении которых
создаётся форма таблицы, таблица форматируется и заполняется
данными и формулами для расчёта построчных сумм для каждого то-
вара и общей суммы за поставку всех товаров.
Порядок действий следующий.
 Открыть рабочую книгу; по умолчанию активизируется
Лист1.
 Выполнить команду Сервис | Макрос | Начать запись. В
Excel отобразится диалоговое окно Запись макроса. Можно
оставить имя макроса по умолчанию, обычно – Макрос1
(рис.13)

Рис.13. Окно записи имени макроса


или ввести любое другое имя, по возможности, чтобы оно соответ-
ствовало выполняемым макросам действиям. В рассматриваемом
29
примере создадим четыре макроса, которые решают следующие
задачи:
 ввод заголовка и “шапки” таблицы,
 форматирование таблицы,
 ввод расчётных формул,
 ввод исходных данных таблицы.
Для программного решения этих создадим следующие макросы:
 Шапка,
 Форматирование,
 Формулы,
 ВводДанных.
Поскольку в именах VBA, в т.ч. макросов, не допускаются про-
белы, их рекомендуется заменять символом “_” (подчёркивание,
например, Заголовок_шапка) или писать слова слитно, начиная
каждое слово с прописной (заглавной) буквы (ЗаголовокШапка).
Используем второй вариант – ЗаголовокШапка.
1. После ввода имени макроса щёлкнуть кнопку OK, чтобы принять
параметры по умолчанию.
Excel вставит новый модуль VBA в проект.
Начиная с этого момента, Excel будет преобразовывать действия
пользователя в код VBA. При записи в окно добавляется плавающая
панель инструментов (рис. 14), содержащая две кнопки: левая –
“Остановить запись”(синий квадрат) и правая – “Относительная ссыл-
ка”:

Рис. 14. Панель останова записи макроса


Если эта панель не появилась, то нужно выполнить команду Вид | Па-
нели инструментов, кнопка “Остановить запись”.
2.2.2. Ввод заголовка и “шапки” таблицы
1. Ввести заголовок и шапку таблицы (рис.12), отображение ко-
торых на экране приведено на рис. 15:

Рис. 15. Заголовок и шапка таблицы


2. Щёлкнуть по кнопке “Остановить запись” или выполнить ко-
манду Сервис | Макрос | Остановить запись.
Теперь можно проверить, что получится при выполнении макро-
са. Для этого нужно удалить заголовок и шапку, запустить макрос
ЗаголовокШапка на выполнение, выполнить команду
30
Сервис | Макрос | Макросы
и дважды щёлкнуть по имени макроса ЗаголовокШапка в окне Макрос.
На активном листе появится таблица, приведённая на рис. 15.
Переход к просмотру или изменению макроса можно выполнить
несколькими способами:
1. Выполнить команду Сервис | Макрос | Макросы и в окне Макрос
(рис.16) щёлкнуть по имени макроса (ЗаголовокШапка), а затем
щёлкнуть по кнопке Изменить.

Рис.16. Окно макросов


2. Выполнить команду Сервис | Макрос | Редактор Visual Basic и вы-
брать нужный макрос (процедуру).

3. Щёлкнуть по кнопке Редактор Visual Basic.


Используем первый способ. Ниже приведён текст макроса
ЗаголовокШапка, сгенерированный Excel при выполнении действий
пользователя по вводу заголовка и шапки таблицы.
Option Explicit

Sub Шапка()
'
' ЗаголовокШапка Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Поставка товаров"
Range("A2").Select
ActiveCell.FormulaR1C1 = "Код товара"
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = "Arial Cyr"
31
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("B2").Select
ActiveCell.FormulaR1C1 = "Наименование товара"
With ActiveCell.Characters(Start:=1, Length:=19).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("C2").Select
ActiveCell.FormulaR1C1 = "Единица измерения"
With ActiveCell.Characters(Start:=1, Length:=17).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("D2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Цена"
With ActiveCell.Characters(Start:=1, Length:=4).Font
.Name = "Arial Cyr"
32
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("E2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Количество"
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("F2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.FormulaR1C1 = "Сумма"
With ActiveCell.Characters(Start:=1, Length:=5).Font
.Name = "Arial Cyr"
.FontStyle = "обычный"
.Size = 12
.Strikethrough = False
.Superscript = False
33
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("A3").Select
End Sub
При записи макроса VBA кодирует все действия пользователя.
Для ввода данных в каждую ячейку текста VBA сгенерировал две
инструкции, первая из которых соответствует выделению ячейки –
используется свойство ячейки Range и метод Select, а вторая ис-
пользует свойство FormulaR1C1 ячейки, которое возвращает или
устанавливает формулу для объекта, используя нотацию (адреса-
цию) стиля R1C1 на языке макро. Кроме того, редактор VBA:
 указал свойства шрифта надписей, установленные им по
умолчанию;
 вставил инструкцию Option Explicit, которая требует явное
объявление переменных.
Для удобства проверки правильности функционирования макро-
сов переименуем листы Excel следующим образом:
Лист1 Шапка
Лист2 Формулы
Лист3 Форматирование
Лист4 ВводДанных
Макрос Шапка можно упростить следующим образом:
 удалить инструкции активизации ячеек;
 удалить строки кода, определяющие свойства шрифта
надписей;
 использовать инструкцию присваивания в стиле Range.
Option Explicit
Sub Шапка()
'
' ЗаголовокШапка Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("A1") = "Поставка товаров"
Range("A2") = "Код товара"
Range("B2") = "Наименование товара"
Range("C2") = "Единица измерения"
Range("D2") = "Цена"
Range("E2") = "Количество"
Range("F2") = "Сумма"
End Sub
Чтобы удостовериться в том, что при выполнении изменённо-
го макроса получился тот же самый результат, очистить заполнен-
34
ные ячейки, выполнить записанный макрос и сравнить результат с
рис.15.
Примечание
Если нет опасности перегрузить оперативную память компью-
тера или пользователь не обладает достаточной квалификацией в
области программирования на VBA, то лучше оставить макрос та-
ким, как его спроектировал Excel.
2.2.3. Ввод расчётных формул
 Выполнить команду Сервис | Макрос | Начать запись и вве-
сти в диалоговом окне рис.13 имя макроса Формулы.
 Ввести в ячейку F3 формулу =D3*E3 и протянуть курсор
автозаполнения с ячейки F3 по ячейку F10.
 Ввести в ячейку E11 текст “Итого:”.
 Ввести в ячейку F11 формулу =СУММ(F3:F10).
Ниже приведён текст макроса Формулы, сгенерированного
Excel, осуществляющего расчёты по приведённым выше форму-
лам.
Sub Формулы()
'
' Формулы Макрос
' Макрос записан 09.04.2010 (VAM)
Range("F3").Select
ActiveCell.FormulaR1C1 = "=RC[-2]*RC[-1]"
Selection.AutoFill Destination:=Range("F3:F10"), Type:=xlFillDefault
Range("E11").Select
ActiveCell.FormulaR1C1 = "Итого:"
Range("F11").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
End Sub
Отредактируем (упростим) макрос следующим образом1:
Sub Формулы()
'
' Формулы Макрос
' Макрос записан 09.04.2010 (VAM)
'
Range("F3").Select
ActiveCell = "=D3*E3"
Selection.AutoFill Destination:=Range("F3:F10"), Type:=xlFillDefault
Range("E11") = "Итого:"
Range("F11") = "=SUM(F3:F10)"
End Sub

1
См. Примечание на предыдущей странице
35

2.2.4. Форматирование таблицы


2.2.4.1. В блоке ячеек A2 : C2
 устанавливаем перенос текста по словам (команда Excel
Формат | Ячейки…| Формат ячеек |Выравнивание | Отобра-
жение | переносить по словам);
 выравниваем ячейки по горизонтали – по центру, по верти-
кали – по верху.
2.2.4.2. Выделяем блок ячеек A2:F2 и устанавливаем в нём
шрифт “Полужирный”.
2.2.4.3. Устанавливаем в колонках A, B, C, E ширину колонок
так, чтобы по бокам ячеек были небольшие пробелы.
2.2.4.4. Устанавливаем по центру и выравниваем по высоте
значения данных в ячейках строки 2.
2.2.4.5. В строке 2 выравниваем текст по горизонтали по цен-
тру, а по вертикали – по верхнему краю.
2.2.4.6. Выделяем блок ячеек A1:F1 и устанавливаем в нём
шрифт Arial Cyr, размер 14, жирный, горизонтальное вы-
равнивание – по центру, вертикальное – по нижнему краю.
2.2.4.7. Границы ячеек разделяем тонкими линиями, текст с
данными таблицы сверху и снизу отделяем двойными тон-
кими линиями, объединяем ячейки A11:D11, слово Итого: и
общую сумму поставок товаров выделяем жирным шриф-
том и курсивом.
2.2.5. Ввод данных
Ниже приведена таблица с исходными данными: Код товара,
Наименование товара, Единица измерения, Цена и Количество и ре-
зультатными данными, полученными при выполнении макросов Шап-
ка, Формулы, Форматирование и ВводДанных.
Поставка товаров
Код Наименование Единица Цена Количество Сумма
товара товара измерения
101 Товар1 шт 100,00р. 500 50 000,00р.
102 Товар2 шт 200,00р. 5000 1 000 000,00р.
103 Товар3 шт 300,00р. 50000 15 000 000,00р.
0,00р.
0,00р.
0,00р.
0,00р.
0,00р.
Итого: 16 050000,00р.
Макросы, которые были получены при выполнении пунктов:
1.2.1.Ввод заголовка и “шапки” таблицы
36
1.2.2.Ввод расчётных формул
1.2.3.Форматирование таблицы
1.2.4.Ввод данных –
имеются в следующих рабочих книгах:
Запись_макроса_исходная Исходный
Запись_макроса_отредактированная Отредактированный
Запись_макроса_шаблон Шаблон
Для загрузки нужной книги нужно щёлкнуть левой кнопкой мыши
по соответствующей гиперссылке: Исходный, Отредактированный или
Шаблон.
В рабочей книге Запись_макроса_исходная хранятся макросы,
полученные в результате записи в кодах VBA действий пользователя,
причём для каждого из перечисленных пунктов 1.2.1÷1.2.4 создавался
отдельный макрос, соответственно: Шапка, Формулы, Форматирова-
ние и ВводДанных. Конечно, все действия пользователя, включая
ввод исходных данных, можно записать в один макрос, но это неудоб-
но при отладке макросов.
В рабочей книге Запись_макроса_отредактированная макросы
отредактированы c целью их упрощения. В обеих этих книгах для
наглядности рабочие листы: Лист1, Лист2, Лист3, Лист4 – переимено-
ваны соответственно в Шапка, Формулы, Форматирование и Ввод-
Данных.
На рабочем листе Шапка приведён результат выполнения мак-
роса Шапка, на листе Формулы – последовательности макросов
Шапка Формулы, на листе Форматирование – последовательности
макросов Шапка Формулы Форматирование и на листе Ввод-
Данных – макросов Шапка Формулы Форматирование
ВводДанных.
В рабочей книге Запись_макроса_Шаблон рабочие листы не пе-
реименованы, и в конец макроса Шапка добавлены инструкции вызова
макросов Формулы, Форматирование и ВводДанных:
Call Формулы
Call Форматирование
Call ВводДанных
В результате выполнения макроса Шапка на рабочий лист Лист1 будут
введены название таблицы и заголовки столбцов и выполнены ин-
струкции макросов Формулы, Форматирование и ВводДанных, т.е.
получена таблица, приведённая в начале п.1.2.4.
Макрос ВводДанных приведён здесь в качестве иллюстрации
возможности записи в макрос исходных данных. На практике это мо-
жет быть использовано при вводе данных в таблицы, в которых меня-
ется небольшая часть их значений.
37

Упражнение 1
Спроектировать макрос, результатом работы которого является по-
лучение макета таблицы “Продажи”, представленной на рис.17.
Значение в графе “Сумма” равно произведению реквизитов “Цена”
и “Количество продано”, а в строке “Итого” – сумме этих произведе-
ний.
Продажи
№№ Наименование Количество
п/п товара Цена продано Сумма

Итого:

Рис.17. Макет таблицы “Продажи”


4. Запустить макрос на выполнение.
5. Заполнить таблицу произвольными исходными данными для
проверки правильности функционирования макроса.
3. Адресация ячеек в VBA Excel
Адресация (ссылка) на ячейки рабочего листа могут осуществ-
ляться двумя способами:
1. используя свойство Cells объекта Worksheet,
2. используя свойство Address объекта Range.
1. Формат свойства Cells объекта Worksheet:
Worksheets(индекс).Cells(<№ строки>,<№ столбца>),где
- индекс – номер или имя рабочего листа,
- <№ строки>,<№ столбца> – целочисленные выражения,
задающие значения № строки и № столбца рабочего листа.
Пример
‘Ячейка, находящаяся в строке 2 в столбце 5 (ячейка E5) листа
Лист1, получает значение 10.
i=1
k=2
Worksheets(“Лист1”).Cells(i*4+1,k).Value=10
2. Формат свойства Address объекта Range:
Worksheets(индекс).Range(Address)
Пример
Worksheets((“Лист1”).Range(“E5”) .Value=10
38
Примечание
Для активного рабочего листа можно опустить его название и
слово Value ,например, записать предыдущие инструкции так:
Cells(i*4+1,k)=10
Range(“E5”)=10
При использовании свойства Address объекта Range можно ука-
зать диапазон ячеек. Например, в результате выполнения ин-
струкции Range ("a5:a10") = 5 ячейки блока A5:A10 получат зна-
чение 5.
4. Вывод сообщений и ввод данных
В этом пункте рассматриваются следующие средства вывода со-
общений на экран дисплея и ввода данных с клавиатуры при помощи
диалоговых окон:
 использование функции MsgBox;
 использование функции InputBox;
 применение метода InputBox;
 именование аргументов,
 использование объединения текстовых строк.
Для освоения указанных выше функций необходимо щёлкнуть по ги-
перссылке Введение в VBA.doc , перейти в конец документа, войти в
Оглавление и перейти к п.2.9. Ввод и вывод данных.
4.1. Вывод сообщений на экран
1. Изучить п.2.9.1 Функция MsgBox пособия.
2. Перейти на страницу 41 пособия “Введение в VBA.doc”.
3. Скопировать текст процедуры ФункцияMsgBox.
4. Войти в Excel.
А. Excel 2007–2010

1. На вкладке Разработчик в группе Код щёлкнуть по кнопке .


Отобразится окно проектов Project Explorer (рис. 4, с.14).
2. Щёлкнуть правой кнопкой мыши на элементе ЭтаКнига.
3. В появившемся контекстном меню (рис.5) выбрать команду Insert
> Module. В окно проектов приложения будет добавлен модуль
Module1 (рис. 6).
4. Щёлкнуть правой кнопкой мыши под строкой Options Explicit и в
появившемся ниспадающем меню выбрать п. Paste (Вставить).
В Модуль1 будет вставлена процедура ФункцияMsgBox.
39
5. Выполнить процедуру ФункцияMsgBox:
-команда Run | Run Sub/UserForm.
6. Проанализировать результаты выполнения процедуры, сравнив
их с кодом процедуры ФункцияMsgBox.
Примечание
В этой процедуре используется инструкция условного перехода
If…Then…Else, которая задает выполнение определенных групп ин-
струкций в зависимости от значения выражения. Она подробно рас-
сматривается в п. 2.12.4.1. Инструкция условного перехода
If…Then…Else учебного пособия Введение в VBA.doc.
Б. Excel 97–2003
1. Щёлкнуть по кнопке Редактор Visual Basic, а если эта кнопка
не отображается, то выполнить команду
Сервис|Макрос|Редактор Visul Basic

2. Выполнить пункты, аналогичные п.п. 2÷6 для Excel 2007–2010


4.2. Ввод данных
Ввод данных в MS Excel возможен тремя способами:
- в диалоге с клавиатуры,
- записью данных в таблицу Excel,
- используя внешние файлы.
4.2.1. Ввод данных в диалоге с клавиатуры
Функцию MsgBox целесообразно использовать в случае, если от
пользователя надо получить ответ типа Да–Нет или ОК–Отмена. Ес-
ли необходимо ввести число или текст, то применяется функция
InputBox. Функция MsgBox отображает запрос в диалоговом окне вво-
да, ожидает ввода пользователем строки (или щелчка по кнопке окна)
и возвращает строку из поля ввода окна.

1. Перейти на страницу 42 электронной версии Введение в


VBA.doc и изучить п.2.9.2. Функция InputBox.
40
2. Перейти на страницу 43 электронной версии Введение в
VBA.doc.
3. Скопировать текст процедуры ФункцияInputBox.
4. Войти в Excel.
5. Вызвать на экран окно проектов.
6. Вставить в модуль Module1 процедуру ФункцияInputBox.
7. Выполнить процедуру ФункцияInputBox:
-команда Run | Run Sub/UserForm.
8. Проанализировать результаты выполнения процедуры, срав-
нив их с кодом процедуры ФункцияInputBox.
Упражнение 2
Подсчитать площадь S прямоугольника со сторонами a, b, c по фор-
муле Герона:

S= p( p  a)( p  b)( p  c)
где p=(a+b+c)/2 , a=3, b=4, c=5.
На экран должны выводиться запросы вида ”Ведите значение a”,
”Ведите значение b”, ”Ведите значение d”, “Площадь треугольника
равна” <значение S>. Для этого использовать функцию VBA sqr:
S= sqr(p*(p-a)*(p-b)*(p-c))
4.2.2. Ввод данных в таблицу Excel
В этом способе данные вводятся в ячейки таблицы Excel непо-
средственно, без использования VBA. Для использования этих данных
в качестве исходных в процедуре VBA можно ссылаться на ячейки с
введёнными данными. Например, для присвоения значения перемен-
ной R значения ячейки A5 на текущем рабочем листе можно исполь-
зовать инструкцию R=Cells(5,1) или инструкцию R=Range(“A5”).
4.2.3. Использование внешних файлов
Использование внешних файлов (файлов VBA) подробно рас-
смотрено в п. 2.14. Файлы VBA пособия Введение в VBA.doc. В насто-
ящем практикуме они не рассматриваются.
4.2.4. Объединение текстовых строк
Если надо объединить несколько текстовых строк в одну, ис-
пользуется символ конкатенации &. Его применение, а также приме-
нение других символьных констант, используемых при выводе сооб-
щений, на экран показано в приведённой ниже процедуре Объедине-
ниеСтрок.
Sub ОбъединениеСтрок()
Dim Имя As String
Dim Сообщение As String
41
Имя = InputBox("Введите ваше имя: ")
'Следующая строка для окна сообщения объединяет
'слово "Привет" со значением переменной Имя
MsgBox "Привет, " & Имя & "!"
Сообщение = "Это пример объединения нескольких"
Сообщение = Сообщение & " строк в одну большую"
Сообщение = Сообщение & " строку." & vbNewLine
Сообщение = Сообщение & "vbNewLine - константа, позволяющая"
Сообщение = Сообщение & " начинать новую строку"
MsgBox Сообщение
End Sub
Упражнение 3
Скопируйте процедуру ОбъединениеСтрок в модуль VBA, за-
менив в ней имя пользователя на своё, введите произвольные данные
для переменной Сообщение и запустите процедуру на выполнение.
5. Инструкции перехода
Инструкции перехода часто используются в языках программи-
рования. В них проверяется соответствие каким-то условиям и в за-
висимости от этого выполнение программы направляется по одной
или другой ветви, или осуществляется безусловный переход в опре-
делённое место программы. В VBA предусмотрено две инструкции
условного перехода:If… Then... Else и Select Case и инструкция без-
условного перехода GoTo.
Упражнение 4
1. Изучите п. 2.12.4.1 Инструкции перехода и Инструкция услов-
ного перехода If…Then…Else пособия Введение в VBA.doc.
2. Скопируйте из указанного пособия и вставьте в модуль и выполни-
те процедуры IfThenElse, IfThenElse1, IfThenElse2, IfThenElse3 и
проанализируйте результат выполнения процедур.
Примечание
На уровне стандартного модуля, в котором находится процедура
IfThenElse2, помещена инструкция Option Compare Text. Инструкция
Option Compare применяется на уровне модуля перед первой проце-
дурой модуля для задания используемого по умолчанию способа
сравнения строковых данных.
Упражнение 5
Изучите инструкцию Option Compare Binary | Text | Database, которая
указывает способ сравнения строк (с.88-89 пособия).
Упражнение 6
Скопируйте в модуль VBA и выполните процедуру IfThenElse4 (с.89).
42
Упражнение 7
Составить процедуру определения количества проданных това-
ров в зависимости от цены товаров в соответствии с приведённой ни-
же таблицей.
Количество
Цена проданных
товаров
<=10 100
<=15 80
<=20 60
>20 50
В созданной процедуре
- использовать инструкцию If…Then... Else, содержащую ключе-
вое слово ElseIf;
- использовать функцию InputBox для ввода значений переменной
Цена.
Упражнение 8
1. Изучите п.2.12.4.2. Инструкция Select…Case
2. Скопируйте из пособия Введение в VBA.doc в модуль процедуру
Sub CaseSelect и выполните её при различных значениях ячейки
A6.
3. Составьте и выполните процедуру в соответствии с заданием
Упражнение 7, используя инструкцию Case Else.

6. Циклы
Циклы предназначены для многократного выполнения группы
инструкций. В VBA для организации циклов используются инструкции
For... Next, White…Wend, Do …Loop и For Each…Next.
Инструкция For... Next повторяет выполнение группы инструкций
указанное число раз.
Инструкция While…Wend выполняет некоторую последовательность ин-
струкций до тех пор, пока заданное условие имеет значение True (Истина).
Существует два типа инструкции Do…Loop: Do While и Do Until. Первый
из них повторяет выполнение блока инструкции до тех пор, пока заданное логиче-
ское условие истинно. Второй инструкция, Do Until выполняет циклические вычис-
ления до тех пор, пока изначально ложное логическое условие не станет истин-
ным.
Упражнение 9
1. Изучите п.2.12.3.1. пособия Введение в VBA.doc Инструкция
For… Next.
43
2. Скопируйте в модуль процедуры Sub TestFor,TestFor1 и TestFor2
из пособия (Пример1 п.2.12.3.1.) и выполните их c различными ко-
личествами нечётных чисел.
Упражнение 10
1. Составьте процедуру заполнения таблицы Excel с m строками и n
столбцами числами натурального ряда: 1, 2 , 3…и т.д., начиная с
ячейки A1 по столбцам аналогично тому, как это показано ниже.

Значения m и n ввести при помощи функции InputBox.


2. Составьте процедуру подсчёта суммы чисел, находящихся в ячей-
ках таблицы Excel на главной диагонали квадратной матрицы, по-
лученной в процедуре Упражнения 10 при m=n.

3. Составьте процедуру определения максимального значения среди


n чисел, находящихся в строке 1 таблицы Excel. Для этого предва-
рительно заполните несколько (больше n) ячеек первой строки ли-
ста Excel. Значение n ввести с клавиатуры в процессе выполнения
процедуры.

Упражнение 11
1. Изучите п.2.12.3.1. Инструкция While…Wend
2. Ознакомьтесь с инструкцией While…Wend п. 2.12..3.2. Инструкция
While…Wend и процедурой Sub TWW для подсчёта S чётных чисел
L натурального ряда, находящихся в пределах 0<L<10.
3. Составьте процедуру подсчёта суммы S нечётных чисел L нату-
рального ряда, находящихся в пределах 0<L<10, используя ин-
струкцию While…Wend.
4. Составьте процедуру определения максимального и минимального
значения числа в заданной строке листа Excel. Концом последова-
тельности просматриваемых ячеек является пустая ячейка (значе-
ние =””). При выполнении этой процедуры использовать свойство
рабочего листа Cells (см.п. 3. Адресация ячеек в VBA Excel).
Инструкция Do…Loop
Для выполнения инструкции For необходимо задать парамет-
ры. Эти параметры могут вычисляться или задаваться во время вы-
44
полнения программы, как в последней процедуре, которые точно
определяют, сколько раз должен выполняться инструкция цикла.
Иногда это свойство инструкции For является ограничительным, и в
этом случае VBA предлагает другую инструкцию - Do... Loop, кото-
рая также может организовать повторяющиеся вычисления, но мо-
мент прекращения вычислений здесь определяется с помощью ло-
гических условий.
Существует два типа инструкции Do…Loop: Do While и Do
Until. Первый из них повторяет выполнение блока инструкции до тех
пор, пока заданное логическое условие истинно. Вторая инструкция,
Do Until, выполняет циклические вычисления до тех пор, пока изна-
чально ложное логическое условие не станет истинным.

Упражнение 12
1. Изучите п. 2.12.3.3. Инструкция Do... Loop пособия
Введение в VBA.doc, скопируйте в модуль Excel процедуры
Sub DWU и Sub DUN, проанализируйте и выполните их.
2. Разработайте процедуру с использованием инструкции Do Until
для решения следующей задачи.
3. В таблице Excel, приведённой ниже, требуется определить фами-
лии студентов, получивших на экзамене хотя бы одну оценку
“Неуд”.
СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ
ВЕДОМОСТЬ

ИВАНОВ ХОР ОТЛ НЕУД


ПЕТРОВ ХОР НЕУД ХОР
СИДОРОВ ОТЛ НЕУД ОТЛ

Результаты представить в виде следующей таблицы:


Неудовлетворительные
оценки получили

ИВАНОВ
ПЕТРОВ
СИДОРОВ

Методические указания по выполнению Упражнения 12. п.2.

1. Скопируйте таблицу СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ ВЕ-


ДОМОСТЬ из настоящего пособия на Лист1, начиная с ячей-
ки A1. Эта таблица является примером её реализации; коли-
чество фамилий в общем случае =< 40.
2. Составьте алгоритм решения задачи в виде блок-схемы,
лучше – с комментариями. Реализация алгоритма в среде
VBA можно осуществить одной или несколькими процедура-
ми, используя инструкцию Call для их взаимодействия.
45
Например, оформление результатной таблицы можно вы-
полнить отдельной процедурой.
3. Явно объявите переменные, которые вы предполагаете ис-
пользовать в процедуре, в том числе переменные циклов.
4. Переменные, представляющие значения фамилий, являются
строковыми размером до 20 символов и должны объявлять-
ся как
String * 20.
5. Результатную таблицу рекомендуется разместить на том же
листе, на котором помещается СВОДНАЯ ЭКЗАМЕНАЦИ-
ОННАЯ ВЕДОМОСТЬ, начиная с ячейки H1.
6. Решение задачи можно осуществлять двумя способами: по-
мещать фамилии студентов, получивших неудовлетвори-
тельную оценку сразу в результатную таблицу или сначала
создать массив фамилий двоечников, а затем скопировать
их в результатную таблицу.
7. Концом списка фамилий является “пустая” строка, имеющая
значение “”. Это значение можно использовать для опреде-
ления конца списка в таблице Excel. Поскольку ячейка таб-
лицы Excel может содержать невидимые пробелы, для опре-
деления того, что строка является “пустой”, следует исполь-
зовать функцию VBA Trim, возвращающая значение ячейки
или переменной без начальных и конечных пробелов,
например, Trim(Cells(k, 1)), Trim(Фамилия).
8. Для просмотра исходного списка значений ячеек или масси-
ва фамилий следует использовать инструкцию Do Until, про-
веряющую, заполнена ли очередная ячейка таблицы или со-
ответствующая ей переменная.
7. Инструкция безусловного перехода GoTo
Инструкция GoTo изменяет ход выполнения программы без
проверки каких-либо условий, передавая управление на метку в коде.
Формат инструкции GoTo:
GoTo метка
Обязательный аргумент метка может быть текстовым или числовым.
Метка заканчивается символом двоеточие(:).

Упражнение 13
Скопируйте из п.2.12.4.3 учебного пособия Введение в VBA.doc,
проанализируйте и выполните процедуры БезУслПереход и
БезУслПереход2 при различных значениях переменной r.
46
8. Инструкции перехода к обработчику ошибок On
Инструкция On Error делает доступным обработчик ошибок и
определяет его положение внутри процедуры и используется также
для запрета обработки ошибок. Форматы и описание инструкции
On Error приведены в п. 2.12.4.4 пособия Введение в VBA.doc,.
Пользовательские обработчики ошибок позволяют реагировать
на ошибки во время работы пользователя, например, когда вместо
числа пользователь вводит текстовое данное или вообще не вводит
данное.
В процедуре ПримерOnErrorGoto, приведённой в п. 2.12.4.4,
возникает ошибка ввода до тех пор, пока не будет введено численное
значение переменной Num; управление передаётся на метку Ошибка,
и инструкция Resume возвращает управление инструкции
Num = InputBox("Введите число").
В процедуре ПримерOnErrorResumeNext, приведённой там же,
при возникновении ошибки ввода управление передаётся инструкции
If, и на экран выводится сообщение "Число не введено".
Упражнение 14
Скопируйте из п.2.12.4.4 учебного пособия Введение в VBA.doc,
проанализируйте и выполните процедуры ПримерOnErrorGoto,
ПримерOnErrorResumeNext и ПримерOnErrorGoto_0 при различных
значениях переменной Num (числовом и символьном).
В процедуре ПримерOnErrorGoto возникает ошибка ввода до тех
пор, пока не будет введено численное значение переменной Num;
управление передаётся на метку Ошибка, и инструкция Resume воз-
вращает управление инструкцииNum = InputBox("Введите число").
В процедуре ПримерOnErrorResumeNext при возникновении
ошибки ввода управление передаётся инструкции If, т.е. инструкции,
следующей за той, которая вызвала ошибку, на экран выводится со-
общение "Число не введено".
В процедуре ПримерOnErrorGoto_0 инструкция On Error GoTo 0
отключает пользовательский обработчик ошибок в данной процедуре
и может быть использована для восстановления нормальной обработ-
ки ошибок перед выходом из процедуры. При возникновении ошибки
ввода выводится следующее диалоговое окно, сообщающее о несоот-
ветствии типа данного введённому значению (“Пусто” или “Не число”).
47
9. Инструкции прерывания выполнения блока Exit
Имеются следующие варианты инструкции Exit.
 Инструкция Exit Do позволяет выйти из цикла Do…Loop.
 Инструкция Exit For позволяет выйти из цикла For…Next
или For Each…Next.
 Инструкция Exit Function позволяет выйти из функции, в
которой имеется данная инструкция.
 Инструкция Exit Sub позволяет выйти из процедуры Sub, в
которой имеется данная инструкция.

Упражнение 15
Скопируйте из п.2.12.4.5 учебного пособия Введение в VBA.doc,
проанализируйте и выполните процедуру ПримерExit. Эта процедура
использует инструкцию Exit для выхода из циклов For...Next и
Do...Loop и процедуры Sub. Символ двоеточие в ней используется
для разделения инструкций в одной строке кода. В этой процедуре ис-
пользуются две стандартные функции VBA:
- инструкция Rnd, генерирующая случайное число в виде
правильной десятичной дроби;
- инструкция Int, выделяющая целую часть числа.
В результате выполнения инструкции MyNum = Int(Rnd * 10) генериру-
ется целое случайное число.
Если значение случайного числа равно 3, то на экран выводит-
ся сообщение Case 3 и происходит выход из внутреннего цикла
For...Next для получения следующего случайного числа.
Если значение случайного числа равно 2, то на экран выводится
сообщение Case 2, происходит выход из внешнего цикла Do...Loop, на
экран выводится сообщение Цикл Do завершён и выполнение проце-
дуры завершается.
Если значение случайного числа равно 5, то на экран выводится
сообщение выполнение Case 5 и выполнение процедуры завершает-
ся.
10. Функции VBA
Функция - это подпрограмма, которая выполняет действия и
возвращает единственное значение. В VBA различают следующие ви-
ды функций (см.п. 2.13. учебного пособия Введение в VBA.doc,):
 встроенные функции,
 функции, определённые пользователем.
10.1. Встроенные функции
 математические функции,
 функции преобразования данных,
 функции даты и времени,
 строковые функции.
48
Форматы функций и действия, выполняемые ими, приведены в
п.2.13.1.Встроенные функции учебного пособия Введение в VBA.doc,,
Упражнение 16
Скопируйте в модуль VBA процедуры, находящиеся
в п. 2.13.1.5. Примеры использования функций VBA учебного по-
собия Введение в VBA.doc,: Встр_функции_1, Встр_функции_2,…,
Встр_функции_8, – выполните их, проанализируйте результаты вы-
полнения процедур, замените по вашему выбору значения констант,
являющихся значениями аргументов функции и/или введите значения
переменных, являющихся аргументами функций, при помощи функции
InputBox. Согласуйте свой выбор с преподавателем. Например, изме-
нённая процедура Встр_функции_8 может иметь вид:
Sub Встр_функции_8()
Dim Дата As Date
Дата = InputBox("Введите дату", "Ввод даты")
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
10.2. Функции, определённые пользователем
Функция, определённая пользователем, называемая также про-
цедурой-функцией, – это особый вид процедуры VBA, возвращающей
результат. Пользовательские процедуры-функции, как и встроенные
функции VBA, могут иметь необязательные и именованные аргумен-
ты. Для записи функции-процедуры нельзя использовать макрорекор-
дер, хотя можно редактировать записанный рекордером макрос и пре-
вращать его в функцию-процедуру.
Подробное описание функции, определённой пользователем, и
пример такой функции приведён в п.2.13.2. Функции, определённые
пользователем учебного пособия Введение в VBA.doc,.
Упражнение 17
Суть упражнения состоит в следующем. В приведённой ниже таблице
Суммы комиссионных
Компания Продажи Комиссионные Оплата
ЮГ 5 000,00р.
СЕВЕР 7 000,00р.
ВОСТОК 12 000,00р.
ЗАПАД 1 600,00р.
49
требуется подсчитать суммы комиссионных и оплаты. Суммы комис-
сионных подсчитываются в процедуре-функции Комиссионные, обра-
щение к которой осуществляется в процедуре Расчёт_Комиссионных
при помощи инструкции
Cells(i, 3) = Комиссионные(Cells(i, 2)),
параметром которой является сумма продаж, находящаяся в ячейках
Excel B3÷B6 (Cells(3, 2) – это ячейка в строке 3 в столбце 2 (B3) и т.п.).
Тексты процедуры Расчёт_Комиссионных и функции Комиссионные
приведены в п.2.13.2.1. Пример функции учебного пособия
Введение в VBA.doc,.

Ниже приведён пример заполненной таблицы исходными дан-


ными в столбцах Компания и Продажи.
50
10.3. Последовательность выполнения Упражнения 17
10.3.1. Скопировать в модуль VBA процедуру-программу
“Расчёт_Комиссионных” и процедуру-функцию “Комиссионные”
из пособия Введение в VBA.doc,п.2.13.2.1.
10.3.2. Ввести заголовок таблицы в ячейку A1.
10.3.3. Ввести заголовки таблицы Компания, Продажи, Комиссион-
ные, Оплата в ячейки A2, B2, C2, D2.
10.3.4. Заполнить исходными данными из примера колонки Компа-
ния и Продажи.
10.3.5. Выполнить процедуру “Расчёт_Комиссионных”. В результа-
те должна быть получена приведённая ниже таблица.
10.3.6. Суммы комиссионных
Компания Продажи Комиссионные Оплата
ЮГ 5 000,00р. 250 5 250,00р.
СЕВЕР 7 000,00р. 370 7 370,00р.
ВОСТОК 12 000,00р. 710 12 710,00р.
ЗАПАД 1 600,00р. 80 1 680,00р.
10.3.7. Проанализировать результаты выполнения процедуры и
сравнить их с инструкциями процедуры-программы
“Расчёт_Комиссионных” и процедуры-функции “Комиссион-
ные”.
10.3.8. Составить макрос, который выводит на текущий лист Excel
приведённую ниже таблицу без исходных данных, которые
должны вводиться в процессе работы с таблицей.

10.3.9.
Макрос создания этой таблицы целесообразно создать путём записи
действий пользователя, аналогично п. 2.1 или 2.2. настоящего посо-
бия. Необходимо записать в этот макрос следующие действия поль-
зователя:
- Ввод заголовка таблицы “Суммы комиссионных”.
- Отформатировать заголовок жирным шрифтом.
51
- Объединить ячейки A1÷D1.
- Отформатировать жирным курсивом заголовки колонок
таблицы.
- Установить автоподбор ширины колонок таблицы.
- Дать этому макросу название, например,
ФорматированиеТаблицы.
- Запустить макрос на выполнение и при необходимости его
отладить.
- Проанализировать полученный макрос и, по возможности,
упростить его, удалив инструкции, устанавливающие пара-
метры по умолчанию.
10.3.10. Вставить инструкцию Call <Имя-макроса> перед инструкци-
ей End Sub в процедуре “Расчёт_Комиссионных”.
10.3.11. Удалить полученные ранее таблицы, сформировать таб-
лицу:
Суммы комиссионных
Компания Продажи Комиссионные Оплата
ЮГ 5 000,00р.
СЕВЕР 7 000,00р.
ВОСТОК 12 000,00р.
ЗАПАД 1 600,00р.
и выполнить процедуру “Расчёт_Комиссионных”.
10.3.12. Составить пользовательскую функцию “Комиссионные_2”, в
которой вместо инструкции If…Then использовать инструкцию
Case, обратиться к ней в процедуре “Расчёт_Комиссионных”,
запустить эту процедуру на выполнение и отладить в случае
неоюходимости.
11. Формы пользователя
Формы пользователя – это диалоговые окна, предназначенные
для создания собственного интерфейса при работе с программными
модулями проекта, используя объект UserForm. При помощи форм
пользователя VBA , которые называются также экранными формами,
можно создавать диалоговые окна для вывода данных или получения
значений от пользователя в виде, требуемом программе пользовате-
ля. Хотя во многих случаях для этих целей можно применять функции
MsgBox и InputBox (или метод InputBox), при разработке сложных про-
ектов возможности их недостаточны. В экранных формах пользовате-
ля можно в одном диалоговом окне задавать сразу несколько опций,
выбирать пункты из списка или вводить несколько значений, наподо-
бие диалоговых окон приложений MS Office.
Упражнение 18
Для вставки экранной формы в приложение нужно выполнить
следующие действия.
52
1. Открыть рабочую книгу.
2. Войти в редактор Visual Basic, нажав комбинацию клавиш

<Alt+F11> или щёлкнув по кнопке в Excel 2007-2010 или по


кнопке в Excel 97-2003.
3. Если в окне проекта не появится окно Project – VBAProject, то
выбрать в меню View пункт Project Exsplorer.
4. В окне проекта щёлкнуть правой кнопкой мыши на элементе
ЭтаКнига.
5. В контекстном меню выполнить команду Insert>UserForm
(Вставка > Экранная форма). В рабочую книгу будет вставлена
экранная форма UserForm1 и Панель элементов ToolBoox
(рис.15).
53
Новая экранная форма представляет собой пустое окно со стро-
кой заголовка UserForm1. Это та основа, на которой пользователь мо-
жет создать собственные диалоговые окна и окна других типов. Если
панель ToolBoox не появится, нужно выбрать в меню View пункт Tool-
Boox или нажать кнопку на панели Microsoft Visual Basic.
Если окно свойств формы Properties – UserForm1 не появится,
то для установки свойств формы нужно выполнить команду
View | Properties Windows или нажать клавишу F4.
Окно ToolBoox можно при необходимости переместить в любое
место окна UserForm.
Упражнение 19
Изучить п.2.11.1. – 2.11.2 учебного пособия Введение в VBA.doc,.
и выполнить находящиеся в них процедуры по указанию преподавате-
ля.
Упражнение 20 1
Создать пользовательскую форму, в которой размещены эле-
менты управления Label (надпись), CommandButton (кнопка управ-
ления). При нажатии на кнопку “Запуск” будет генерироваться случай-
ное число. Это число должно отображаться в элементе Label
(надпись). Затем вычислим корень квадратный из этого числа, его си-
нус и косинус, а результаты выведем в другие элементы управления
Label (надпись). Кроме этого, в форме выводится текущая дата. При
нажатии на кнопку “Выход” форма удаляется с экрана. Для запуска
формы на листе Excel необходимо создать кнопку с надписью “Функ-
ции VBA”.

Порядок работы:
1. Запустить Excel.
2. Загрузить VBA:
– в Excel 2007-10:
вкладка Разработчик | пункт меню Insert | UserForm
– в Excel 97-3003:
Сервис | Макрос | Редактор Visual Basic | Insert | UserForm.
3. Проверить, чтобы на экране появилось окно проекта и окно свойств.
Форму можно увеличить стандартным способом, ухватившись за пра-
вый нижний угол и растягивая ее.
4. Сделать появившуюся форму активной и установить значения
свойств данного объекта:

1
Пример упражнения взят из работы: О.А. Житкова, Т.И. Панфилова. VBA в приложении к
Excel, Word и Power Point ( http://inf.1september.ru/2006/01/03.htm )
54

5. Добавить в форму средства управления. При разработке потребу-


ется два инструмента: Label (надпись) и CommandButton
(кнопка управления) с панели элементов. Форма с элементами
управления в режиме конструктора примет следующий вид:

6. Для вывода результатов расчета подготовить элементы Label1,


Label2, Label3, Label4. Для этого необходимо установить значения
свойств объекта Label1 ÷ Label4:
55
7. Для пояснительных надписей установить значения свойств эле-
ментов Label5, Label6, Label7, Label8:

8. Для вывода текущей даты установить значения свойств элемента


Label9:

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


применив элемент управления CommandButton1 и установить зна-
чения свойств объекта CommandButton1:

10. Добавить в форму командную кнопку для закрытия формы, при-


менив элемент управления CommandButton2, и установить значе-
ния свойств объекта CommandButton2:
56
После выполнения всех пунктов форма в режиме конструктора будет
выглядеть так:

11. Проверить работу формы. Для вывода формы на экран выполнить


команду Run | Run Sub/UserForm или нажать клавишу . На фоне
листа Excel появится созданная форма, но при нажатии на кнопку
“Запуск” или “Выход” ничего не произойдет, т.к. не запрограммиро-
ван отклик на событие (нажатие кнопки). Закрыть форму и в войти в
редактор VBA.
12. В форме дважды щелкнуть на кнопке “Запуск”, чтобы вывести за-
готовку программы, связанную с командной кнопкой.

Программа начинается с заголовка Private Sub (локальная процедура)


и заканчивается предложением End Sub (конец процедуры). Между
этими предложениями записывается текст программы.
57
13. Написать тексты процедур, обеспечивающих работу с формой.
Private Sub CommandButton1_Click()
Randomize
Label9.Caption = Date
Label1.Caption = Int((Rnd * 90) + 1)
Label2.Caption = Sqr(Label1.Caption)
Label3.Caption = Cos(Label1.Caption * 3 / 14 / 180)
Label4.Caption = Sin(Label1.Caption * 3 / 14 / 180)
End Sub
Проанализируем текст программы. Синтаксис установки значе-
ния свойства объекту имеет вид:
Объект.Свойство = ЗначениеСвойства.
Каждая строка программы содержит название объекта, его свойство
(левая часть строки, до равенства) и установку значения свойства
(правая часть строки, после знака равенства).

 Label — объект.
 Caption — свойство.
 Date — значение свойства (текущая дата).
 Инструкция Randomize инициализирует генератор случайных чи-
сел.
 Rnd * 90 — значение свойства. Функция генерации случайных
чисел Rnd генерирует случайное число между 0 и 1.
 Функция Int возвращает целую часть аргумента (в данном случае
– произведение случайного числа на 90) и отбрасывает дробную
часть аргумента. Результат – числа от 1 до 90.
 Sqr(Label1.Caption). Sqr – функция извлечения квадратного кор-
ня. Так как случайное число сохранилось в объекте Label1, то
применяется функция Sqr, аргументом которой является объект,
в котором хранится случайное число.
 Sin(Label1.Caption * 3.14159 / 180) — аргумент функции синус
рассматривается в радианах, но для того, чтобы было привыч-
нее анализировать полученные результаты, применим формулу
для преобразования градусов в радианы, т.е. преобразуем слу-
чайное число (градусы) в радианы и получим результат.

14. Вывести форму на экран, нажав клавишу (F5), и проверить ра-


ботоспособность кнопки “Запуск”. Результат выполнения програм-
мы показан на рисунке.
58

15. Составить процедуру для кнопки “Выход”. Для этого нужно перей-
ти в редактор VBA и дважды щелкнуть по кнопке “Выход” в форме.
Появится заготовка программы:

Private Sub CommandButton2_Click()

End Sub

в которую нужно вставить одну строку программы – UserForm1.Hide,


в которой:
 UserForm1 — это объект.
 Hide — это метод:

Private Sub CommandButton2_Click()


UserForm1.Hide
End Sub
Кроме запуска программы по нажатию клавиши (F5), суще-
ствует еще один способ вывода формы на экран. Для этого:
1. Перейти в приложении Excel на любой лист.
Excel 2007-10
На вкладке “Разработчик” в группе “Элементы управления”
щёлкнуть по кнопке “Вставить” и в ниспадающем меню щёлкнуть На
панели инструментов управления “Элементы управления формы”
щёлкнуть по элементу “Кнопка(элемент управления формы)” и начер-
59

тить курсором, принявшим вид “+”, в любом месте рабочего ли-


ста кнопку, переименовать её по смысловому содержанию
вызываемого макроса, щёлкнуть правой кнопкой мыши по кноп-
ке, выбрать п. “Назначить макрос…”, в диалоговом окне “Назначить
макрос объекту” дать имя макросу “CommandButton2_Click” или оста-
вить предлагаемое по умолчанию.
Excel 98-2003
В меню “Вид” выбрать пункт “Панели инструментов”, в раскрываю-
щемся списке выбрать пункт “Элементы управления”,

щелкнуть левой кнопкой мыши на панели управления элемент “Кноп-


ка”, нарисовать крестообразным курсором кнопку, которой Excel по
умолчанию присвоит имя “CommandButton1”:

2. Вызвать свойства этого элемента, нажав на панели элементов


управления кнопку “Свойства” .
3. Установить значения свойств объекта CommandButton1.

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

кнопку можно переместить мышью в любое место рабочего листа.


4. Составить процедуру, которая будет выполняться при щелчке мы-
шью по кнопке “Функции VBA”. Для этого нужно вызвать заготовку
программы, нажав на панели элементов управления кнопку “Исход-
ный текст”

не забыв перед этим выделить кнопку “CommandButton1”.


60
5. Вставить одну строку программы – UserForm1.Show, что означает
“Показать форму UserForm1 на экране”.
В этой строке:
 UserForm1 – объект.
 Show – метод.
6. Затем перейти на лист приложения Excel и отключить режим кон-
структора на панели элементов управления .
7. Щёлкнуть мышью по кнопке UserForm1; на рабочий лист будет вы-
ведена пустая форма:

8. Щёлкнуть по кнопке “Запуск” для запуска процедуры


CommandButton1_Click(); на экране появятся результаты выполне-
ния этой процедуры, зависящие от значения случайного числа. При
многократном нажатии кнопки “Запуск” будут появляться различные
значения случайного числа и, следовательно, различные значения
вычисляемых функций.
При щелчке по кнопке “Выход” форма будет удалена с экрана.
9. Сохранить работу.
61

Упражнение 21
1.Спроектировать экранную форму для вывода в неё значений
итоговых сумм продаж магазинами СТРЕЛА, АВАНГАРД и САЛЮТ. Зна-
чения исходных данных задаются произвольными и количество за-
полненных строк заранее не определено. Таблицу следует разместить
на рабочем листе Excel.
2. Спроектировать кнопку на рабочем листе для вывода формы
на экран.

СУММЫ ПРОДАЖ ТОВАРОВ МАГАЗИНАМИ

№№ Дата СТРЕЛА АВАНГАРД САЛЮТ


п/п продажи

Форма должна иметь следующий вид (числа условные):

СУММЫ ПРОДАЖ ТОВАРОВ МАГАЗИНАМИ

СТРЕЛА
1200000

АВАНГАРД
1500000

САЛЮТ
1450000

ПУСК ВЫХОД
62
Количество строк с исходными данными определяется по усло-
вию, что в очередной просматриваемой строке значение реквизита
“Дата продажи” есть “Пусто”, т.е. равно “”.
При щелчке мышью по кнопке “ПУСК” должны заполняться зна-
чения поля формы со значениями итоговых сумм, а по кнопке “ВЫ-
ХОД” форма должна закрываться.
Оглавление
Предисловие .............................................................................................................................. 1
1. Создание процедур ............................................................................................................ 2
1.1. Ввод кода с клавиатуры ............................................................................................ 2
А. Excel 2007–2010 ........................................................................................................... 2
Excel 2007 .............................................................................................................................. 3
Excel 2010 .............................................................................................................................. 3
Установка уровня безопасности ....................................................................................... 3
Выполнение процедуры .................................................................................................... 8
Сохранение процедуры ..................................................................................................... 9
Б. Excel 97 – 2003 ................................................................................................................ 11
Выполнение процедуры .................................................................................................. 15
Сохранение процедуры ................................................................................................... 16
Получение контекстно-зависимой справки VBA .......................................................... 17
Dim Statement .......................................................................................................................... 17
2.1. Запись последовательности действий пользователя .................................................. 18
2.1.1. Excel 2007................................................................................................................. 18
2.1.1.1. Ввод заголовка и “шапки” таблицы .................................................................... 19
2.1.1.2. Ввод расчётных формул ...................................................................................... 24
2.1.1.3. Форматирование таблицы ................................................................................... 25
2.1.1.4. Ввод данных......................................................................................................... 26
2.2. Excel 97–2003 ............................................................................................................... 28
2.2.1. Запись последовательности действия пользователя .............................................. 28
2.2.2. Ввод заголовка и “шапки” таблицы ........................................................................ 29
2.2.3. Ввод расчётных формул .......................................................................................... 34
2.2.4. Форматирование таблицы ....................................................................................... 35
2.2.5. Ввод данных ............................................................................................................ 35
3. Адресация ячеек в VBA Excel ........................................................................................ 37
4. Вывод сообщений и ввод данных................................................................................... 38
4.1. Вывод сообщений на экран ........................................................................................ 38
А. Excel 2007–2010 .......................................................................................................... 38
Б. Excel 97–2003 .............................................................................................................. 39
4.2. Ввод данных ................................................................................................................ 39
4.2.1. Ввод данных в диалоге с клавиатуры .................................................................... 39
4.2.2. Ввод данных в таблицу Excel.................................................................................. 40
4.2.3. Использование внешних файлов............................................................................. 40
4.2.4. Объединение текстовых строк ................................................................................ 40
5. Инструкции перехода..................................................................................................... 41
6. Циклы .............................................................................................................................. 42
7. Инструкция безусловного перехода GoTo .................................................................... 45
8. Инструкции перехода к обработчику ошибок On ......................................................... 46
9. Инструкции прерывания выполнения блока Exit ......................................................... 47
10. Функции VBA.............................................................................................................. 47
10.1. Встроенные функции............................................................................................... 47
63
10.2. Функции, определённые пользователем................................................................. 48
10.3. Последовательность выполнения Упражнения 17 ................................................. 50
11. Формы пользователя ................................................................................................... 51

Вам также может понравиться