
- •Введение
- •Основные понятия объектно-ориентированного программирования
- •Основные элементы управления в редакторе vba
- •Стандартные приемы программирования в среде vba Введение
- •Отладка программы
- •Основные элементы программного кода в среде vba Описание переменных
- •Константы
- •Операторы присваивания
- •Арифметические выражения
- •Логические выражения
- •Текстовые выражения
- •Линейные программы
- •Оператор перехода
- •Конструкции принятия решений
- •Ветвление по условиям
- •Циклы в программе
- •Массивы
- •Пользовательские процедуры
- •Две основные функции преобразования типов данных
- •Ввод, вывод и генерация исходных данных
- •Приемы работы в среде программирования vba
- •Запуск среды vba
- •Создание функции пользователя
- •Создание макрокоманды (макроса)
- •Создание пользовательской формы
- •Работа с листами книги
- •Лабораторные задания по темам Целочисленное программирование
- •Ввод и вывод данных, оператор присваивания
- •Логические выражения: группа Boolean
- •Условный оператор: группа If
- •Оператор выбора
- •Цикл с параметром: группа For
- •Цикл с условием: группа While
- •Массивы
- •Функции и процедуры
- •Контрольные вопросы
- •Список литературы
- •Содержание
- •420015, Казань, к. Маркса, 68
Создание макрокоманды (макроса)
Макрокоманды – это укрупненные наборы стандартных команд, которые могут выполняться одновременно друг за другом. Макрокоманды оформляются как подпрограммы (Sub) и могут вызываться по команде Excel СервисМакросы… или комбинацией горячих клавиш Alt+F8. По ней открывается окно со списком всех, имеющихся в проекте макросов, из которых надо выбрать нужный и нажать кнопку Выполнить.
При создании макроса можно существенно упростить процесс программирования, воспользовавшись режимом записи макроса по команде Excel Сервис Начать Запись….
Попробуем создать макрос, который будет форматировать фрагмент листа, как показано на таблицах выше: наружная рамка будет нарисована двойной линией, а внутренние линии – одинарными линиями.
Каждая отдельная программа или группа связанных между собой программ могут располагаться в своем модуле, их число в проекте не ограничено, но названия программ должны быть разными. Поэтому для нашей новой процедуры лучше создать новый модуль, но мы этого пока делать не будем, а познакомимся с записью макроса.
Начнем запись нашего макроса по команде Excel Сервис Начать Запись…. Появляется окно, в котором должны быть заполнены исходные данные по записываемому макросу (рис.22). Здесь можно задать имя макроса, сочетание горячих клавиш, которыми он будет вызываться, и внести небольшой комментарий к подпрограмме.
П
Рис.22. Окно параметров
макроса
выделим несколько ячеек в виде прямоугольника, например, прямоугольник из 3 столбцов и 5 строк;
вызовем команду форматирования ячеек с помощью горячих клавиш Ctrl+1 или по команде ФорматЯчейки. В открывшемся окне выбираем закладку Границы (рис.23);
Рис.23. Оформление границ ячеек
на ней выбираем тип линии «двойная» и щелкаем по кнопке Внешние на панели Все;
потом выбираем тип линии «одинарная» и щелкаем по кнопке Внутренние на панели Все;
заканчиваем запись макроса, нажимая кнопку Остановить запись.
Переходим в VBA и смотрим изменения в нашем проекте. Там появился новый модуль2, и в нем подпрограмма Макрос1, которая имеет следующее содержание
Sub Макрос1()
' Макрос1 Макрос
' Макрос записан 02.09.2007 (Ves)
'
Range("B3:D7").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
Рассмотрим полученный код. В первой строке процедуры выделяется область фрагмента таблицы, и дальше задаются свойства для границ ячеек в следующей последовательности – диагонали сверху вниз и снизу вверх, потом левая граница, верхняя, нижняя и правая и в конце внутренние вертикальные границы и внутренние горизонтальные. Для диагоналей тип линии (LineStyle) задается отсутствие линии (xlNone), для наружных границ – двойной линией (xlDouble) и для внутренних границ – одинарной линией (xlContinuous).
Теперь надо эту программу сделать универсальной. В самом простом варианте надо удалить строку, где выделяется область таблицы, и считать, что запускать макрос будем только после выделения заданной области таблицы. Попробуем это сделать. Удаляем строку – Range("B3:D7").Select. Затем на листе книги выделяем новый фрагмент таблицы, вызываем макрос (Alt+F8) и выполняем его. Получаем тот же результат, что и при записи макроса.
В
Рис.24. Окно вставки
процедуры
Typ_Border – тип бордюра в который мы передадим константу, определяющую месторасположения границы (xlDiagonalDown, xlDiagonalUp, xlEdgeLeft, xlEdgeTop, xlEdgeBottm, xlEdgeRight);
Line_Style – тип линии, который будет задаваться константой (xlNone, xlDouble, xlContinuous);
Weight – толщина линия, в нашем случае это только xlThin, хотя имеется гораздо больше вариантов;
Color_Index –цвет линии, который задается его индексом, для нас это только xlAutomatic.
Она должна быть внутренней (Private), как отмечено в окне вставки процедуры, показанной на рис.24. Ее программный код показан ниже.
Private Sub Draw_Line(Typ_Border, _ Line_Style, _ Optional Weight, _ Optional Color_Index)
With Selection.Borders(Typ_Border)
.LineStyle = Line_Style
If Line_Style <> xlNone Then
.Weight = Weight
.ColorIndex = Color_Index
End If
End With
End Sub
Часть кода можно просто скопировать из записанного макроса с исправлением констант, чтобы уменьшить вероятность ошибок при наборе служебных слов. Список формальных параметров введен построчно только для удобства представления данных на листе. Однако надо помнить, что строка кода может занимать несколько строк текста, и для указания этого используется символ подчеркивания, который перед собой имеет пробел, а за ним идет символ конца строки. Разрывать текст кода можно около разделителей и знаков операций. Служебное слово Optional, которое встречается перед двумя последними параметрами, говорит о том, что они необязательные к передаче, и могут быть просто опущены в списке фактических параметров, что вы увидите дальше. Теперь напишем код нашего макроса. Дадим ему имя «Мой_макрос», это будет подпрограмма общего типа. Попробуйте создать ее самостоятельно, и потом введите необходимый код, который показан ниже
Public Sub Мой_макрос()
Draw_Line xlDiagonalDown, xlNone
Draw_Line xlDiagonalUp, xlNone
Draw_Line xlEdgeLeft,xlDouble,xlThick, xlAutomatic
Draw_Line xlEdgeTop, xlDouble,xlThick, xlAutomatic
Draw_Line xlEdgeBottom,xlDouble,xlThick,xlAutomatic
Draw_Line xlEdgeRight,xlDouble,xlThick,xlAutomatic
Draw_Line xlInsideVertical,xlContinuous,xlThin, _ xlAutomatic
Draw_Line xlInsideHorizontal,xlContinuous,xlThin,_ xlAutomatic
End Sub
В результате размер нашего кода уменьшился, а результат остался тот же. А можно ли еще внести какие-либо изменения? Например, перед каждой строкой рисования определенной линии границы можно запросить нужный тип линии, ее размер и цвет, что позволит получать более сложные формы оформления таблицы, но об этом мы поговорим после знакомства с пользовательскими формами.