Описание лабораторной работы № 9

advertisement
ЛАБОРАТОРНАЯ РАБОТА № 9.
VBA – РАБОЧИЙ ЯЗЫК EXCEL
Рабочим языком для большинства приложений фирмы Microsoft (в том числе, для
Word и Excel) в последнее время стала версия Visual Basic с названием VBA. В
приложении Microsoft Excel этот язык применяется, начиная с версии Microsoft Excel 5.
VBA соединяет в себе все положительные черты самого простого языка
программирования Visual Basic со всеми вычислительными возможностями приложения
Microsoft Excel. VBA имеет полный доступ ко всем командам и структурам приложения
Microsoft Excel.
Дальнейшее изложение материала ориентировано на читателя, ознакомленного с
программированием на Visual Basic.
Для знакомства с VBA вам будет предложено записать с помощью приложения
Microsoft Excel некоторую последовательность действий. В приложении Microsoft Excel
есть средство, называемое макрорекордером, которое записывает все производимые вами
действия над рабочим листом и интерпретирует их как процедуру VBA (макрос).
Выполняя эту процедуру, можно повторно воспроизвести записанные действия, что
может быть полезно при форматировании книги Microsoft Excel.
1. Подготовка к записи и запись процедуры
Перед запуском макрорекордера следует подготовить рабочий лист, произведя все
действия, которые не нужно включать в процедуру. Это такие действия, как создание
нового рабочего листа или перемещение в конкретную часть листа. Когда вы начнете
запись, все, что вы сделаете в приложении Microsoft Excel, будет записано в процедуре.
1. Запустите приложение Microsoft Excel и выберите команду Сохранить из панели
быстрого доступа или из меню кнопки Office.
2. Для того чтобы новую книгу можно было сохранить вместе макросами, необходимо
изменить расширение файла на xlsm – книга Excel с поддержкой макросов. В
появившемся окне Сохранение документа с помощь кнопки Создать папку создайте
на диске d свою рабочую папку, в поле Тип файла выберите нужный тип и сохраните
файл Книга1 под именем VBA.xlsm.
3. Переименуйте Лист 1 в Макрос.
4. Нажмите кнопку Запись макроса, которая находится в группе Код на вкладке
Разработчик. Появится диалоговое окно Запись макроса (см. рис. 1), в котором
можно установить параметры записываемой процедуры.
5. В поле Имя макроса введите Расчет_стоимости. Обратите внимание на то, что имя
макроса может содержать только буквы, цифры и знаки подчёркивания.
6. В поле Описание введите текст, поясняющий назначение макроса: Вычисление
стоимости с учётом скидки.
7. Поле Сочетание клавиш предназначено для записи клавиши, нажатие на которую
вмести с клавишей Ctrl, приведет к запуску макроса. Не заполняйте пока это поле.
8. Нажмите кнопку ОК чтобы начать запись макроса. Кнопка Запись макроса в группе
Код на вкладке Разработчик заменится на кнопку Остановить запись, с помощью
которой можно будет остановить запись после выполнения всех необходимых
действий. Все действия, которые вы произведете до нажатия этой кнопки, в том
числе повторяющиеся и отмены действий, будут записаны в макрос!
9. Чтобы выключить отображение сетки на листе Microsoft Excel, снимите флажок
Сетка, который находится с группе Показать или скрыть на вкладке Вид.
10. В ячейку B5 введите текст «Розничная цена:» и нажмите клавишу Enter.
11. В ячейку B7 введите текст «Размер скидки:» и нажмите клавишу Enter.
12. В ячейку B9 введите текст «Цена с учётом скидки:» и нажмите клавишу Enter.
Рис. 1. Диалоговое окно «Запись макроса»
13. Расширьте столбец B так, чтобы текст в ячейке B9 полностью отображался внутри
столбца B. Для этого поместите указатель мыши на вертикальную черту между
заголовками столбцов B и C и дважды щелкните по ней или перетащите её.
14. Выделите диапазон B5:C9 и установите в нем выравнивание текста по правому краю.
15. В ячейке C5 установите денежный формат в рублях с двумя разрядами дробной части.
16. Перейдите на вкладку Главная и нажмите кнопку, которая находится в правом
нижнем углу группы Число, для вызова полного диалога форматирования ячеек. В
появившемся диалоге перейдите на вкладку Защита и снимите флажок Защищаемая
ячейка. Это позволит изменять значение в ячейке C5 после установки защиты всего
листа. Нажмите кнопку ОК.
17. В ячейке C7 установите процентный формат с двумя разрядами дробной части.
18. Задайте размер скидки, введя значение 5 в ячейку C7 и нажав клавишу Enter.
19. В ячейке C9 установите денежный формат в рублях с двумя разрядами дробной части.
20. Введите в эту ячейку формулу =(1-C7)*C5.
21. Для защиты листа от изменений нажмите кнопку Защитить лист, которая находится
в группе Изменения на вкладке Рецензирование. Появится диалоговое окно, которое
позволяет установить пароль для снятия защиты и разрешить или запретить
некоторые действия с листом (см. рис. 2). Нажмите кнопку ОК.
22. Ваш рабочий лист теперь должен выглядеть так, как показано на рис. 3. Для остановки
записи щелкните на кнопке Остановить запись в группе Код на вкладке
Разработчик.
23. Проверьте правильность работы созданной вами таблицы. Введите в ячейку C5
значение 100 и нажмите клавишу Enter. В ячейке C5 должно отобразиться значение
100,00р., а в ячейке C7 – появиться результат 95,00р.
Рис. 2. Диалог установки защиты листа
Рис. 3. Вид рабочего листа перед окончанием записи макроса
24. Теперь можно посмотреть процедуру, которая получилась в результате записи.
Нажмите кнопку Макросы, которая находится в группе Код на вкладке Разработчик.
Выделите имя вашего макроса в предлагаемом списке и нажмите кнопку Изменить.
25. Появится окно редактора Visual Basic с кодом процедуры (см. рис. 4). Обратите
внимание: Visual Basic здесь не является отдельным приложением. Он входит в состав
приложения Microsoft Excel. Ниже приведен текст записанной процедуры.
Sub Расчет_стоимости()
'
' Расчет_стоимости Макрос
' Вычисление стоимости с учётом скидки
'
ActiveWindow.DisplayGridlines = False
Range("B5").Select
ActiveCell.FormulaR1C1 = "Розничная цена:"
Range("B7").Select
ActiveCell.FormulaR1C1 = "Размер скидки:"
Range("B9").Select
ActiveCell.FormulaR1C1 = "Цена с учётом скидки:"
Columns("B:B").EntireColumn.AutoFit
Range("B5:C9").Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Range("C5").Select
Selection.NumberFormat = _
"_-* #,##0.00[$р.-419]_-;-* #,##0.00[$р.-419]_-;_-* ""-""??[$р.-419]_-;_-@_-"
Selection.Locked = False
Selection.FormulaHidden = False
Range("C7").Select
Selection.Style = "Percent"
Selection.NumberFormat = "0.00%"
ActiveCell.FormulaR1C1 = "5%"
Range("C9").Select
Selection.NumberFormat = _
"_-* #,##0.00[$р.-419]_-;-* #,##0.00[$р.-419]_-;_-* ""-""??[$р.-419]_-;_-@_-"
ActiveCell.FormulaR1C1 = "=(1-R[-2]C)*R[-4]C"
Range("C10").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Рис. 4. Окно редактора Visual Basic с кодом записанного макроса
26. Сравните записанный код с выполненными при записи макроса действиями. Как
можно заметить, каждому выполненному действию соответствует одна или более
строк процедуры.
 Первое, что вы сделали, когда начали запись процедуры – отключили отображение
сетки активного рабочего листа. Этому действию соответствует следующая строка
процедуры.
ActiveWindow.DisplayGridlines = False
Эта инструкция VBA задает значение False свойству DisplayGridlines (Отображать
сетку) объекта ActiveWindow (Активное окно). Активное окно – это то окно, в
котором находится фокус ввода. Необязательно помещать в код макроса имя
рабочего листа, с которым он должен работать, если этот лист является активным.
Благодаря этому макрос может применяться не только к одному рабочему листу, а
к любому активному рабочему листу.
 Следующие строки программного кода выделяют ячейку B5 и помещают в нее
текст «Розничная цена:». Затем выделяются ячейки B7 и B9 и в них помещается
соответствующий текст.
Range("B5").Select
ActiveCell.FormulaR1C1 = "Розничная цена:"
Range("B7").Select
ActiveCell.FormulaR1C1 = "Размер скидки:"
Range("B9").Select
ActiveCell.FormulaR1C1 = "Цена с учётом скидки:"
В VBA отдельная ячейка рабочего листа не является объектом, а диапазон ячеек,
например, Range("B2:D3"), является объектом даже тогда, когда он состоит из
одной ячейки, например, Range("A1"). Метод Select (Выделить) активизирует
ячейки, указанные как аргументы объекта Range. Ссылкой на активную ячейку
является ActiveCell (Активная ячейка). Свойство FormulaR1C1 ячейки
предназначено для записи в ячейке формулы.
 Следующая далее строка программного кода процедуры выполняет выделение
столбца B и изменяет его ширину.
Columns("B:B").EntireColumn.AutoFit
Один или более столбцов можно выделить с помощью метода Columns (Столбцы).
Ссылка на столбцы является аргументом этого метода. Аналогичным образом
можно выделить одну или несколько строк с помощью метода Rows (строки).
EntireColumn – это свойство, которое используется для представления всего
столбца. Метод AutoFit позволяет выполнить автоматическую подгонку ширины
столбца. Можно также использовать свойство ColumnWidth (Ширина столбца),
чтобы установить заданную ширину для выделенных столбцов.
 Затем мы установили выравнивание по правому краю для ячеек B5:C9. Это было
сделано с помощью следующих строк программного кода.
Range("B5:C9").Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Нас интересовало только выравнивание по правому краю, но макрорекордер
записывает установку всех свойств. В принципе, лишние строки можно удалить.
27. Сравните инструкции дальнейшей части кода процедуры с выполненными при записи
макроса действиями. После сделанных пояснений вам должно быть понятно
назначение инструкций заключительной части кода. Обратите внимание на то, как
записана введённая формула: в ней указаны не конкретные ячейки, а их положение
относительно ячейки с формулой.
2. Выполнение макроса
Записанный макрос можно выполнить различными способами: вызвать его через
диалог Макросы, использовать сочетание клавиш, добавить кнопку на панель быстрого
доступа, создать специальный объект на рабочем листе (например, кнопку).
Для начала вызовем записанный макрос через диалог Макросы.
28. Создайте новый лист и назовите его Диалог.
29. Нажмите кнопку Макросы, которая находится в группе Код на вкладке Разработчик.
Появится диалоговое окно Макрос, содержащее имена всех доступных в данный
момент макросов. С его помощью можно выполнять, изменять и удалять макросы.
30. Выделите макрос Расчет_стоимости и нажмите кнопку Выполнить. Процедура
будет выполнена. После этого текущий рабочий лист будет выглядеть так же, как и
предыдущий.
Теперь назначим нашему макросу сочетание клавиш.
31. Снова нажмите кнопку Макросы, которая находится в группе Код на вкладке
Разработчик. В появившемся диалоговом окне Макрос выделите макрос
Расчет_стоимости и нажмите кнопку Параметры…. Вы увидите ещё одно
диалоговое окно, которое позволяет задать макросу сочетание клавиш и изменить
описание макроса. В поле рядом с надписью Ctrl+ введите любой символ –
соответствующая клавиша будет использоваться для вызова макроса при нажатой
клавише Ctrl. Выбранное сочетание клавиш заменит все совпадающие стандартные
сочетания клавиш приложения Microsoft Excel на то время, пока книга, содержащая
данный макрос, открыта.
32. Создайте новый лист, назовите его Сочетание клавиш и нажмите выбранное
сочетание клавиш. Макрос снова должен быть выполнен.
Если вы предполагаете часто использовать созданный макрос, можно добавить
кнопку для его вызова на панель быстрого доступа.
33. Нажмите кнопку Настройка панели быстрого доступа , которая находится справа
от панели быстрого доступа. В появившемся меню выберите пункт Другие
команды… В диалоговом окне Параметры Excel в выпадающем списке Выбрать
команды из: выберите Макросы, в нижележащем списке выберите имя созданного
макроса и нажмите кнопку Добавить. Нажмите кнопку ОК для завершения настройки
панели быстрого доступа.
34. Создайте новый лист, назовите его Панель быстрого доступа и попробуйте
использовать новую кнопку.
Макрос можно также связать с объектом на рабочем листе. Чаще всего в качестве
такого объекта используют кнопку. Однако можно назначить выполнение процедуры
практически любому объекту, помещенному на рабочем листе, включая диаграммы и
нарисованные объекты.
35. Создайте новый лист, назовите его Кнопка. Нажмите кнопку Вставить, которая
находится в группе Элементы управления на вкладке Разработчик. Из
появившегося списка выберите Кнопка (элемент управления формы) и нарисуйте
кнопку где-нибудь в левом верхнем углу листа. В появившемся диалоговом окне
Назначить макрос объекту выделите макрос Расчет_стоимости и нажмите кнопку
ОК.
36. Выделите надпись на кнопке и наберите новое название, например, «Расчет
стоимости». Для снятия выделения с объекта (в данном случае, с кнопки) нужно
щелкнуть на рабочем листе вне границ объекта. Теперь нажатие кнопки приведет к
запуску связанного с ней макроса. Для выделения кнопки без выполнения макроса
нужно щелкнуть по ней левой кнопкой мыши при нажатой клавише Ctrl или правой
кнопкой мыши для вызова контекстного меню.
37. Снимите выделение с только что созданной кнопки и нажмите её. Должен
выполниться макрос Расчет_стоимости.
3. Редактирование макроса
Полученный в результате записи текст процедуры можно изменить для достижения
той или иной цели, применяя инструкции Visual Basic.
38. Если вы попытаетесь снова запустить созданный макрос на рабочем листе, на котором
макрос уже выполнялся, возникнет ошибка из-за установленной защиты листа. Чтобы
избежать этого добавьте в начало процедуры команду ActiveSheet.Unprotect.
Теперь макрос будет самостоятельно снимать защиту листа.
39. Предположим, что вы хотите не использовать фиксированный размер скидки, а
задавать его при выполнении макроса. В коде процедуры Расчет_стоимости
замените
инструкцию
ActiveCell.FormulaR1C1 = "5%"
на
инструкцию
ActiveCell.FormulaR1C1 = InputBox("Введите процент скидки").
Сохраните
процедуру.
40. Создайте новый лист и назовите его Ввод скидки. Выполните макрос для проверки
внесённых изменений. В появившемся диалоговом окне введите значение скидки в
виде десятичной дроби 0,3 (соответствует 30%) и нажмите кнопку ОК. Если вы не
сделали ошибки, то новый лист будет заполнен, а в ячейке C7 появится значение
скидки 30,00%.
Предположим, что размер скидки ограничен, например, он не должен превышать
50%. Внесем в процедуру такие изменения, чтобы выполнялась проверка размера скидки.
Если введенная скидка больше 50%, то ячейка должна быть очищена, формирование
рабочего листа приостановлено, подан сигнал, а также выведено соответствующее
предупреждение. Если же размер скидки в норме, то должно быть завершено
формирование рабочего листа и выведено подтверждающее сообщение.
41. В коде процедуры Расчет_стоимости замените инструкцию ActiveSheet.Protect
DrawingObjects:=True, Contents:=True, Scenarios:=True на следующий набор
инструкций:
Range("C7").Select
If Val(ActiveCell.FormulaR1C1) > 0.5 Then
MsgBox ("Величина скидки не должна превышать 50%")
ActiveCell.Clear
Beep
Else
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
MsgBox ("Формирование листа закончено")
End If
42. Обратите внимание на применение стандартной функции Val(Аргумент строчного
типа), которая выполняет преобразование аргумента типа строки в число типа Double.
VBA, в отличие от Visual Basic, сам не выполняет преобразование в выражениях
операнда строчного типа в число, а операнда числового типа в строку. За
соответствием типов операндов выражения обязан следить программист. При
необходимости преобразовать число в строку используется стандартная функция
Str(Аргумент любого числового типа).
43. Сохраните процедуру.
44. Создайте новый лист и назовите его Проверка скидки. Выполните макрос для
проверки внесённых изменений.
45. Задайте значение скидки равным 0,6 (соответствует 60%) и нажмите кнопку ОК. Если
всё было сделано правильно, должно появиться сообщение об ошибке и ячейка со
скидкой должна быть очищена.
46. Попробуйте задать процент скидки равным 40%.
4. Работа с ячейками, диапазонами и листами
До сих пор рассматривались изменения данных в активной ячейке и на текущем
рабочем листе. Иногда требуется вводить данные на другой лист. Предположим,
например, что после выполнения расчета стоимости необходимо заполнить накладную.
Создайте процедуру, копирующую значения ячеек одного листа в ячейки другого листа.
47. Создайте новый лист.
48. Выполните макрос Расчет_стоимости, введя допустимую величину скидки 30%.
Введите значение розничной цены.
49. Чтобы создать новую процедуру, нажмите кнопку Макросы в группе Код на вкладке
Разработчик. В появившемся диалоговом окне в поле Имя макроса введите название
создаваемой процедуры Создать_Накладную и нажмите кнопку Создать.
50. В открывшемся окне редактора введите следующий текст процедуры:
Sub Создать_Накладную ()
'Дадим активному листу имя Расчет
ActiveSheet.Name = "Расчет"
'Добавим рабочий лист после текущего
Worksheets.Add After:=ActiveSheet
'Дадим только что добавленному листу имя Накладная
ActiveSheet.Name = "Накладная"
'Введем в ячейку C1 значение "Накладная"
Range("C1").Value = "Накладная"
'Установим в ячейке C1 шрифт полужирный, 18, курсив
Range("C1").Font.Bold = True
Range("C1").Font.Size = 18
Range("C1").Font.Italic = True
'Введем данные в ячейки A3, A4 и A5
Range("A3").Value = " Склад № 5"
Range("A4").Value = " ул. Энергетическая, 1"
Range("A5").Value = " Москва, Российская Федерация"
'Введем данные в ячейки B7, B8 и B9
Range("B7").Value = " Розничная цена:"
Range("B8").Value = " Оптовая скидка:"
Range("B9").Value = " Оптовая цена:"
'Установим ширину столбцов B и C
Columns("B:C").ColumnWidth = 20
'Установим в ячейках B7:B9 курсив и выравнивание по правому краю
Range("B7:B9").Font.Italic = True
Range("B7:B9").HorizontalAlignment = xlRight
'Установим в ячейках B7:C9 размер шрифта 14
Range("B7:C9").Font.Size = 14
' Скопируем данные из ячеек листа Расчет в ячейки текущего листа
Range("C7").Value = Worksheets("Расчет").Range("C5").Value
Range("C8").Value = Worksheets("Расчет").Range("C7").Value
Range("C9").Value = Worksheets("Расчет").Range("C9").Value
'Установим в ячейках C7:C9 нужный формат
Range("C7").NumberFormat = _
"_-* #,##0.00[$р.-419]_-;-* #,##0.00[$р.-419]_-;_-* ""-""??[$ р.-419]_-;_-@_-"
Range("C8").Style = "Percent"
Range("C8").NumberFormat = "0.00%"
Range("C9").NumberFormat = _
"_-* #,##0.00[$р.-419]_-;-* #,##0.00[$р.-419]_-;_-* ""-""??[$ р.-419]_-;_-@_-"
Range("B11").Value = "*** Спасибо за покупку! ***"
Range("B11").Font.Italic = True
End Sub
В этой процедуре впервые встречаются следующие объекты, методы и свойства
приложения Microsoft Excel:




объект ActiveSheet – активный рабочий лист;
объект Worksheets – рабочий лист;
метод Add – добавление нового рабочего листа;
свойство Value диапазона Range – позволяет считывать и записывать данные,
содержащиеся в ячейках диапазона.
51. Макрос Создать_Накладную создает новый рабочий лист (см. рис. 5) с именем
Накладная и выполняет копирование на него данных с рабочего листа с именем
Расчет. Назначение отдельных инструкций процедуры поясняет комментарий.
Рис. 5. Рабочий лист, созданный макросом Создать_Накладную
52. Покажите результаты работы преподавателю.
53. Закройте приложение Microsoft Excel.
54. Удалите свою рабочую папку.
5. Вопросы для контроля
1.
2.
3.
Есть ли что-либо общее между макросом Microsoft Excel и процедурой Visual Basic?
Как записать процедуру с помощью макрорекордера?
Как можно увидеть текст записанного макроса?
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Как выполнить записанный макрос, используя команды ленты?
Где и как можно создать кнопку, связанную с макросом?
Как создать на рабочем листе объект, связанный с макросом?
На что влияет значение свойства DisplayGridlines объекта ActiveWindow?
Зачем нужен объект Range?
Что делает метод Select при применении к объекту Range?
Что означает ссылка ActiveCell?
Каково назначение свойства FormulaR1C1 объекта Range?
Каково назначение метода Columns?
На что влияет значение свойства ColumnWidth?
Каково назначение стандартных функций Val и Str? Какие аргументы у этих
функций?
Чем является объект ActiveSheet?
Чем является объект Worksheets?
Что произойдет в результате применения метода Add к объекту Worksheets?
Чему соответствует значение свойства Value объекта Range?
Download