
Diagrammy_v_Excel_Dzhon_Uokenbakh_2003
.pdfMsgBox Msg End Sub
В предыдущем макросе перечисляются внедренные диаграммы. Ниже приведена похожая процедура, перечисляющая листы диаграмм активной рабочей книги.
Sub ПеречислЛистовДиагр() Dim Cht As Chart
Dim Msg As String Msg = ""
For Each Cht In ActiveWorkbook.Charts Msg = Msg & Cht.Name & vbNewLine
Next Cht MsgBox Msg
End Sub
Преобразование расположения всех диаграмм
Метод Location объекта Chart перемещает диаграмму. Его можно применить для преобразования внедренной диаграммы в лист диаграмм и наоборот.
Ниже приведен макрос, перечисляющий все внедренные диаграммы активного листа и преобразующий их в листы диаграмм.
Sub ПреобрВЛистыДиаграмм() Dim ChtObj As ChartObject
For Each ChtObj In ActiveSheet.ChartObjects ChtObj.Chart.Location Where:=xlLocationAsNewSheet
Next ChtObj End Sub
Макрос ПреобрВоВнедрДиагр выполняет противоположную операцию: перечисля ет все листы диаграмм и преобразует каждый из них во внедренную диаграмму актив ного листа.
Sub ПреобрВоВнедрДиагрО Dim Cht As Chart
For Each Cht In ActiveWorkbook.Charts
Cht.Location Where:=xlLocationAsObject, _ Name:=Act iveSheet.Name
Next Cht End Sub
После выполнения макроса ПреобрВоВнедрДиагр все внедренные диаграммы наложены одна поверх другой. Макрос можно изменить таким образом, чтобы внедренные диаграммы были расположены лучше. Этот вопрос рассматрива ется далее в главе.
Удаление диаграмм
Для удаления внедренной диафаммы нужно удалить ее контейнер ChartObject. На пример, приведенный ниже оператор удаляет диафамму Диагр! активного рабочего листа.
ActiveSheet.ChartObj ects("Диагр!") .Delete
Для удаления всех внедренных диаграмм активного рабочего листа используется метод Delete коллекции ChartObjects:
Worksheets("ЛистХ") .ChartObj ects . Delete
Удалить один лист диаграмм можно с помощью оператора ActiveWorkbook.Charts("Диагр2").Delete
4 0 0 |
Часть III. Использование VBA |
Удалить все листы диаграмм активной рабочей книги можно с помощью метода Delete коллекции Charts.
ActiveWorkbook.Charts.Delete
При выполнении последнего оператора выводится сообщение, показанное на рис. 16.4. Чтобы оно не выводилось, установите свойство DisplayAlerts в False. После удаления установите его обратно в True, как показано в процедуре УдалениеВсехЛистовДиагр.
Sub УдалениеВсехЛистовДиагр() Application.DisplayAlerts = False ActiveWorkbook.Charts.Delete Application.DisplayArerts = True
End Sub
Ь iftcr^^ «M^p^MiMXАЙЙ уд|»м»»1й> щtft^|ф»llsmiim*imчmь^ Чтобы
Рис, 16.4. Это сообщение появляется при удалении
листа; чтобы оно не выводилось, |
нужно устано |
вить свойство DisplayAlerts в |
False |
Печать всех внедренных диаграмм
Как вы знаете, при распечатке рабочего листа печатаются все расположенные в нем внедренные диаграммы. В некоторых слз^аях нужно распечатать каждую диа грамму на отдельной странице. Приведенный ниже макрос распечатывает все вне дренные диаграммы активного листа.
Sub ПечатьВсехДиагрО
Dim ChtObj As ChartObject
For Each ChtObj In ActiveSheet.ChartObjects ChtObj.Chart.Printout
Next ChtObj End Sub
В процедуре ПечатьВсехДиагр перечисляются все объекты ChartObject и к каж дому применяется метод Printout объекта Chart. Если вы захотите выполнить предварительный просмотр диаграмм перед печатью, примените метод PrintPreview вместо Printout.
Примеры форматирования и настройки
Макросы часто используются для форматирования или настройки параметров диаграмм. Эти операции выполняются путем изменения свойств объектов диаграмм. Имя изменяемого свойства можно найти в справочной системе, однако более простой способ состоит в записи макроса во время изменения диаграммы вручную с после дующим анализом полученного кода. Таким образом, инструмент записи макросов полезен не только сам по себе, но и как источник важной информации.
Изменение цветов
Ниже приведен макрос, устанавливающий цвета трех рядов активной диаграммы. Sub ИзменениеЦветаРядовО
If ActiveChart Is Nothing Then |
|
Глава 16. Использование VBA в диаграммах |
4 0 1 |
|
MsgBox "Выделите диаграмму." |
|
End |
Exit Sub |
|
If |
|
|
With |
ActiveChart |
|
|
. S e r i e s C o l l e c t i o n ( l ) . I n t e r i o r . C o l o r l n d e x = 3 |
|
|
. SeriesCollection(2) . Interior . Colorlndex |
= 5 |
End |
. SeriesCollection(3) . Interior . Colorlndex |
= 4 |
With |
|
End Sub
Макрос ИзменениеЦветаРядов устанавливает значение свойств Colorlndex объектов Interior, входящих в объекты рядов Series. Задаваемые значения Colorlndex соответ ствуют красному, синему и зеленому цветам стандартной цветовой палитры. Обратите внимание: в макросе не выполняется никакой проверки ошибок. Поэтому макрос сгене рирует ошибку, если в диафамме нет объектов Series или объекты Series не имеют свойств Interior (как, например, графики). Чтобы отменить вывод сообщений об ошиб ках, нужно добавить в начало процедуры следующий оператор:
On Error Resume Next
Макрос ИзменениеЦветаРядов был создан на основе макроса Макрос!, полученного в результате записи (текст процедуры Макрос! приведен ниже). Модифицированная версия намного проще и эффективнее, потому что в ней не применяется вьщеление объектов перед установкой значений их свойств. Обратите внимание: в модифициро ванном макросе не устанавливается свойство Pattern. Это свойство используется редко, чаще всего оно установлено в свое значение по умолчанию xlSolid.
Sub Макрос!()
ActiveChart.SeriesCollection(!).Select
With Selection.Interior
.Colorlndex = 3
.Pattern = xlSolid
End With ActiveChart.SeriesCollection(2).Select
With Selection.Interior
.Colorlndex = 5
.Pattern = xlSolid End With
ActiveChart.SeriesCollection(3).Select With Selection.Interior
.Colorlndex = 4
.Pattern ^ xlSoLid
End With End Sub
Применение случайного цветового градиента
в этом разделе рассматривается макрос, устанавливающий случайную двухцветную градиентную заливку радов диаграммы. Запустите инструмент записи макроса и уста новите двухцветную градиентную заливку столбиков гистограммы. Сгенерированный при этом код выгладит приблизительно так:
Sub Макрос!()
ActiveSheet.ChartObjects("Лист!").Activate ActiveChart.SeriesCollection(!).Select
Selection.Fill.TwoColorGradient __ 'Style:=msoGradientVertical, Variant:=3
With Selection
.Fill.Visible = True
4 0 2 |
Часть III. Использование VBA |
.Fill.ForeColor.SchemeColor = 10
.Fill.BackColor.SchemeColor = 8 End With.
End Sub
Хотя макрос и содержит некоторый неуместный код, в нем есть много интересно го, в частности метод TwoColorGradient, принимающий два аргумента (Style и Variant). Для задания двух цветов используется свойство SchemeColor. Итак, имена объектов и свойств у нас есть. Дополнительную информацию о них несложно найти в справочной системе.
Приведенный ниже макрос СлучайныйГрадиент генерирует случайные числа для аргумента TwoColorGradient и свойства SchemeColor. Алгоритм генерации не сколько усложнен, потому что значение аргумента s t y l e , равное б, недопустимо. Кроме того, если аргумент s t y l e равен 7, то аргумент Variant может быть равен 1 или 2. Все это задается с помощью операторов if.
Sub СлучайныйГрадиент()
Dim GrStyle As Long, GrVariant As Long Dim FColor As Long, BColor As Long 'Получение случайного значения
GrStyle = Int(Rnd * 7) + 1
If GrStyle = 6 Then GrStyle = 1 If GrStyle = 7 Then
GrVariant = Int(Rnd * 2) + 1
Else
GrVariant = Int(Rnd * 4) + 1 End If
FColor = Int(Rnd * 57) + 1
BColor = Int(Rnd * 57) + 1 'Установка цветов
With ActiveSheet.ChartObjects(1).Chart. _ SeriesCollection(1)
.Fill.TwoColorGradient Style:=GrStyle, _ Variant:=GrVariant
.Fill.ForeColor.SchemeColor = FColor
.Fill.BackColor.SchemeColor = BColor End With
'Вывести значения в листе Range("В20") = GrStyle Range("B21") = GrVariant Range("B22") = FColor Range("B23") = BColor
End Sub
Макрос генерирует случайные комбинации параметров заливки. Некоторые из них выглядят привлекательно, а некоторые просто ужасны!
В макросе используется функция Rnd, генерирующая случайное число в диа пазоне от О до 1. Чтобы получить целое случайное число в диапазоне от 1 до п, используется выражение int (Rnd * n) +1.
Условное форматирование цветов
в главе 8, "Искусные приемы создания и использования диаграмм", рассмотрена методика применения разных цветов к столбикам диаграммы в зависимости от значе ний точек данных. В примере этого раздела цвета столбиков в зависимости от значе ний точек устанавливает макрос.
Глава 16. Использование VBA в диаграммах |
4 0 3 |
Делений (D4). Щелчок на кнопке запускает макрос УстановкаЗначенийОси, который чи тает значения именованных ячеек и присваивает их свойствам объекта Axis (ось).
Sub УстановкаЗначенийОси()
With ActiveSheet.ChartObjects(1).Chart.Axes(xlValue)
.MinimumScale = Range("Минимумеси")
•MaximumScale = Range("МаксимумОси")
.MajorUnit = Range("ЦенаОсновныхДелений")
End With
End Sub
Рис. 16.6, Макрос устанавливает параметры оси, хранящиеся в ячейках листа
В макросе используется коллекция Axes (оси) объекта Chart. Объект Axes (xlValue) является осью значений. Как вы знаете, в диаграмме могут выводиться также оси ка тегорий и вспомогательные оси. В приведенной ниже таблице показано, как обра титься к любым возможным объектам Axis. Задание значения второго аргумента х1 Primary не обязательно: если второй аргумент опущен, то по умолчанию предпо лагается значение х1 Primary.
Тип оси Ссылка
Основная ось (х) категорий |
Axes(xlCategory, |
xlPrimary) |
|
Основная ось (у) значений |
Axes(xlValue, |
xlPrimary) |
|
Вспомогательная ось (х) категорий |
Axes(xlCategory, |
xlSecondary) |
|
Вспомогательная ось (у) значений |
Axes(xlValue, |
xlSecondary) |
|
Ось ряда |
Axes(xlSeriesAxis) |
Наборы свойств объектов Axis могут быть разными в зависимости от типа оси. Например, ось категорий не имеет свойств, используемых в предыдущем макросе (если она не является осью времени). Сделать ось категорий осью времени можно с помощью следующего оператора:
ActiveChart.Axes(xlCategory).CategoryType = xlTimeScale
Другие значения свойства CategoryType — xlCategoryScale и xlAutomatic — соответствуют переключателям, устанавливаемым во вкладке Оси диалогового окна Параметры диаграммы.
Глава 16. Использование VBA в диаграммах |
405 |
Назначение макроса объекту chartobject
Макрос можно назначить внедренной диаграмме. Для этого щелкните на диаграмме, удерживая клавишу <Ctrl> (этим выделяется контейнер объекта chart -- объект Chartobject), щелкните на диаграмме правой кнопкой мыши и во всплывшем меню вы берите команду Назначить макрос. Появится диалоговое окно Назначить макрос объекту,
в котором можно выбрать макрос.
Назначенный диаграмме макрос выполняется при каждом щелчке на внедренной диа грамме. Например, если назначить диаграмме приведенный ниже макрос, то щелчок на диаграмме приведет к выводу окна сообщений, содержащего имя диаграммы (свойство Caller возвращает имя объекта, запустившего процедуру).
Sub ВыводИмениДиаграммыО Dim ChtName As String
ChtName = Application . Caller
MsgBox "Вы щелкнули на диаграмме " & ChtName End Sub
Однако учтите, что назначенный макрос затрудняет редактирование диаграммы, посколь ку при щелчке на диаграмме она не активизируется. Для редактирования диаграммы в этом случае нужно щелкнуть на ней правой кнопкой мыши и во всплывшем меню выбрать команду Формат объекта.
Макрос СделатьРядыПолупрозрачными не сохраняет градиенты и пара метры заливки рядов. Он также удаляет любые рисунки, вставленные в ряды до его запуска.
Создание диаграмм в коде VBA
в этом разделе рассматривается метод создания диафаммы с помощью кода VBA и об суждаются потенциальные проблемы, которые могут возникнуть при использовании запи санного макроса. Создать диафамму с помощью VBA можно одним из двух способов.
•С помощью метода Add коллекции charts. Таким способом создается новый объект Chart (т.е. лист диаграмм).
•С помощью метода Add коллекщ1и chartobjects. Таким способом создается новый объект Chartobject (т.е. внедренная диаграмма).
Запись макроса
На рис. 16.8 показана простая гистофамма, выводящая данные диапазона А1:С7. Во время создания и форматирования диафаммы инструмент записи макроса был включен. В результате был сгенерирован приведенный ниже Макрос!.
Sub Макрос!О Charts.Add
ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("Sheet!") _
.Range("A!:C7"), |
|
|
|
PlotBy:=xlColumns |
Where:=xlLocationAsObject, __ |
||
ActiveChart.Location |
|||
With |
Name:="Лист!" |
|
|
ActiveChart |
|
|
|
|
.HasTitie = True |
|
диаграммы" |
|
. ChartTitle . Characters . Text = "Заголовок |
||
|
.Axes(xlCategory, |
xlPrimary).HasTitle = |
False |
End |
.Axes(xlValue, xlPrimary).HasTitle = False |
||
With |
|
|
|
4 0 8 |
|
Часть III. Использование VBA |
ActiveChart.HasLegend = False
ActiveSheet.Shapes("Диаграмма 1").IncrementLeft -146.25
ActiveSheet.Shapes("Диаграмма 1").IncrementTop -58.5
ActiveSheet.Shapes("Диаграмма 1").ScaleWidth _
0.65, msoFalse, msoScalePromTopLeft
ActiveSheet.Shapes("Диаграмма 1").ScaleHeight 0.75, _
msoFalse, rasoScaleFromTopLeft
End Sub
Регион 1 Регион 2
2.Янв
3Фев
4Map
S ;Anp
6Май
7Июн
Заголовок диаграммы
10
Ж.
UL л1П
Рис. 16.8. При создании этой диаграммы был включен инструмент записи макроса
Выполнение записанного макроса
Видимо, вы ожидаете, что в результате выполнения записанного макроса будет создана точная копия исходной диаграммы. И хотя ваши ожидания не так уж далеки от реальности, однако при попытке кода переместить диаграмму или изменить ее размеры будет сгенерировано сообщение об ошибке. Записанный макрос обращается к объекту ChartObject как к рисунку с использованием его имени Диаграмма 1. Выполняющийся макрос создает объект диаграммы не с именем Диаграмма 1, и вы полнение завершается ошибкой.
Макрос, создающий диафамму, может быть полезен как источник информации, одна ко обычно выполняется он не очень удачно. К тому же его область применения ограниче на. Например, может понадобиться создать диаграмму на основе выделенных данных, а в записанном макросе исходный диапазон данных жестко предопределен.
Макрос, создающий диаграмму
Рассмотрим макрос, создающий гистограмму на основе выделенных данных. Мак рос должен удалить легенду, добавить заголовок, изменить размер диаграммы на 300x200 и расположить ее в нижнем правом углу выделенного диапазона.
Ниже приведен код макроса СоздатьДиаграмму, удовлетворяющего этим требованиям.
Sub СоздатьДиаграммуО |
|
|||
Dim DataRange |
As Range |
|
||
Dim |
ChtObj |
As |
ChartObject |
|
Dim |
ChtTop |
As |
Long, ChtLeft As Long |
|
Глава 16. Использование VBA в диаграммах |
409 |