
Diagrammy_v_Excel_Dzhon_Uokenbakh_2003
.pdfY J ; '1 Оормануованис Дим-раммы
Svib ФорнатировакиеДиаграммы () ' ForroatChart Macro
' Macro recorded by John Walkenbach
Act iveChart.PlotArea.Seleet Uith Selection . Interior
•ColorIndex » 2
.Pattern « xlSolid End With
ActiveChart.SeriesCollection(l).Select . Uith Selection.Interior
.ColorIndex - 3
.Pattern » XlSolid End Uith
ActiveChart.Axes(xlValue).HajorGridlines.Select With Selection.Border
.ColorIndex " IS
.Ueight « xlHairline
.LineStyle » xlDot End Uith
bspi-t
Puc. 15.4. Код записанного нами макроса
Чтобы протестировать макрос, создайте еще одну диаграмму на основе этих же данных (или скопируйте исходную диаграмму), активизируйте ее и нажмите клавиши <Alt+F8>, Появится диалоговое окно Макрос. Выделите макрос ФорматированиеДиаграммы и щелкните на кнопке Выполнить. Все записанные операции форматирования будут немедленно применены к выделенной диаграмме.
Далее в главе рассматриваются еще некоторые способы запуска макросов.
Исправление записанного макроса
Немного поработав с макросами, вы убедитесь, что макрос, сгенерированный с помощью инструмента записи, почти всегда нуждается в дополнительной правке. На пример, макрос может содержать посторонние команды, которые можно удалить. В макрос можно также добавить код проверки ошибок.
УДАЛЕНИЕ ВЫДЕЛЕНИЙ
Важно понимать, что инструмент записи макросов генерирует далеко не самый эф фективный код. Проанализировав сгенерированный код, вы увидите, что Excel записы вает выделение, а затем использует общий объект Selection в последующих операто рах. Ниже приведен фрагмент кода макроса, описанного в предыдущем разделе.
ActiveChart.PlotArea.Select With Selection.Interior
•Colorlndex = 2
.Pattern = XlSolid
End With
Выделять в макросе область построения (объект PlotArea) совсем не обязательно. Чтобы изменить в коде макроса свойства любого объекта, вьщелять его нет никакой необходимости. Вьщеление объекта может даже замедлить выполнение макроса. Тем не менее инструмент записи послушно повторяет все действия, которые выполняются с помощью мыши и клавиатуры. Следовательно, пять операторов, приведенных в предыдущем фрагменте кода, можно записать так:
390 |
Часть III. Использование VBA |
With ActiveChart.PlotArea.Interior
.Colorlndex = 2
.Pattern = xlSolid
End With
ИСПОЛЬЗОВАНИЕ КОНСТРУКЦИИ WITH-END WITH
При использовании инструмента записи в код довольно часто помещается конст рукция With-End With. В предьщущем фрагменте кода с помощью этой конструкции обрабатывается объект i n t e r i o r , входящий в объект PlotArea. Конкретнее, код из меняет свойства Colorlndex и Pattern объекта I n t e r i o r .
Эквивалентный код можно записать без использования конструкции With-End With, заменив таким образом четыре оператора двумя.
ActiveChart.PlotArea.Interior.Colorlndex = 2
ActiveChart.PlotArea.Interior.Pattern = xlSolid
Естественно, если требуется изменить не два, а много свойств, использование опе ратора With-End With вполне оправданно.
Свойству Pattern присваивается встроенная константа x l S o l i d , имеющая значение 1. Использование встроенных констант можно оправдать лишь их большей наглядностью: Solid переводится с английского, как "сплошная (заливка)". Запомнить это несложно. В то же время запомнить номера много численных значений свойств практически невозможно.
ДОБАВЛЕНИЕ КОДА ОБРАБОТКИ ОШИБОК
Поработав с макросом ФорматированиеДиаграммы, вы обнаружите, что в некото рых ситуациях он генерирует ошибки. В частности, сообщение об ошибке генерирует ся, если диаграмма неактивна или не имеет легенды.
Ниже приведен код макроса, исправленный вручную. Теперь он называется ФорматированиеДиаграммы2. В НОВОМ макросе объекты не выделяются. Кроме того, до бавлены средства предотвращения ошибок и комментарии.
Sub ФорматированиеДиаграммы2()
'Завершение макроса, если диаграмма неактивна
If ActiveChart Is Nothing Then Exit Sub
'Заливка области построения белым цветом With ActiveChart.PlotArea.Interior
.Colorlndex = 2
.Pattern = xlSolid End With
'Заливка столбиков красным цветом
With ActiveChart.SeriesCollection(l).Interior
.Colorlndex = 3
.Pattern = xlSolid
End With
'Установка пунктирных линий сетки
With ActiveChart.Axes(xlValue).MajorGridlines.Border
.Colorlndex = 15
.Weight = xlHairline
.LineStyle = xlDot
End With
'Если есть легенда, то ее удаление
If ActiveChart.HasLegend Then ActiveChart.Legend.Delete
End Sub
Глава 15. Объекты, коллекции, свойства и методы |
391 |
Теперь перейдите в рабочий лист и выполняйте какие-либо команды Excel, на пример форматируйте диаграмму, выделяйте ячейки, вводите данные, форматируйте ячейки, выбирайте команды меню, создавайте диаграммы и т.д. Вы увидите, как с ка ждым щелчком мыши или нажатием клавиши в коде макроса появляются новые опе раторы, отображающие выполненное вами действие.
Персональная рабочая книга макросов
Если какой-либо макрос VBA (созданный вами или скопированный откуда-либо) покажет ся вам особенно полезным, то вы непременно захотите сохранить его. Для хранения мак росов в Excel предусмотрено специальное место — файл Personal.xls, расположенный в каталоге XLstart. Рабочая книга Personal.xls загружается при каждом запуске Excel. Она скрыта, тем не менее всегда под рукой. Перед записью макроса можно установить режим его одновременной записи в рабочую книгу Personal.xls. Файла Personal.xls не существует, пока в него не записан хотя бы один макрос.
Параметры записи
Как вы помните, при выборе команды Сервис'=>Макрос'=5^Начать запись появляется диалоговое окно Запись макроса. В нем можно установить параметры записи, описы ваемые в следующих разделах.
ИМЯ МАКРОСА
В поле Имя макроса можно задать имя записываемой процедуры. По умолчанию Excel устанавливает имена Макрос!, Макрос2 и т.д. Я предпочитаю оставлять имена по умолчанию, а затем изменять их при необходимости. Возможно, вам больше по нравится сразу задавать описательные имена. Выбор за вами.
КЛАВИШИ БЫСТРОГО ВЫЗОВА
Макрос можно быстро запустить путем нажатия клавиш, задаваемых в поле Сочетание клавиш. Например, если ввести в этом поле букву w (в нижнем регистре), то макрос мож но запускать путем нажатия клавиш <CtrH-W>. Если буква была введена в верхнем регист ре (W), то макрос запускается при нажатии клавиш <Ctrl-+-Shift+W>. Добавить или изме нить комбинацию клавиш быстрого вызова можно в любое время, поэтому устанавливать этот параметр перед записью макроса совсем не обязательно.
МЕСТОНАХОЖДЕНИЕ МАКРОСА
В поле со списком Сохранить в можно задать, где будет сохранен записываемый макрос. По умолчанию Excel помещает макрос в модуль активной рабочей книги. Ес ли хотите, можете поместить его в новую рабочую книгу (Excel немедленно создаст ее) или в файл Personal . xls .
ОПИСАНИЕ
По умолчанию Excel записывает в макрос пять строк комментариев (три из них пус тые), в которых указывает имя макроса, имя пользователя и дату его создания. Вы можете ввести в текстовую область Описание любой текст, можете также ничего не вводить.
Выполнение макроса
в этом разделе рассматривается несколько способов выполнения макросов.
Использование окна Макрос
с помощью команды Сервис'=>Макрос'=М\/1акросы (или клавиш <Alt+F8>) выводится диалоговое окно Макрос, в котором перечислены доступные макросы. Чтобы выпол нить макрос, выделите его в списке и щелкните на клавише Выполнить.
Глава 15. Объекты, коллекции, свойства и методы |
3 9 3 |
Глава 16
Использование VBA
вдиаграммах
Вэтой главе...
• |
Активизация диаграммы |
395 |
• |
Определение контекста макроса |
396 |
• |
Идентификация вьщеленного объекта |
398 |
• |
Перечисление диаграмм |
398 |
• |
Удаление диаграмм |
400 |
• |
Печать всех внедренных диаграмм |
401 |
• |
Примеры форматирования и настройки |
401 |
• |
Создание диаграмм в коде VBA |
408 |
• Изменение размеров и выравнивание диаграмм |
412 |
|
• |
Задание подписей данных |
413 |
• |
Экспорт диаграмм как файлов GIF |
415 |
• |
Выяснение диапазонов, используемых диаграммой |
418 |
• |
Защита диаграмм |
419 |
• |
Прокручиваемая диаграмма |
421 |
• |
Примеры обработки событий |
422 |
В главе представлены многочисленные примеры макросов, управляющих диаграм мами и параметрами диаграмм. Примеры демонстрируют принципы работы с объек тами, входящими в диаграммы. Некоторые макросы можно использовать в практиче ских задачах в том виде, в каком они приведены в рабочих книгах примеров, а неко торые потребуют небольших изменений.
Активизация диаграммы
Щелчок на внедренной диаграмме активизирует ее. Код VBA может активизиро вать внедренную диаграмму с помощью метода Activate. Оператор, активизирую щий первую внедренную диаграмму активного листа, выглядит так:
ActiveSheet.ChartObjects(1).Activate
Обратите внимание: метод Activate применяется к объекту Chartobject, а не к объ екту Chart, входящему в Chartobject. Приведенный ниже оператор генерирует ошибку.
ActiveSheet.ChartObjects(1).Chart.Activate 'Неправильно!
f^x^tmm |
m |
l^^3' |
m*' |
|
|
|
Рис. 16.1. Если диаграмма неактивна, вы водится это сообщение об ошибке
Чтобы ошибка не генерировалась (и макрос был более дружественным к пользова телю), добавим несколько строк кода. Они проверяют, существует ли активная диа грамма. Если активной диаграммы нет, то пользователь извещается об этом и проце дура завершается. Ниже приведена процедура ДобавитьЗаголовок с указанными из менениями.
Sub |
ДобавитьЗаголовокО |
|
|
If ActiveChart Is Nothing Then |
|
|
MsgBox "Диаграмма должна быть выделена" |
|
|
Exit Sub |
|
|
End |
If |
|
With |
ActiveChart |
|
|
.HasTitle = True |
|
End |
. ChartTitle . Text = Range("Al") |
End |
With |
|
Sub |
|
Является ли активная диаграмма внедренной
Как вы знаете, диаграмма может принадлежать к одному из двух видов: внедрен ная или расположенная в листе диаграмм. В некоторых случаях макросу должно быть известно, к какому из этих видов относится диаграмма. Приведенный ниже макрос ВидВыделения ВЫВОДИТ одно из трех сообщений в зависимости от вида активной диаграммы или ее наличия.
Sub ВидВыделения()
If ActiveChart Is Nothing Then
MsgBox "Активной диаграммы нет"
Exit Sub
End If
If TypeName(ActiveChart.Parent) = "Workbook" Then MsgBox "Лист диаграмм"
Exit Sub
End If
If TypeName(ActiveChart.Parent) = "ChartObject" Then MsgBox "Внедренная диаграмма"
End If
End Sub
Сначала макрос ВидВьщеления проверяет, есть ли активная диаграмма. Если таковой нет, макрос выводит сообщение и завершается. Далее расположены два оператора If, в которых с помощью функции TypeName определяется тип родительского объекта активной
диаграммы. Объект chart |
внедренной диаграммы входит в объект Chartobject. |
Для |
|
ChartObject родительским |
объектом является рабочий лист, в который |
внедрена |
диа- |
фамма. Родительским объектом листа диафамм является рабочая книга. |
|
|
|
Глава 16. Использование VBA в диаграммах |
|
397 |
Идентификация выделенного объекта
в приведенном ниже макросе ЧтоВыделено! функция TypeName используется для определения типа выделенного объекта. Например, если в момент запуска макроса выделен диапазон, то выводится сообщение Range, а если выделена область построе ния диаграммы, то сообщение PlotArea.
Sub ЧтоВыделено!О
MsgBox TypeName(Selection)
End Sub
Макрос работает великолепно, за исключением того случая, когда выделена вне дренная диаграмма, а макрос запускается щелчком на кнопке в листе. При этом кнопка временно получает фокус, активизация диаграммы снимается и выделенным остается лишь объект CharObject. В результате при вьщелении любого элемента диаграммы в окне сообщений выводится один и тот же текст — Chartobject.
Ниже приведена измененная версия макроса, работающая правильно независимо от способа запуска (рис. 16.2). Если выделен объект Chartobject, то макрос выделяет элемент диаграммы, который был активен до этого. Однако при этом возникает еще одна небольшая проблема: макрос не может определить, выделен ли объект Chartobject (если пользователь выделил объект, удерживая клавишу <Ctrl>, т.е. вы делил объект диаграммы, а не диаграмму).
Sub ЧтоВыделено2()
If ActiveChart Is Nothing Then
MsgBox TypeName(Selection)
Else
If TypeName(Selection) = "Chartobject" _
Then Selection.Activate MsgBox TypeName(Selection)
End If
End Sub
A„^ 1 : 8^ |
g I P [ 0 |
Пример диаграммы
ОсьХ
'^^^~~Щ^^Шш^^Ш1!^у^}.^/~ ~Ы^ 't\U
Рис. 16,2. В окне сообщений выводится тип выделенного объекта
Перечисление диаграмм
в этом разделе рассматриваются макросы, перечисляющие и обрабатывающие все диафаммы рабочего листа или рабочей книги.
398 |
Часть III. Использование VBA |