Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воробьева.Приемы_программирования_в среде_VBfor...doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.58 Mб
Скачать

Создание макрокоманды (макроса)

Макрокоманды – это укрупненные наборы стандартных команд, которые могут выполняться одновременно друг за другом. Макрокоманды оформляются как подпрограммы (Sub) и могут вызываться по команде Excel СервисМакросы… или комбинацией горячих клавиш Alt+F8. По ней открывается окно со списком всех, имеющихся в проекте макросов, из которых надо выбрать нужный и нажать кнопку Выполнить.

При создании макроса можно существенно упростить процесс программирования, воспользовавшись режимом записи макроса по команде Excel СервисНачать Запись….

Попробуем создать макрос, который будет форматировать фрагмент листа, как показано на таблицах выше: наружная рамка будет нарисована двойной линией, а внутренние линии – одинарными линиями.

Каждая отдельная программа или группа связанных между собой программ могут располагаться в своем модуле, их число в проекте не ограничено, но названия программ должны быть разными. Поэтому для нашей новой процедуры лучше создать новый модуль, но мы этого пока делать не будем, а познакомимся с записью макроса.

Начнем запись нашего макроса по команде Excel СервисНачать Запись…. Появляется окно, в котором должны быть заполнены исходные данные по записываемому макросу (рис.22). Здесь можно задать имя макроса, сочетание горячих клавиш, которыми он будет вызываться, и внести небольшой комментарий к подпрограмме.

П

Рис.22. Окно параметров макроса

осле нажатия кнопки Ok появляется панель инструментов с элементами управления записью, и начинается запись. Теперь все команды, которые мы выполняем, записываются в кодах VBA. Выполним следующие действия на новом листе книги:

  • выделим несколько ячеек в виде прямоугольника, например, прямоугольник из 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. Окно вставки процедуры

от мы и создали свою макрокоманду. Попробуем оптимизировать программный код. В нем имеется четыре одинаковых фрагмента, которые отличаются только параметрами. Попробуем заменить их внутренней подпрограммой. Сначала создадим внутреннюю подпрограмму (рис.24), например, Draw_Line с четырьмя формальными параметрами:

  • 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

В результате размер нашего кода уменьшился, а результат остался тот же. А можно ли еще внести какие-либо изменения? Например, перед каждой строкой рисования определенной линии границы можно запросить нужный тип линии, ее размер и цвет, что позволит получать более сложные формы оформления таблицы, но об этом мы поговорим после знакомства с пользовательскими формами.