
2 семестр / vba_2002
.pdf
Как только диаграмма будет активизирована, на нее можно ссылаться с помощью свойства A c t i v e C h a r t . Например, следующий оператор приводит к отображению имени активной диаграммы. Если активной диаграммы нет, то этот оператор приведет к возникновению ошибки.
MsgBox ActiveChart.Name
Чтобы модифицировать диаграмму с помощью кода VBA, ее не обязательно активизировать. Две процедуры, представленные ниже, приводят к одинаковому эффекту (встроенная диаграмма Диаграмма1 любого типа превращается в диаграмму с областями). Первая процедура активизирует диаграмму перед выполнением необходимых действий, а вторая выполняет операцию без активизации.
Sub ModifyChartlO
ActiveSheet.ChartObjects{ "Диаграмма].") .Activate ActiveChart.Type = xlArea
ActiveChart.Deselect End Sub
Sub ModifyChart2()
ActiveSheet.ChartObjects{"Диаграмма1").Chart.Type = xlArea End Sub
Диаграмма, встроенная в рабочий лист, легко преобразуется в лист диаграммы. Для того чтобы выполнить эту операцию вручную, следует активизировать встроенную диаграмму и выполнить команду Диаграмма^Размещение, В диалоговом окне Размещение диаграммы выберите переключатель отдельном и укажите имя листа. Это действие приведет к копированию объекта Chart (который содержится в объекте ChartObject) на лист диаграммы, после чего исходный объект ChartObj ect будет уничтожен.
Кроме того, встроенную диаграмму можно преобразовать в лист диаграммы с помощью кода VBA. Ниже приведен пример такого кода, который преобразует первый объект ChartObject на листе Лист1 в лист диаграммы, который называется МояДиаграмма.
Sub ConvertChartl() Sheets{"Лист1я).ChartObjects(I).Chart.
Location xlLocationAsNewSheet, "МолДиаграмма" End Sub
Следующий пример выполняет действия, противоположные предыдущей процедуре: диаграмма на листе диаграммы МояДиаграмма превращается во встроенную диаграмму на листе Лист 1.
Sub ConvertChart2() Charts{"МояДиаграмма") _
.Location xlLocationAsObject, "Лист1" End Sub
Использование метода Location также приводит к активизации перемещаемой диаграммы.
При активизации диаграмма, представленная объектом C h a r t O b j e c t , располагается в окне, которое в обычных условиях остается невидимым. Чтобы увидеть встроенную диаграмму в собственном окне, щелкните правой кнопкой мыши на объекте диаграммы и выберите Окно диаграммы в контекстном меню. Встроенная диаграмма останется на листе, но кроме этого диаграмма появится в собственном плавающем окне (рис. 18.2). Данное окно можно перемещать, можно изменять его размер (однако его нельзя разворачивать). Если переместить окно, то встроенная диаграмма все же будет отображаться на своем месте. Активизация другого окна приведет к тому, что окно диаграммы вновь станет невидимым.
ЧастьV.Совершенныеметодыпрограммирования |
459 |

Рис. 18.2.Отображениевстроеннойдиаграммывсобственномокне
Представленный далее код VBA представляет окно объекта ChartObject на активномлисте:
ActiveSheet.ChartObjects(1)-Activate ActiveChart.ShowWindow = True
Чтобыполучитьинформациюо практическом примененииокнавстроеннойдиаграммы, обратитесь к разделу "Печать встроенных диаграмм на всю страницу" далее в этой главе.
Деактивизация диаграммы
При записи макроса, который приводит к деактивизации диаграммы, генерируется следующий оператор:
ActiveWindow.Visible = False
Данный оператор выполняет деактивизацию диаграммы, однако не совсем понятно, почему она происходит. При создании макросов по управлению диаграммами лучше использовать метод Deselect, который также позволяет деактивизировать диаграмму:
ActiveChart.Deselect
Эти два оператора действуют по-разному. Когда активной является встроенная диаграмма, вызов метода Deselect не приводит к выделению ячеек на листе. А установка свойства Visible объекта ActiveWindow в значение False приводит к выделению диапазона, который был выделен перед активизацией диаграммы.
Определение активности диаграммы
Обычно макрос выполняет операции по отношению к активной диаграмме (выделенной пользователем). Например, макрос может изменять тип диаграммы, задавать другие цвета элементов или изменять размер используемого шрифта.
Возникает вопрос: как код VBA определяет, что пользователь выделил диаграмму? Под выделением диаграммы подразумевается активизация листа диаграммы или активизация
460 |
Глава 18. Управлениедиаграммами |

встроенной диаграммы в результате щелчка на ней. Первым этаном является проверка свойства TypeName объекта Selection с помощью следующего оператора:
TypeName(Selection) = "Chart"
Это выражение равно значению True, если лист диаграммы активен. Если же выделить встроенную диаграмму, то это выражение не будет равно значению True. Кроме того, если выделена встроенная диаграмма, то выделение может представлять объект, который содержится в объекте Chart. Например, выделением может являться объект Series, объект ChartTitle, объект Legend, объект PlotArea н т.д.
Функция ChartlsSelected, показанная ниже, возвращает значение True, если активным является лист диаграммы или встроенная диаграмма. В противном случае возвращается значение False:
Private Function ChartlsSelected() As Boolean ChartlsSelected = Not ActiveChart Is Nothing
End Function
Данная функция определяет равенство объекта ActiveChart и значения Nothing. Если это так, то активизирована не диаграмма.
Удаление объектов ChartObject или диаграмм
Для того чтобы удалить асе объекты ChartObject на рабочем листе, воспользуйтесь методом Delete коллекции chartObjects:
ActiveSheet.ChartObjects.Delete
Вы удалите все листы диаграмм в активной рабочей книге, если воспользуетесь оператором
ActiveWorkbook.Charts.Delete
Обычно при удалении листа в Excel появляется предупреждение, подобное представленному на рис. 18.3. Пользователь должен отреагировать на это предупреждение, чтобы продолжить работу макроса. Вы сможете избавиться от этого предупреждения, если воспользуетесь следующей последовательностью операторов:
Application.DisplayAlerts = False ActiveWorkbook.Charts-Delete Application.DisplayAlerts = True
Рис. 18.3. Если вы попытаетесь удалить один или несколь листовдиаграмм, топоявитсяэтоокносообщения
Форматирование диаграмм
Приведенный далее пример демонстрирует методы форматирования активной диаграммы:
Sub ChartModslO With ActiveChart
.Type = xlArea
.ChartArea.Font.Name = "Arial"
.ChartArea.Font.Fontstyle = "Regular"
.ChartArea.Font.Size = 9
Часть V. Совершенные методы программирования |
4f>1 |
.PlotArea.Interior.ColorIndex • xlNone
.Axes(xlValue).TickLabels.Font.Bold = True
.Axes(xlCategory).TickLabels.Font.Bold = True
.HasLegend = True
.Legend.Position = xlBottom End With
End Sub
Диаграмма должна быть активной, в противном случае выполнение этой процедуры приведет к появлению сообщения об ошибке. Вы также обратите внимание на то, что в коде свойство HasLegend устанавливается в значение True. Таким образом, вы сможете избежать сообщения об ошибке при установке свойства Position объекта Legend, если диаграмма не содержит легенду.
Ниже приведена другая версия процедуры ChartMods. В данном случае она применяется к определенной диаграмме — той, которая содержится в объекте ChartObj ect с названием Диаграмма1 и расположена на листе Лист1. Обратите внимание на то, что активизация диаграммы не производится:
Sub ChartMods2()
With Sheets{"Лист1").ChartObjects("Диаграмма!").Chart
.Type * xlArea
.ChartArea.Font.Name = "Arial"
.ChartArea.Font.FontStyle = "Regular"
.ChartArea.Font.Size = 9
.PlotArea.Interior.ColorIndex = xlNone
.Axes(xlValue).TickLabels.Font.Bold = True
.Axes(xlCategory).TickLabels.Font.Bold = True
.HasLegend = True
.Legend.Position = xlBottom End With
End Sub
Циклический просмотр диаграмм
В некоторых случаях необходимо выполнить операцию над всеми диаграммами. Приведенный ниже пример изменяет тип каждой встроенной диаграммы на активном листе. Процедура использует цикл For Next для циклического просмотра объектов в коллекции ChartObj ects . После этого изменяется свойство ChartType каждого объекта chart. Диаграмма с областями назначается с помощью предопределенной константы xlArea. Обратитесь к справочному руководству по VBA, чтобы получить информацию о константах, определяющих остальные типы диаграмм.
Sub ChangeChartType()
Dim chtobj as ChartObject
For Each chtobj In ActiveSheet.ChartObjects chtobj.Chart.ChartType = xlArea
Next chtobj End Sub
Следующий макрос выполняет ту же операцию, что и предыдущий, но работает со всеми листами диаграмм в активной рабочей книге.
Sub |
ChangeChartType2() |
||
|
Dim |
cht |
as Chart |
|
For |
Each |
cht In ActiveWorkbock.Charts |
|
|
cht.ChartType = xlArea |
|
462 |
|
|
Глава 18. Управление диаграммами |
Next cht End Sub
Приведенный далее пример изменяет шрифт легенды для всех диаграмм на активном листе. Для просмотра объектов ChartObj ect используется цикл For Next.
Sub LegendModO
Dim chtobj as ChartObject
For Each chtobj In ActiveSheet.ChartObjects With chtobj.Chart.Legend.Font
.Name - "Arial"
.FontStyle = "Bold"
.Size a 12 End With
Next chtobj End Sub
Изменение размера и взаимного расположения объектов ChartObject
Объект ChartObject имеет стандартные свойства. Они задают расположение и размер, к которым можно получать доступ с помощью VBA. Представленный ниже пример демонстрирует изменение размера всех объектов ChartObject на листе Лист1, в результате чего они будут соответствовать размерам объекта ChartObject с названием Диаграмма!.. Кроме того, взаимное расположение объектов ChartObject устанавливается таким,образом, чтобы они размешались один над другим в левой части листа.
Sub ResizeAndArrangeChartObjects()
Dim W As Double, H As Double Dim TopPos As Double
Dim chtobj As ChartObject
W = |
ActiveSheet.ChartObjects("Диаграмма!").Width |
||||
H = ActiveSheet.ChartObjects ( "Диаграмма!.") .Height |
|||||
TopPos = |
0 |
|
|
|
|
For |
Each |
chtobj |
In ActiveSheet.ChartObjects |
||
|
With |
chtobj |
|
|
|
|
|
.Width = |
W |
||
|
|
.Height |
= |
H |
|
|
|
.Left |
= |
0 |
|
|
|
.Top |
= |
TopPos |
|
|
End |
With |
|
|
|
|
TopPos = TopPos + H |
||||
Next |
chtobj |
|
|
|
|
End Sub |
|
|
|
|
|
ФаЬоласосводнымидиаграммами
В Excel 2000 представлен новый вид диаграмм — сводная диаграмма (объект Pivotcharc). Это средство позволяет создавать динамические диаграммы, которые привязываются к сводной таблице (объект pivotTable). Диаграмма pivotchart графически отображает текущую структуру сводной таблицы (PivotTable). При создании сводной таблицы предоставляется возможность создания сводной диаграммы, которая будет содержать связанную с ней структуру данных сводной таблицы. Для создания сводной диаграммы на основе существующей сводной таблицы активизируйте сводную таблицу и щелкните на кнопке запуска мастера диаграмм. На новом листе диаграммы будет создана сводная диаграмма. По умолчанию новая сводная диаграмма всегда находится на листе диаграммы (см', рисунок).
ЧастьV. Совершенныеметодыпрограммирования |
463 |

Однако можно воспользоваться командой Диаграмма^Расположение, чтобы преобразовать диаграмму на отдельном листе во встроенную диаграмму.
Когда Microsoft добавляет новую возможность в Excel, приходится вносить изменения в объектную модель Excel, чтобы к новой возможности можно было получить доступ с помощью VBA. В сводных диаграммах, объект pivotLayout находится в объекте chart. Наиболее удачным способом ознакомления с возможностями этого объекта является запись макросов при ручном создании и модификации сводных диаграмм. Дополнительную информацию об объектах, свойствах и методах можно получить, обратившись к справочному руководству по VBA.
Переменная TopPos отслеживает вертикальное расположение следующей диаграммы. Каждый раз при переходе к следующей диаграмме (следующая итерация) эта переменная увеличивается на значение Н (которое равно высоте объекта C h a r t O bj e c t ) .
Дополнительные методы управления диаграммами
В этом разделе рассматриваются дополнительные методы работы с диаграммами. Вы будете иметь возможность ознакомиться с примерами, которые демонстрируют использование VBA для изменения данных, используемых диаграммой.
Использование имен в формуле РЯД
Диаграмма может состоять из любого количества последовательностей. Данные, которые используются каждой последовательностью, определяются ссылками на диапазоны в формуле РЯД (SERIES). Дополнительная информация по этой теме приводится во врезке "Формула РЯД в диаграмме".
В некоторых случаях использование имен диапазонов в формуле РЯД диаграммы может намного упростить ситуацию, особенно если необходимо изменить источник данных диаграммы с помощью кода VBA. В качестве примера приведем следующую формулу РЯД:
= РЯД (; Лист! ! $А$1: $А$б ,-Лист! ! $В$1: $Б$€ ; 1)
464 |
Глава 18. Управлениедиаграммами |

ФормулаРЯДвдиаграмме
Данные, которые используются е каждой последовательности диаграммы, определяются формулой РЯД. При выделении последовательностей данных на диаграмме формула РЯД отображается на панели формул. Это не "настоящая" формула: ее нельзя использовать в ячейке рабочего листа и применять в этой формуле функции. Однако вы имеете возможность редактировать аргументы формулы РЯД.
ФормулаРЯДимеетследующийсинтаксис:
=РЯД(имя; подписи_категорий; значения;, порядок)
•ф- имя — указывает имя, которое используется в легенде {необязательный параметр). £сли на диаграмме присутствует только одна последовательность, то значение этого аргумента применяется в качестве заголовка;
<~ подписи_категорий — указываетдиапазон, который состоит из подписей для шкапы категорий (необязательный параметр). Если его пропустить, то Excel будет использовать последовательность целых чисел, начиная с 1.
-> значения — указывает диапазон, который содержит значения последовательности. •>• порядок — это целое число, которое указывает порядок представления последова-
тельностей (используется лишь тогда, когда диаграмма содержит более одной последовательности).
Ссылки на диапазоны в формуле ряд всегда абсолютные и содержат имя листа. Например:
=РЯД(Лист!?В$1;;Лист!$В$2;$В$7;1)
Ссылка может задаваться на прерывающийся диапазон. Если это так, то каждый диапазон разделяется точкой с запятой, а аргумент заключается в скобки. В следующей формуле в качестве значения указан диапазон В2: вз и В5: В7.
=РЯД(;j (Лист1!$В$2:$В$3;Лист1!$В55:$В$7);1)
Вместо ссылок на диапазоны можно вставить их имена. В результате, Excel изменит ссылку в формуле РЯД так, чтобы в ней использовалось имя рабочей книги.
=РЯД(Лист1!$В$1;jbudget.xls(MyData;1)
Можно определить имена для двух диапазонов (например, Categories и Data), после чего отредактировать формулу РЯД таким образом, чтобы она содержала имена диапазонов вместо ссылок на эти диапазоны. Отредактированная формула будет выглядеть следующим образом:
=РЯД(;Лист!Categories;Лист!Data;l)
Как только имена будут определены, а формула РЯД — отредактирована, в коде VBA можно использовать имена, и все проведенные изменения будут отображены на диаграмме. Например, приведенный ниже оператор "заменяет" ссылку на диапазон именем Data:
Range("Bl:B12").Name = "Data"
После выполнения этого оператора диаграмма обновляется и использует новое определение диапазона.
Метод Resize объекта Range рекомендуется использовать при изменении размера именованного диапазона. Например, следующий код расширяет диапазон Data так, что он пополняется новой строкой:
With Range("Data")
.Resize(.Rows.Count + 1, 1).Name = "Data" End With
ЧастьV.Совершенныеметодыпрограммирования |
4В5 |

Определение данных, которые используютсядиаграммой
Примеры, приведенные в этом разделе, демонстрируют способы использования VBA для изменения тех данных, на основе которых создается диаграмма.
Рис,18.4.Этадиаграммавсегдаотображаетданныестрокиактивнойячейки
Выбор данных для диаграммы на основе активной ячейки
На рис. 18.4 показана диаграмма, которая основана на данных строки активной ячейки. При активизации пользователем другой ячейки диаграмма автоматически обновляется.
В этом примере использована процедура обработки события для объекта Worksheet. Событие S e l e c t i o n C h a n g e происходит каждый раз, когда пользователь изменяет активную ячейку, тем самым влияя на выделение. Процедура обработки этого события (которая находится в модуле кода для объекта Лист!) приводится ниже.
Private Sub worksheet_Selectionch.a.nge(ByVal Target _ As Excel.Range)
Call UpdateChart End Sub
Другими словами, каждый раз, когда пользователь изменяет активную ячейку, выполняется процедура Worksheet _ SelectionChange . Эта процедура вызывает процедуру UpdateChart:
Sub UpdateChart()
Dim TheChartObj As ChartObject Dim TheChart As Chart
Dim UserRow As Long Dim CatTitles As Range Dim SrcRange As Range
465 |
Глава18.Управлениедиаграммами |

Dim SourceData As Range
If Sheets(вЛист1").CheckBoxl Then
Set TheChartObj = ActiveSheet.ChartObjects(1)
Set TheChart = TheChartObj.Chart
UserRow = ActiveCell.Row
If UserRow < 3 Or IsEmptyfCells(UserRow, 1)) Then
TheChartObj.Visible = False
Else
Set CatTitles = Range("A2:F2•)
Set SrcRange = Range(Cells(UserRow, 1), Cells{UserRow, 6))
Set SourceData = Union(CatTitles, SrcRange)
TheChart.SetSourceData _
Source:=SourceData, PlotBy:=xlRows
TheChartObj.Visible = True
End If
End If
End Sub
Первым шагом процедуры является определение состояния флажка Автоматическое обновление диаграммы. Если этот флажок не установлен, то ничего не происходит. Переменная UserRow содержит номер строки активной ячейки. Оператор If проверяет расположение активной ячейки в строке, содержащей данные (данные начинаются со строки 3). Если указатель на ячейку находится е строке, не содержащей данные, то объект C h a r t O b j e c t скрывается. В противном случае код создает объект Range (с именем Cat T i t l e ) , который содержит подписи категорий, и другой объект Range (с именем SrcRange), который содержит данные строки. Эти два объекта Range объединяются с помощью функции VBA Union и присваиваются объекту Range под именем SourceData . Наконец, диапазон S o u r c e D a t a указывается в качестве данных диаграммы посредством метода S e t S o u r c e D a t a объекта Chart .
Изменение диаграммы с помощью элемента управления ComboBox
Следующий пример демонстрирует использование элемента управления ComboBox для управления листом диаграммы. Он позволяет выбирать тип диаграммы в раскрывающемся списке (рис. 18.5).
Элемент управления ComboBox, который использовался в приведенном примере, вставлен с панели инструментов Формы (а не с панели инструментов Элементы управления). Помните, что Excel не позволяет добавлять на лист диаграммы элементы управления ActiveX.
Эта рабочая книга доступна на Web-узле издательства.
Макрос DropDownl_Change назначается элементу управления ComboBox. Когда пользователь выбирает одну из опций в элементе управления ComboBox, запускается следующая процедура.
Sub DropDownl_Change()
Listlndex = Charts(1).DropDovms(1}.Value
Call TjpdateChart (Listlndex)
EndSub
ЧастьV.Совершенныеметодыпрограммирования |
467 |

Рис. 18.5. Изменение значения элемента управления ComboBox приводит к замене источникаданныхдиаграммы
Данная процедура вызывает процедуру U p d a t e C h a r t и передает ей целое число, которое представляет элемент, выбранный пользователем. Ниже приводится листинг процедуры U p d a t e - Chart (она подобна процедуре U p d a t e C h a r t из предыдущего раздела).
Sub UpdateChart{Item)
1Обновляет диаграмму после выбора опции в списке Dim TheChart As Chart
Dim Datasheet As Worksheet
Dim CatTitles As Range, SrcRange As Range Dim SourceData As Range
Set TheChart = Sheets("Диаграмма!") Set Datasheet = Sheets("Лист1")
With Datasheet
Set CatTitles = .Range("A2:F2")
Set SrcRange = .Range(.Cells(Item + 2, 1), _
.Cells(Item + 2 , 6))
End With
Set SourceData = Union(CatTitles, SrcRange)
With TheChart
.SetSourceData Source:=SourceData, PlotBy:=xlRows
.ChartTitle.Left = TheChart.ChartArea.Left
.Deselect
End With
End Sub
Определение источника данных для диаграммы: первый метод
Предположим, что у нас есть встроенная диаграмма, подобная той, которая представлена на рис. 18.6. Эта диаграмма отображает данные о количестве клиентов за каждый из трех месяцев. Необходимо создать процедуру VBA, которая будет расширять источник данных диаграммы
468 |
Глава 18. Управление диаграммами |