Академический Документы
Профессиональный Документы
Культура Документы
Предисловие
Данное пособие имеет целью практическое освоение основ про-
граммирования на языке 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 осуществляется
при помощи “Ленты”, отображение которой приведено ниже.
Excel 2007
Excel 2010
1. На вкладке Файл выбрать Параметры, чтобы открыть диалого-
вое окно Параметры Excel.
2. Щелкнуть Настройка ленты в левой части диалогового окна.
3. В разделе Выбрать команды из, расположенном слева в окне,
выбрать Популярные команды.
4. В разделе Настройка ленты, который находится справа в диа-
логовом окне, выбрать Основные вкладки, а затем установить
флажок Разработчик.
5. Нажать кнопку ОК.
Рис.2
Щёлкнуть по кнопке “Безопасность макросов” .
4
2. В появившемся окне “Центр управления безопасностью” (рис.3) в
группе “Параметры макросов” выбрать переключатель “Включить
все макросы (не рекомендуется, возможен запуск опасной про-
граммы)” и нажать кнопку ОК.
Выполнение процедуры
После создания процедуры её можно сразу выполнить. Это мож-
но сделать одним из двух способов:
- использовать команду Run Sub/UserForm из меню Run,
- нажать клавишу <F5>.
Выполним процедуру Начало_VBA первым способом:
1. Выбрать пункт Run стандартной панели инструментов редакто-
ра Visual Basic (рис.14)
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).
Выполнение процедуры
После создания процедуры её можно сразу выполнить. Это мож-
но сделать одним из двух способов:
16
1. использовать команду Run Sub/UserForm из меню Run,
2. нажать клавишу <F5>.
Выполним процедуру Начало_VBA первым способом.
1. Выбрать пункт Run стандартной панели инструментов редактора
Visual Basic (рис.11)
Примечание
После начала записи действий пользователя в макрос кнопка
Запись макроса поменяется на кнопку Остановить запись .
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).
1
См. Примечание на предыдущей странице
25
2.1.1.3. Форматирование таблицы
Для выполнения действий, перечисленных ниже в п.п. 1÷11 сле-
дует использовать пиктограммы групп Шрифт и Выравнивание
на вкладке Главная.
Итого:
Поставка товаров
Код Наименование Единица Цена Количество Сумма
товара товара измерения
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)
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
Упражнение 1
Спроектировать макрос, результатом работы которого является по-
лучение макета таблицы “Продажи”, представленной на рис.17.
Значение в графе “Сумма” равно произведению реквизитов “Цена”
и “Количество продано”, а в строке “Итого” – сумме этих произведе-
ний.
Продажи
№№ Наименование Количество
п/п товара Цена продано Сумма
Итого:
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 по столбцам аналогично тому, как это показано ниже.
Упражнение 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, приведённой ниже, требуется определить фами-
лии студентов, получивших на экзамене хотя бы одну оценку
“Неуд”.
СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ
ВЕДОМОСТЬ
ИВАНОВ
ПЕТРОВ
СИДОРОВ
Упражнение 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,.
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, нажав комбинацию клавиш
Порядок работы:
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
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) — аргумент функции синус
рассматривается в радианах, но для того, чтобы было привыч-
нее анализировать полученные результаты, применим формулу
для преобразования градусов в радианы, т.е. преобразуем слу-
чайное число (градусы) в радианы и получим результат.
15. Составить процедуру для кнопки “Выход”. Для этого нужно перей-
ти в редактор VBA и дважды щелкнуть по кнопке “Выход” в форме.
Появится заготовка программы:
End Sub
Упражнение 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