Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Diagrammy_v_Excel_Dzhon_Uokenbakh_2003

.pdf
Скачиваний:
31
Добавлен:
26.03.2016
Размер:
33.34 Mб
Скачать

MsgBox 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

На рис. 16.5 показана гистограмма, выводящая 30 столбиков. Ячейки столбца D содержат значения границ интервалов, определяющие цвета столбиков (образцы цве­ тов заданы в столбце Е). Каждое значение в столбце D определяет нижнюю границу диапазона данного цвета. Например, значение, большее или равное О (ячейка D2), но меньшее, чем 10 (ячейка D3), выводится цветом, указанным в ячейке Е2.

J I

Макрос выполняет условное фораатированик цветов

54

72

78

Спайные

1 3 б 7 в 11 13 15 17 18 21 23 25 27 28

«эначакня

 

И 4 > ИКПиНДУ"

ill. ±ий

Рис. 16.5. Макрос устанавливает цвета столбиков в зависимости от значений точек данн

Код макроса, устанавливающего цвета столбиков, имеет следующий вид:

Sub

НастроитьЦветаО

 

 

 

 

 

Dim Ser

As

Series

 

 

 

 

 

Dim

Pt As

Point

Range,

c e l l As

Range

 

 

Dim ColorBins As

 

 

Dim

i As

Long

 

 

 

_

 

Set

Ser

= ActiveSheet.ChartObjects(1)

 

Set

 

 

 

. Chart . SeriesCollection(1)

 

ColorBins = Range("ColorBins")

 

 

For

i =

1 To Ser.Points.Count

 

= xlNone

 

 

S e r . P o i n t s ( i ) . I n t e r i o r . C o l o r l n d e x

 

 

For

Each c e l l

In ColorBins

Then

 

 

 

 

If

Ser.Values(i)

>= c e l l

 

 

 

 

 

S e r . P o i n t s ( i ) . I n t e r i o r . C o l o r l n d e x = __

 

 

 

 

c e l l . O f f s e t ( 0 , 1 ) . I n t e r i o r . C o l o r l n d e x

 

 

Next

End If

 

 

 

 

 

Next

c e l l

 

 

 

 

End

i

 

 

 

 

 

 

Sub

 

 

 

 

 

 

 

В процедуре НастроитьЦвета используется два цикла. Внешний цикл For-Next перечисляет объекты Point. Внутренний цикл For Each-Next перечисляет интерва­ лы, заданные в диапазоне D2:D7. Если значение точки данных больше или равно зна­ чению ячейки столбца D, то свойству Colorlndex объекта I n t e r i o r присваивается соответствующий цвет.

Установка значений шкалы оси

На рис. 16.6 показан рабочий лист с графиком, выводящим данные столбца А. Лист со­ держит три именованные ячейки: МинимумОси (D2), МаксимумОси (D3) и ЦенаОсновных-

404

Часть III. Использование VbA

Делений (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

Фиксация размера текста элементов диаграммы

Конечно, вы уже заметили, что размеры текстовых элементов диаграмм по умолчанию настраиваются автоматически. При изменении размеров диаграммы размеры текстов соот­ ветственно подстраиваются. Во многих случаях результаты автоматической подстройки вполне приемлемы. Однако чаще всего Excel не может угадать, что вам нужно, и после изменения размеров диаграммы приходится редактировать свойства текста вручную.

Чтобы отключить автоматическую настройку шрифтов для всех элементов диаграм­ мы, активизируйте вкладку Шрифт диалогового окна Формат области диафаммы и сни­ мите флажок Автомасштабирование. Однако тогда все текстовые элементы диаграммы будут выводиться шрифтом с теми же параметрами, что и у области диаграммы!

Как ни странно, если установить свойство AutoScaleFont объекта ChartArea в False с помощью кода VBA, этого побочного эффекта не наблюдается. Свойства AutoScaleFont всех элементов диаграммы, содержащих текст, устанавливаются в False, однако текущие параметры их шрифтов сохраняются.

Указанная особенность используется в макросе ФиксацияРазмераТекстов. Мак­ рос устанавливает свойство AutoScaleFont объекта ChartArea в False, замораживая этим размеры шрифтов всех текстовых элементов диаграммы.

Sub ФиксацияРазмераТекстовО

If ActiveChart Is Nothing Then MsgBox "Выделите диаграмму." Exit Sub

End If

ActiveChart.ChartArea.AutoScaleFont = False End Sub

Разработанная автором надстройка JWalk Chart Tools содержит утилиту фик­ сации размеров текстовых элементов диаграмм.

Установка полупрозрачных рядов

в главе 6, "Автофигуры и графика", описана методика создания полупрозрачных столбиков и полосок диаграммы путем копирования и вставки объектов рисунков. Методика довольно трудоемкая: нужно вручную создать рисунок, сделать его полу­ прозрачным, скопировать, вставить в ряд диаграммы и наконец удалить. Приведен­ ный ниже макрос автоматизирует весь этот процесс.

Sub СделатьРядыПолупрозрачнымиО Dim TempShape As Shape

Dim TheColor As Double Dim Ser As Series

Dim BorderLineStyle As Integer

Dim BorderColorlndex As Integer Dim BorderWeight As Integer

If ActiveChart Is Nothing Then Exit Sub Application.ScreenUpdating = False

For Each Ser In ActiveChart.SeriesCollection If (Ser.ChartType = xlColumnClustered Or __ Ser.ChartType = xlColumnStacked Or _ Ser.ChartType = xlColumnStackedlOO Or _ Ser.ChartType = xlBarClustered Or _ Ser.ChartType = xlBarStacked Or _ Ser.ChartType = xlBarStackedlOO) Then

'Сохранение цвета и параметров рамок TheColor = Ser.Interior.Color BorderLineStyle = Ser.Border.LineStyle

4 0 6

Часть III. Использование V B A

BorderColorlndex = Ser.Border.Colorlndex BorderWeight = Ser.Border.Weight

' Создание рисунка

Set TempShape = ActiveSheet.Shapes.AddShape _ (msoShapeRectangle, 1, 1, 100, 100)

With TempShape

.Fill.ForeColor.RGB = TheColor

.Fill.Transparency = 0.4 'Прозрачность 40%

.Line.Visible = msoFalse End With

' Копирование и вставка рисунка TempShape.CopyPicture Appearance:=xlScreen, _

Format:=xlPicture

With Ser

.Paste

'Применение сохраненных параметров

.Border.Weight = BorderWeight

.Border.LineStyle = BorderLineStyle

.Border.Colorlndex = BorderColorlndex End With

TempShape.Delete End If

Next Ser End Sub

В макросе СделатьРядыПолупрозрачными в цикле перечисляются все ряды актив­ ной диаграммы. Если ряд отображается столбиком или полоской, макрос сохраняет цвет заполнения и параметры рамки во вспомогательных переменных. Затем макрос создает временный объект рисунка, устанавливает прозрачность 40%, удаляет рамку, копирует рисунок, вставляет его в ряд, применяет к нему сохраненные цвет заполне­ ния и параметры рамки и удаляет рисунок. Все это происходит мгновенно.

На рис. 16.7 показана диаграмма до и после установки полупрозрачных рядов. Об­ ратите внимание: в нижней диаграмме линии сетки видны сквозь столбики.

10080

 

п

Ж..

 

 

 

 

 

 

 

4 0

-

 

1 LI'J-' »

-

"Jkг - |

20

 

 

X •

 

 

 

т

1

60

 

Нш

L^n.•,

 

 

0

-

 

 

1

 

-

4

 

Ш

 

 

 

 

2 3

-шш5

6

 

 

 

[•Щ^Н L^B

 

 

 

 

1НЯ

100 -1

8 0 -

60 •

4 0 -

 

ИНД HEs

 

"•Д:::

| М | Д 1 | ^

 

2 0 -

 

11114:

•-•^^^gvl"

 

 

 

 

0 -

 

 

 

 

 

 

1

2

3

4

5

6

Рис. 16.7. Диаграмма до и после выполнения макроса

Сдела ть РядыПолупрозра чными

Глава 16. Использование VBA в диаграммах

407

Назначение макроса объекту 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]