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

Diagrammy_v_Excel_Dzhon_Uokenbakh_2003

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

If TypeName(Selection) <> "Range" Then Exit Sub Set DataRange = Selection

ChtTop = DataRange.Top + DataRange.Height

ChtLeft = DataRange.Left + DataRange.Width

Set ChtObj = ActiveSheet.ChartObjects.Add _ (ChtLeft, ChtTop, 300, 200)

With ChtObj.Chart

.ChartType = xlColumnClustered

.SetSourceData Source:=DataRange, PlotBy:=xlColurans

.HasLegend = False

.HasTitle = True

.ChartTitle.Characters.Text = "Заголовок диаграммы"

.Parent.Select End With

End Sub

Макрос начинается с объявления четырех вспомогательных переменных. Затем проверяется, выделен ли диапазон. Если нет, то макрос завершается. Переменная DataRange устанавливается таким образом, чтобы представлять вьщеленный диапа­ зон. В переменные ChtTop и ChtLef t записываются координаты левого верхнего угла диаграммы. Они вычисляются на основе параметров выделенного диапазона.

Затем с помощью метода Add коллекции Chartobjects добавляется объект Chartobject. Обратите внимание: в записанном макросе для этого используется метод Add коллекции Charts, в результате чего в рабочую книгу добавляется новый лист диа­ грамм. Добавление объекта Chartobject — более эффективный способ, поскольку при его создании можно задать его размеры и положение (передав их в качестве аргументов).

Дальше код устанавливает различные свойства объекта chart, входящего в объект Chartobject. Последний оператор (Parent.Select) выделяет созданный объект Chartobject.

Макрос Создать Диаграмму можно модифицировать различными способами. На­ пример, можно задавать другой тип диаграммы, устанавливать цвета, добавлять или удалять линии сетки и т.д.

Создание диаграмм на основе данных разных листов

в примере этого раздела используется рабочая книга, содержащая пять рабочих листов. Макрос СоздатьПятьДиаграмм создает пять внедренных диаграмм на основе данных, рас­ положенных в разных листах. Проблема состоит в том, что разные листы содержат различ­ ные диапазоны данных — меняется количество строк данных и, следовательно, номера по­ следних строк, используемых диаграммами. На рис. 16.9 показан один из рабочих листов (остальные отличаются от него количеством строк данных).

ie|Pici6_09.Ki$

в

g

-

g — -

ШтШ^^ШШ

 

2

¥:^^J$^i0.

•• g - . , . , ; , —jiB

ЫШУУШЛ

1

 

 

 

 

 

уШ

 

 

 

 

 

^ 1

3

Представитель

Янв

Фев

 

Map

Ито1:н la кв.1

у

4

Джонсон

$9 282

$3 486

 

$9 483

$22 251

 

6

Уилсон

$11 493

$10 696

 

$8 497

$30 686

 

6

Фернандес

$10172

$8 139

 

$9 704

$28 015

щ

7

Кавалиер

$10 356

$3 251

 

$6 955

$20 562

 

 

8

Уэснер

$12 630

$3 763

 

$5 364

$21 757

 

9

Питтман

$4 649

$8 484

 

$11237

$24 370

 

Ш

Всего

$58 582

$37 819

 

$51 240

$147 641

 

11

 

 

 

 

 

 

 

лп

!• Hf^ iSftatp&mb../}Ькг1\пис Т 2 / ; > К ? Э / А И (Шл1, :" -У::-:^ Л

 

\н 4

 

Рис. 16.9. Один из пяти рабочих листов, используемых при

создании диаграмм

 

 

 

 

 

410

 

 

 

 

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

Хотя код макроса СоздатьПятьДиаграмм может показаться сложным, на самом деле он довольно прямолинеен. В главном цикле перечисляются листы, создаются диаграм­ мы и выполняется их форматирование. Используемые объекты и свойства аналогичны полученным в записанном макросе. Фактически записанный код с некоторыми измене­ ниями всего лишь вставлен в главный цикл макроса СоздатьПятьДиаграмм.

Sub СоздатьПятьДиаграммО

Dim ChtObj As ChartObject

Dim ChtTop As Long, ChtLeft As Long

Dim ChtHeight As Long, ChtWidth As Long Dim Sht As Worksheet

Dim LastRow As Long

ChtTop = 1

ChtLeft = 1 ChtHeight = 180 ChtWidth = 300

Application.ScreenUpdating = False

For Each Sht In ActiveWorkbook.Worksheets If Sht.Name <> ActiveSheet.Name Then

LastRow = Sht.Range("B65536").End{xlUp).Row

Set ChtObj = ActiveSheet.ChartObjects.Add _

(ChtLeft, ChtTop, ChtWidth, ChtHeight) 'Добавление ряда ChtObj.Chart.SeriesCollection.NewSeries With ChtObj.Chart.SeriesCollection(1)

.Values = Sht.Range(Sht.Cells(LastRow, 2), _ Sht.Cells(LastRow, 4))

.XValues = Sht.Range("B3:D3")

.Interior.Colorlndex = 3 End With

With ChtObj.Chart

'Задание типа диаграммы

.ChartType = xlColumnClustered 'Настройка ширины зазора

.ChartGroups(1).GapWidth = 2 0 'Удаление цвета области построения

.PlotArea.Interior.Colorlndex = xlNone 'Установка размера шрифта

.ChartArea.Font.Size = 9 'Удаление легенды

.HasLegend = False 'Добавление заголовка

.HasTitle = True

.ChartTitle.Characters.Text=Sht.Range("Al") 'Настройка шкалы

.Axes(xlValue).MinimumScale = 0

.Axes(xlValue).MaximumScale = 120000 'Изменение линий сетки

.Axes(xlValue).MajorGridlines.Border. _ LineStyle = xlDot

End With

ChtTop = ChtTop + ChtHeight End If

Next Sht Application.ScreenUpdating = True

End Sub

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

4 1 1

Макрос начинается с объявления вспомогательных переменных. Переменная ChtTop используется для позиционирования диаграмм (они располагаются одна под другой). Затем код в цикле перечисляет рабочие листы (пропустив активный рабочий лист, содержащий не данные, а кнопки и диаграммы).

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

Затем добавляется объект Chartobject и создается новый ряд с помощью метода NewSeries. Последующие операторы присваивают значения диапазона данных свой­ ству Values и значения диапазона подписей оси категорий свойству xvalues. Обра­ тите внимание: диапазоны подписей осей категорий одни и те же в каждом листе, по­ этому искать диапазоны в коде нет необходимости. Следующий оператор изменяет цвет столбиков.

После этого код макроса форматирует диаграмму. И наконец, обновляется пере­ менная ChtTop, чтобы она была готова к использованию при создании следующей диаграммы. В компьютере все эти операции выполняются мгновенно.

Изменение размеров и выравнивание диаграмм

При работе с несколькими внедренными диаграммами иногда нужно, чтобы все они имели одинаковые размеры и были одинаково выровнены. Эти операции выпол­ няет макрос ИзменениеРазмеровИВыравнивание.

Sub ИзменениеРазмеровИВыравнивание О

Dim ChtWidth As Long, ChtHeight As Long

Dim TopPosition As Long, LeftPosition As Long

Dim ChtObj As ChartObject

If ActiveChart Is Nothing Then Exit Sub

'Получение размеров активной диаграммы ChtWidth = ActiveChart.Parent.Width

ChtHeight = ActiveChart.Parent.Height

TopPosition = ActiveChart.Parent.Top

LeftPosition = ActiveChart.Parent.Left

For Each ChtObj In ActiveSheet.ChartObjects ChtObj.Width = ChtWidth

ChtObj.Height = ChtHeight

ChtObj.Top = TopPosition

ChtObj.Left = LeftPosition

TopPosition = TopPosition + ChtObj.Height Next ChtObj

End Sub

Макрос ИзменениеРазмеровИВыравнивание устанавливает размеры всех диаграмм

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

одна под другой.

В переменной TopPosition хранится вертикальная позиция текущей диаграммы,

значение переменной TopPosition изменяется в цикле. Новая вертикальная позиция

определяется координатой позиции предыдущей диаграммы плюс высота объекта

Chartobject. В результате аккуратно выровненные диаграммы располагаются одна под другой без пустого пространства между ними.

412

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

Надстройка JWalk Chart Tools содержит утилиту, с помощью которой можно изменить размеры всех диаграмм активного рабочего листа соответственно размерам активной диаграммы (рис. 16.10).

t^M

OatatAbels OiirtSfe« |Expc*t|Pirtur«|T*xtSfeeIChartReport|

ш^

^ ^^^..^^J^.^.

^<^^^ ^^ thtTstee)

О

Рис. 16.10. Диалоговое окно утилиты Chart Size, входящей в надстройку JWalk Chart Tools

Задание подписей данных

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

Базовый макрос

На рис. 16.11 показана точечная диаграмма. Требуется разместить возле каждой точки подписи данных, содержащие значения столбца А. Ниже приведен макрос, вы­ полняющий эту задачу.

Sub ВывестиПодписиДанных()

Dim Ser As Series, Pt As Point Dim Counter As Long

Set Ser = ActiveSheet.ChartObjects(1). _ Chart.SeriesCollection(1)

Ser.HasDataLabels = True Counter = 1

For Each Pt In Ser.Points

Pt.DataLabel.Text = Range("Al").Offset(Counter, 0) Counter = Counter + 1

Next Pt End Sub

Макрос ВывестиПодписиДанных создает объектную переменную Ser, представ­ ляющую ряд данных диаграммы. Затем ее свойство HasDataLabels устанавливается в True (без этого макрос завершился бы с ошибкой). Следующий оператор инициали­ зирует переменную Counter значением 1. Затем цикл For Each-Next перечисляет объекты Point, принадлежащие ряду данных. В цикле свойствам Text объектов DataLabel (подпись данных), принадлежащих объектам Pt, присваиваются значения ячеек, адреса которых вычисляются как смещения относительно ячейки А1. Строка смещений определяется значением переменной Count, увеличивающимся на 1 в каж­ дой итерации цикла.

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

413

| d | P i c I 6 _ l 1.KIS

 

•:^^r<•::,^^r•': :;,::•

^;.:::,^-Ш^^^^^^^^^^^^

 

и^вмщ

 

^ШШй

6

р

,0 ] Е

1 ^

 

 

 

^-^:%:i^:"i

 

f:,.'.\ ./0'-.' |ч'Н ,v3,-:Jr-!}

 

 

Студент 1 Предварительный

Основной

 

 

 

 

 

л'

 

 

 

1

тест

тест

Результаты предварительного и основного

 

 

 

 

2

Абигайль

93

82

 

 

тестировании

 

 

f y - Бетси

64

75

100 •

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f ^

Карл

73

87

 

 

 

 

 

 

 

Дэвид

89

91

 

 

 

 

 

 

6

Эрни

57

64

90 -

 

 

 

 

 

и.7

Франсина

79

91

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

80 -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

jTf

 

 

 

 

 

70 -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p f

 

 

 

 

 

60 •

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pf

 

 

 

 

 

50 •

 

 

 

 

 

Щ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

50

60

70

80

90

100

m

 

оУ

 

 

.ill

 

\::,„/у

- . . '

 

А

 

 

 

 

^Л 'iiJ>J

|H 4

 

И КЛис

 

 

 

 

 

 

 

 

Pwc. 7^./7. ^ этой диаграмме макрос выведет подписи данных возле каждой точки

Вывод связанных подписей данных

в подпись данных можно записать простую формулу, ссылающуюся на ячейку. Тогда подпись будет связана с ячейкой, в результате чего изменение значения в ячейке будет отображено в диаграмме. Модифицировать макрос таким образом, чтобы он связывал подписи данных с ячейками, несложно. Нужно изменить всего один оператор:

Pt.DataLabel.Text = "=" & Range("А1").Offset(Counter, 0) _

.Address(True, True, xlRlCl, True)

Этот оператор вставляет в подпись данных знак равенства (обозначающий формулу) и свойство Address ячейки. Свойство Address принимает четыре аргу­ мента. После выполнения модифицированного макроса первая подпись данных ряда содержит формулу

=Лист1!$А$2

Аргументы свойства Address указывают, что адрес ячейки

представлен

как абсолютная ссылка (аргументы 1 и 2) и применяется

стиль R1C1

(аргумент 3) во внешнем формате (аргумент 4). Внешний формат адреса означает, что ссылка на ячейку содержит имя листа. Стиль R1C1 при­ шлось применить ввиду странной недокументированной причуды свойства

Address.

Вывод приглашения задать диапазон

в предьщущих макросах диапазон подписей данных жестко закодирован. Однако иногда требуется задавать диапазон интерактивно. Для этого в приведенном ниже макросе ЗадатьДиапазонСПодписями используется метод inputBox, выводящий про­ стое диалоговое окно. В нем пользователь может задать первую ячейку диапазона, или введя ее адрес, или просто щелкнув на ней (рис. 16.12).

414

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

Рис, 16J2. Метод Input Box выводит диалоговое окно, пригла­ шающее пользователя задать первую ячейку диапазона

Макрос ЗадатьДиапазонСПодписями похож на предьщущие макросы, за исключе­ нием того, что в него добавлен код вывода диалогового окна. Адрес указанной поль­ зователем ячейки присваивается переменной RngLabels (это объект типа Range), Об­ ратите внимание на оператор, проверяющий, задал ли пользователь какую-либо ячей­ ку. Если пользователь, ничего не задав, щелкнул на кнопке Отмена, то макрос завершается. Оператор Error Resume Next необходим потому, что без него щелчок на кнопке Отмена влечет за собой ошибку. Обратите также внимание на второй опе­ ратор Set, в котором используется объект RngLabels. Благодаря этому оператору объекту RngLabels присваивается только первая ячейка, даже если пользователь по небрежности выбрал не одну, а несколько ячеек.

Sub ЗадатьДиапазонСПодписямиО Dim RngLabels As Range Dim Ser As Series

Dim i As Long

On Error Resume Next

Set RngLabels = Application.InputBox _

(prompt:="Адрес первой ячейки с подписями:", Туре:=8)

If RngLabels

Is

Nothing Then Exit Sub

'Отмена

Set

RngLabels

=

RngLabels(1)

 

On Error

GoTo 0

 

 

_

Set

Ser

= ActiveSheet.ChartObjects(1)

 

 

 

 

. Chart . SeriesCollection(1)

Ser.HasDataLabels = True

 

Counter

= 0

 

 

 

 

For

Each Pt In Ser . Points

 

 

Pt.DataLabel.Text

= RngLabels.Offset(Counter, 0)

Next

Counter = Counter

+ 1

 

Pt

 

 

 

 

 

End Sub

В рабочей книге Р1с1б_гистограмма с подписями данных.xls приведен ана­ логичный пример для гистограммы.

Надстройка JWalk Chart Tools содержит утилиту, применяющую подписи дан­ ных к активной диаграмме.

Экспорт диаграмм как файлов GIF

Сохранить диаграмму как файл GIF несложно. Для этого достаточно запустить ме­ тод Export объекта chart. Ниже приведен макрос, сохраняющий активную диаграм­ му в файле Диаграмма1 .gif.

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

415

Sub ЭкспортироватьВОТРО

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

Else

ActiveChart.Export "Диаграмма!.gif", "GIF" End If

End Sub

Сначала макрос проверяет, существует ли активная диаграмма; если да, то сохра­ няет ее в файле текущего каталога.

Если вы предпочитаете задавать имя и расположение файла интерактивно, используйте приведенный ниже макрос СохранитьКак01Р. В нем функция GetSaveAsFilename выво­ дит диалоговое окно, в котором представлено имя файла по умолчанию (оно совпадает с именем диаграммы) и каталог. Пользователь может или оставить параметры по умолча­ нию, или выбрать другие имена файла и каталога. На рис. 16.13 показано диалоговое окно, выводимое макросом. Если щелкнуть на кнопке Отмена, функция GetSaveAsFilename возвращает значение False. В этом случае макрос завершается, не выполнив никаких действий.

Sub СохранитьКакС1Е{)

'Ввод имени файла и каталога Dim FileName As Variant

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

End If

'Получение имени файла

FileName = Application.GetSaveAsFilename( __

InitialFileName:=ActiveChart.Name & ".gif", _

FileFilter:="Фaйлы GIF (*.gif), *.gif",

Title:="Сохранить диаграмму как файл GIF")

If FileName о False Then

ActiveChart.Export FileName, "GIF"

End If

End Sub

шеш \^ шшггтшМои рисункиш

" 3 < ^ ^ 0 D | Q X G Ш-сервис-

 

WM'J^JM

Мои

AO»syMeHtb»

Из€раино«

 

 

 

 

Щг^

Иняфайяа:

|лист1 Диагр. l.gif

•ц

Сощашхь \

Мое «теаое

 

 

окружение

Типфайла:

|файлыС1Р(*.д10

 

J

 

 

Рис. 16.13. Функция GetSaveAsFilename выводит диалоговое окно, в котором можно задать имя файла и каталог

416

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

Надстройка JWalk Chart Tools содержит утилиту, предназначенную для экспор­ та диаграмм как файлов GIF.

Скорость выполнения кода VBA

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

Отключение обновлений экрана

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

Application.ScreenUpdating = False

Если вы захотите, чтобы пользователь в любой точке макроса смог увидеть результаты его работы, вставьте оператор включения обновлений экрана:

A p p l i c a t i o n . S c r e e n U p d a t i n g = True

Отключение предупреждений

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

Чтобы отключить вывод предупреждений, вставьте в код VBA следующий оператор:

A p p l i c a t i o n . D i s p l a y A l e r t s = False

Когда процедура завершается, свойству DisplayAlert автоматически присваивается его нормальное значение True.

Упрощение ссылок на объекты

Как вы уже, видимо, обнаружили, ссылки на объекты могут быть довольно длинными, особен­ но если объект расположен не в активном листе или не в активной рабочей книге. Например, полностью квалифицированная ссылка на объект Series (ряд) может выглядеть так:

Workbooks("Книга!").Worksheets("ЛистХ").ChartObjects(1) _

. C h a r t . S e r i e s C o l l e c t i o n ( l )

Если в макросе часто используется некоторый объект, то с помощью команды Set можно создать представляющую его объектную переменную. Например, приведенный ниже опе­ ратор присваивает объект series объектной переменной ChtSer.

Set ChtSer = Workbooks("Книга!").Worksheets("Лист1") _ ChartObjects(!) . C h a r t . S e r i e s C o l l e c t i o n (!)

После этого объектную переменную chtSer можно использовать вместо длинной ссылки.

Объявление типов переменных

Обычно вам не нужно заботиться о типе значения, присваиваемого переменной. Excel преобразует типы автоматически. Например, переменной Перем!, тип которой не объяв­ лен, можно присваивать любые числа, даты, текстовые строки и т.д. Однако, если вы хо­ тите, чтобы процедура выполнялась быстрее, вы должны заранее сообщить Excel о типах значений, которые будут присваиваться переменным. Такая операция называется объяв­ лением типа. В главе 14, "Принципы программирования на VBA", типы данных рассмотре­ ны более подробно.

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

4 1 7

Выяснение диапазонов, используемых диаграммой

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

Свойство Formula возвращает или устанавливает формулу РЯД. Когда ряд диа­ граммы вьщелен, формула РЯД ВЫВОДИТСЯ В строке формул. Свойство Formula возвращает содержимое строки формул как текстовую строку.

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

Свойство XValues возвращает или устанавливает массив значений X ряда диа­ граммы. Свойству XValues можно присвоить диапазон рабочего листа или мас­ сив значений, но не их комбинацию. Свойство XValues может быть пустым.

Создавая макрос VBA, выясняющий диапазон данных ряда, вы можете подумать, что свойство Values объекта Series — как раз то, что нужно. Вполне подходящим для решения задачи кажется и свойство XValues, содержащее значения х (или подпи­ си категорий). Теоретически применение этих свойств кажется вполне логичным, од­ нако на практике они не сработают. Установить свойство Values объекта Series можно, задав объект Range или массив. Однако если попытаться прочитать свойство Values, то всегда возвращается только массив! К сожалению, объектная модель Excel не предоставляет способа получения объекта Range, используемого объектом Series.

Одно из возможных решений состоит в написании кода, выполняющего синтакси­ ческий разбор формулы РЯД с извлечением из нее адресов диапазонов. На первый взгляд кажется, что реализовать такой способ довольно легко, однако в действитель­ ности это непростая задача, потому что формула РЯД может быть весьма сложной. Ниже приведено несколько примеров правильных формул РЯД.

=РЯД(Лист11$В$1,Лист1!$А$2:$А$4,Лист11$В$2:$В$4,1) =РЯД(,,Лист1!$В$2:$В$4,1) =РЯД(,Лист1!$А$2:$А$4,Лист1!$В$2:$В$4,1) =РЯД("Продажи",,Лист1!$В$2:$В$4,1) =РЯД(,{"Янв","Фев","Мар"},Лист11$В$2:$В$4,1) =РЯД(,(Лист1!$А$2,Лист1!$А$4),(Лист1!$В$2,Лист1!$В$4),1)

=РЯД(Лист11$В$1,Лист1!$А$2:$А$4,Лист1!$В$2:$В$4,1,Лист11$С$2:$С$4)

Как видите, в формуле ряд могут фигурировать пропущенные элементы, массивы и даже адреса неоднородных диапазонов. Кроме того, формула ряд пузырьковой диа­ граммы имеет дополнительный аргумент (последний пример в приведенном выше списке). Таким образом, синтаксический разбор аргументов формулы РЯД — задача далеко не тривиальная.

Яработал над этой проблемой несколько лет и наконец нашел решение. Оно со­ стояло в анализе формулы РЯД С ПОМОЩЬЮ вспомогательной функции, которая при­ нимает аргументы формулы РЯД и возвращает массив размерностью 2x5, содержащий всю информацию этой формулы.

Яупростил решение путем создания четырех специализированных функций VBA, каждая из которых принимает один аргумент (ссылку на объект Series) и возвращает массив из двух элементов.

4 1 8

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

SERiESNAME_FROM_SERiES. Первый элемент массива содержит строку, описы­ вающую тип данных первого аргумента формулы РЯД (строку "Range", "Empty" или "String"). Второй элемент массива содержит адрес диапазона, пустую строку или заполненную строку.

XVALUES_FR0M_SERIES. Первый элемент массива содержит строку, описываю­ щую тип данных второго аргумента формулы ряд (строку "Range", "Empty" или "string"). Второй элемент массива содержит адрес диапазона, массив, пустую строку или заполненную строку.

VALUES_FROM_SERiES. Первый элемент массива содержит строку, описываю­ щую тип данных третьего аргумента формулы РЯД (строку "Range" или "Array"). Второй элемент массива содержит адрес диапазона или массив.

BUBBLESiZE_FROM_SERiES. Первый элемент массива содержит строку, описы­ вающую тип данных пятого аргумента формулы РЯД (строку "Range", "Array" или "Empty"). Второй элемент массива содержит адрес диапазона, массив или пустую строку. Эта функция применима только для пузырьковых диаграмм.

Обратите внимание на отсутствие функции для получения четвертого аргумента формулы РЯД (последовательности вывода рядов). Этот аргумент можно получить не­ посредственно с помощью свойства PlotOrder объекта Series.

В качестве примера ниже приведена процедура, выводящая адрес диапазона значе­ ний первого ряда активной диаграммы. Код процедуры вы можете найти в файле

Picl6_BbiHCHeHMe диапазонов диаграммы.xls.

Sub ВыводАдресаДиапазона () Dim Ser As Series

Dim X As Variant

Set Ser = ActiveChart.SeriesCollection(1) X = VALUES_FROM_SERIES(Ser)

If x(l) = "Range" Then

MsgBox Range(x(2)).Address End If

End Sub

Переменная x, определенная с типом Variant, принимает массив из двух элемен­ тов, возвращаемый функцией VALUES_FROM_SERIES. Первый элемент массива х со­ держит строку, описывающую тип данных. Если это строка "Range", то в окне сооб­ щений выводится адрес диапазона, хранящийся во втором элементе массива х.

Коды VBA вспомогательных функций слишком сложны, чтобы приводить их в тексте книги. Вы можете ознакомиться с кодами функций, открыв файл Picl6_BbiHCHeHHe диапазонов диаграммы.xls. Функции хорошо документированы, поэтому их легко применить в других ситуациях.

Защита диаграмм

Видимо, вы уже знаете, что рабочий лист можно защитить с помощью команды Сервис'=>3ащита'=^>3ащитить лист. Когда рабочий лист защищен, заблокированные ячейки не могут быть изменены. По умолчанию заблокированы все ячейки. Их мож­ но разблокировать с помощью вкладки Защита диалогового окна Формат ячеек. Защи­ та листа запрещает также изменение любой диаграммы, внедренной в лист.

С помощью команды Сервис'=>3ащита'=^Защитить лист можно также защитить лист диаграмм. Когда лист диаграмм защищен, никакая входящая в него диаграмма не мо­ жет быть изменена.

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

4 1 9

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