Начиная с версии Excel 2002, средства защиты листов стали более разнооб разными. При защите листа Excel предоставляет список операций, которые могут быть выполнены над содержимым листа. Среди этих операций — редак тирование объектов. Если редактирование объектов разрешено, то диаграмму можно редактировать, даже когда лист защищен.
Безопасны ли защищенные листы?
Вопреки распространенному мнению защита рабочих листов с помощью паролей не яв ляется средством безопасности. Это всего лишь средство повышения удобства. Защита листов предназначена главным образом для предотвращения случайного удаления со держимого ячеек. Чаще всего защищают формулы ячеек, а ячейки с вводимыми данными оставляют незащищенными. Тогда после защиты рабочего листа формулы ячеек не могут быть удалены или замещены значениями. Взломать пароль защищенного листа несложно.
Свойства защиты диаграмм
Кроме упомянутых выше, в Excel представлены другие типы защиты, о которых знают немногие. В частности, объект Chart имеет ряд свойств, связанных с защитой (все они по умолчанию содержат значение False).
•ProtectData. Если это свойство равно True, то формула РЯД не может быть изменена.
•ProtectFormatting. Если это свойство равно True, то форматирование диа граммы запрещено.
•ProtectSelection . Если это свойство равно True, то элементы диаграммы не могут быть выделены.
•ProtectGoalSeek. Если это свойство равно True, то пользователь не может изменить данные диаграммы путем перетаскивания точек данных.
Важно понимать, что все эти свойства не сохраняются с рабочей книгой. На пример, если выполнить макрос, устанавливающий свойство диаграммы ProtectData в True, то после закрытия и повторного открытия рабочей кни ги свойство ProtectData опять будет иметь значение False. Чтобы вновь ус тановить значение свойства в True, нужно выполнить макрос повторно.
Защита всех диаграмм открытой рабочей книги
Excel предоставляет способ автоматического выполнения макроса при каждом откры тии рабочей книги. Способ основан на использовании процедуры Workbook_Open, код ко торой должен быть расположен в модуле кодов объекта ThisWorkbook.
Ниже приведена одна из возможных реализаций процедуры Workbook_Open, вы полняющейся при каждом открытии рабочей книги. В процедуре используется цикл, перечисляющий рабочие листы и все диаграммы каждого рабочего листа. Свойству ProtectFormatting каждой диаграммы присваивается значение True. В результате после выполнения процедуры Workbook_Open ни одна внедренная диаграмма не мо жет форматироваться.
Private Sub Workbook_Open()
Dim Wks As Worksheet
Dim ChtObj As ChartObject
For Each Wks In ThisWorkbook.Worksheets
For Each ChtObj In Wks.ChartObjects
ChtObj.Chart.ProtectFormatting |
= True |
Next ChtObj |
|
Next Wks |
|
End Sub |
|
420 |
Часть III. Использование VBA |
Непосредственное изменение свойств защиты листа диаграмм
Приведенный в предыдущем разделе макрос предназначен для внедренных диа грамм. При работе с листом диаграмм все четыре перечисленных выше свойства заШ1ИТЫ можно изменять непосредственно в окне свойств диаграммы. Для этого выпол ните ряд действий.
1. Активизируйте лист диаграмм. |
ввшиш |
|
2. Щелкните правой кнопкой мыши на любой пане |
ZhartZ Chart |
|
1 |
|
ли инструментов |
и задайте вывод панели |
AMi«beac|<:«twrfe«d| |
Элементы управления. |
DisplayBlanksAs |
1 - xiNotrtotted |
Elevatran |
15 |
3. На панели Элементы управления щелкните на |
GapDepth |
150 |
HasDataTable |
False |
кнопке Свойства. |
Активизируется диалоговое |
HasLegend |
True |
окно Properties (Свойства). |
HasPivotFidds |
False |
HasTitle |
False |
4. Изменяйте значения свойств (рис. 16.14). |
Name |
Диаграмма 1 |
|
|
HeightPercent |
100 |
|
|
Perspective |
30 |
|
|
PlotBy |
2 - xlColumns |
|
|
PlotVisibleOnly |
True |
|
|
ProtectData |
False |
|
|
|
(False |
|
|
ProtectGoalSeek |
False |
|
|
ProtectSelection |
False |
|
|
RightAngleAxes |
False |
|
|
Rotation |
20 |
Рис. 16.14. С помощью диалогового окна Properties можноSi2eWithWindow |
False |
устанавливать свойства защиты листа диаграмм |
Visible |
-1-xlSheetVisible |
|
|
^^^^шш\
Щ
d |
zi
—^11
zjJI
Прокручиваемая диаграмма
На рис. 16.15 показана биржевая диаграмма, в которой для определения рядов данных используются именованные формулы. Ячейка II (НачСтрока) определяет на чальную строку данных, а ячейка 12 (колДней) — количество дней, выводимых диа граммой. Изменение значения любой из этих ячеек приводит к изменению диапазо нов рядов данных. Данные охватывают 747 дней, или три года.
Использование именованных формул в рядах данных подробно рассматрива ется в главе 6, " Автофигуры и графика".
Рабочая книга P i c i 6 _ i 5 . x l s содержит простой макрос, увеличивающий в цикле значение ячейки НачСтрока. В результате работы макроса диаграмма анимируется — выводимые диаграммой данные прокручиваются справа налево. Ниже приведен код макроса Прокручивать Диаграмму, запускаемого кнопкой Пуск/Стоп.
Public AnimationlnProgress As Boolean Sub ПрокручиватьДиаграмму()
Dim StartVal As Long, r As Long
If AnimationlnProgress Then
AnimationlnProgress = False
End End If
AnimationlnProgress = True StartVal = Range("НачСтрока")
For r = StartVal To 74 8 - Range("КолДней")
Range("НачСтрока") = Range("НачСтрока") + 1
DoEvents
Глава 16. Использование VBA в диаграммах |
421 |
Next г |
|
|
|
|
|
|
|
|
|
|
|
|
|
AnimationlnProgress |
False |
|
|
|
|
|
|
|
End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1С|Рк16_15.»<и |
|
|
с |
|
|
•^^^^-Ж^шш-шштш |
^^^^^^^^^^Ш¥Ш'жШЩ |
— ! ! |
|
'•'^'^ЛщУ4,^4 |
|
В |
000 |
D |
•£ |
t |
^ • |
Н |
1 |
Л i K i |
t |
! м 1 й | 0 |
\шй-С401.109в |
|
34 740 |
60,81 |
72.63 |
69.60 |
70.50 |
Кол. Дн4и |
30 |
334 |
|
|
^А |
|
|
^''^ , |
,i |
Объем |
Открытия Высший Низший Закрытия |
1-я строка |
214 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
J |
|
C5 |
01.1990 |
|
32 110 800 |
70,04 |
74,00 |
70.72 |
73,25 |
|
|
|
|
|
|
1L l l ,^ |
|
|
|
|
|
|
|
|
|
|
|
4 |
C6 |
01.1099 |
|
34 509 |
600 |
74,75 |
75.75 |
73.38 |
75.63 |
|
Пус«^Ст»п |
1 |
|
|
|
III |
6 |
C8 |
01.1990 |
|
25 093 |
600 |
76,00 |
76.38 |
73.50 |
74.94 |
|
|
|
|
C7 |
01.1099 |
|
25 553 |
800 |
74,88 |
75.31 |
74.13 |
75.25 |
|
|
|
|
|
|
|
1Г 7 ^11.01.1999 |
|
23 158 000 |
7 5 , 4 4 |
75,47 |
72.97 |
73,75 |
|
|
|
|
|
|
|
8 |
12 |
01.1000 |
|
28 820 |
000 |
74,06 |
74.06 |
70.50 |
71.091 |
|
|
|
1У11сго5ст. 19зэ -ZUUI |
j;f л |
|
13 |
01.1099 |
|
37 647 |
800 |
68,00 |
73.88 |
68,00 |
71.91 |
|
|
|
10^1401 . 1099 |
|
20 550 |
000 |
72,63 |
72,78 |
70.75 |
70,88 |
|
|
|
|
|
|
|
|
( l 2 |
19 01 |
.1099 |
50 5 ^ |
000 |
75,69 |
77.88 |
75,44 |
77.81 |
I |
180 - |
|
[is |
20 01.1999 |
62 565 |
400 |
83,47 |
83.88 |
81 . 24 |
81.25 |
* |
160 - |
|
114 21.01.1000 |
39 988 |
200 |
80,88 |
81.66 |
78,88 |
79.16 |
111* |
22 |
01 |
.1900 |
41 017 000 |
77.81 |
80,12 |
77,63 |
78.13 |
|
|
|
l i e |
25 |
01 |
.1999 |
51 032 600 |
80,84 |
81.66 |
79,06 |
80.94 |
|
140 - |
1^7 |
26 |
01 |
.1009 |
60 055 |
200 |
82,75 |
85.88 |
82.25 |
85.78 |
|
|
:p8 |
27 |
01 |
.1000 |
48 010 |
600 |
86,25 |
87.22 |
84.25 |
84.38 |
|
120 - |
' |
19 |
28 |
01 |
.1999 |
39 362 |
600 |
85,88 |
87.03 |
84.01 |
87,00 |
|
|
ao 29 |
01 |
.1999 |
38 071 |
200 |
87,38 |
87.56 |
85,44 |
87.50 |
|
100 - |
ijat |
01 |
02 |
.1999 |
40 553 |
400 |
87,72 |
87.97 |
85,41 |
86.47 |
|
80 - |
|
1 2 2 |
02 |
02 |
.1009 |
45 800 |
200 |
86,25 |
86.28 |
83,13 |
83.81 |
|
|
{23 |
03 |
02.16Ю0 |
36 299 600 |
83.19 |
84.94 |
83,00 |
83.41 |
|
|
i |
2 4 |
04 |
02 |
.1000 |
44 616 |
000 |
84.06 |
84.19 |
79.44 |
79.53 |
|
60 - |
|
{ 2 6 |
05 |
02 |
.1999 |
83 972 |
600 |
80,13 |
80.81 |
77.44 |
80.00 |
|
|
i |
2 0 |
08 |
02 |
.1999 |
54 022 |
000 |
81.28 |
82.78 |
80.81 |
82.63 |
|
40 - |
|
1 2 7 |
00 |
02 |
.1990 |
38 526 |
000 |
82.47 |
83.38 |
70,88 |
80.03 |
|
|
|
1 2 8 |
10 |
02 |
.1909 |
36 670 |
800 |
79,04 |
82.10 |
79.31 |
80.31 |
|
20 - |
|
l i d |
11 |
02 |
.1999 |
20 634 200 |
81,38 |
81.94 |
80,19 |
81.38 |
|
|
|
|зо |
12 02 |
.1900 |
31 377 800 |
80.84 |
81.84 |
78,56 |
78.88 |
|
|
|
131 ^ 16 |
02 |
.1900 |
38 781 |
600 |
79.88 |
80.00 |
77,28 |
78,13 |
|
|
|
|Э2 |
1702 . 1999 |
50 132 800 |
76.47 |
77.25 |
74.25 |
75.00 |
|
|
|
|1^^И i |
• «|улиC T I / ' - " |
600 |
75^47 |
75,69 |
71J09 |
72,88 |
|
|
|
|
18 02 |
.1999 |
58 297 |
|
|
:о;-';-::^.л^=::^г''1"';::':1
Рис. 16.15. Диапазоны выводимых диаграммой данных определяются значениями ячеек II и
В макросе используется переменная AnimationlnProgress с областью видимости Public, значение которой определяет, анимирована ли диаграмма в момент щелчка на кнопке. Если да, то макрос присваивает переменной AnimationlnProgress зна чение False и процедура завершается. Это позволяет запускать и останавливать про кручивание с помощью одной кнопки.
Примеры обработки событий
Макрос может запускаться при наступлении некоторого события. Например, собы тием является открытие рабочей книги, следовательно, можно создать макрос (в этом случае он называется процедурой обработки события), выполняющийся при открытии рабочей книги. Ранее в главе уже рассматривался один из примеров процедуры обра ботки события -- макрос Workbook_Open.
Процедуры обработки события Worksheet_Change
в примерах этого раздела рассматривается обработка события Worksheet_change — одного из многих событий, доступных на уровне рабочего листа. Оно генерируется при каждом изменении любой ячейки рабочего листа. Макросы такого вида могут быть весьма полезны для автоматического обновления диаграмм.
Макросы обработки событий должны быть расположены в модуле кодов ра бочего листа (например, в модуле Лист1). Если расположить их в стандарт ном модуле VBA, то они не будут запускаться.
422 |
Часть III. Использование VBA |
При активизации модуля кодов диаграммы, листа или рабочей книги для вы деления объекта или события можно воспользоваться раскрывающимися спи сками, расположенными в верхней части окна кодов (рис. 16.16). В верхнем левом раскрывающемся списке приведены объекты, а в верхнем правом -— события, связанные с объектом. При выборе события редактор автоматически генерирует пустую заготовку процедуры его обработки.
OIWliHUff |
"3. |
|
SdectionChange |
|
^Activate |
Private Sub Worksheet__Selection" |
|
^BeforeDoubleCIck |
End Sub |
beforeRjghtClick |
Calculate |
Deactivate
FoliowHyperink
PivotTableUpdate
IselectionChange
Рис. 16.16. Раскрывающиеся списки в модуле кодов, предназна ченные для выбора события
Сокрытие и вывод диаграмм
Рабочий лист, показанный на рис. 16.17, содержит пять диаграмм, три из которых скрыты. Значение ячейки В2 определяет, какая из них в данный момент видима. В ячейке В2 используется раскрывающийся список, созданный с помощью диалогового окна Проверка вводимых значений. В списке приведены пять значений от 1 до 5 и до полнительный пункт попе.
\w\ ^ Выбор номера диаграммы
И Ч • иглист!/^ |
"Ш', •:,•••• у ' i |
is6. |
|
Рис. 16.17. Ячейка В2 содержит раскрывающийся список номе ров диаграмм; номер видимой диаграммы выбран в списке
Глава 16. Использование VBA в диаграммах |
423 |
в рабочем листе используется процедура обработки события Worksheet_Change, код которой приведен ниже. Обратите внимание: в процедуру передается аргумент Target. С его помощью процедуре передается переменная, представляющая изменяе мую ячейку или диапазон. Если адрес Target равен $В$2, то макрос выполняет две операции: скрывает все члены коллекции Chartobjects, а затем выводит диаграмму, соответствующую значению ячейки $В$2. Оператор On Error игнорирует ошибки, возникающие при неправильном задании номера объекта Chartobject.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$2" Then
ActiveSheet.Chartobjects.Visible = False On Error Resume Next Chartobjects(Target.Value).Visible = True
End If End Sub
Пять внедренных диаграмм расположены одна поверх другой, поэтому на экране они выводятся в одинаковом положении.
Настройка шкалы оси
Ранее в этой главе рассматривался пример макроса, изменяющего параметры оси диаграммы (см. рис. 16.6). В этом примере макрос, запускаемый с помощью кнопки, изменяет три свойства шкалы оси: MinimumScale, MaximumScale и MajorUnit.
Теперь рассмотрим макрос обработки события, автоматизирующий этот процесс: при изменении значений ячеек он запускается самостоятельно, без щелчка на кнопке. Рабочий лист показан на рис. 16.18. Значения свойств Axis хранятся в именованных ячейках столбца D, им присвоены имена AxisMin, AxisMax и MajorUnit. Ниже при веден код макроса обработки события.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then
With ActiveSheet.Chartobjects(1).Chart.Axes(xlValue)
.MinimumScale = Range("AxisMin")
.MaximumScale = Range("AxisMax")
.MajorUnit = Range("MajorUnit") End With
End If End Sub
Процедура Worksheet_change запускается при каждом изменении любой ячейки листа. Первый оператор проверяет свойство Column переменной Target (нас интересует только четвертый столбец). Если изменилась ячейка столбца 4, то значения ячеек читаются из листа и применяются в диаграмме. В ином случае ничего не происходит.
В файле Р1с1б_настройка осей точечной диаграммы.xls приведен пример макроса, который автоматически настраивает шкалы осей точечной диаграммы в за висимости от значений исходных данных.
События диаграммы
в предыдущих примерах использовались события, связанные с рабочим листом. Листы диаграмм также могут генерировать события (табл. 16.1).
4 2 4 |
Часть III. Использование VBA |
1П|Р|с16_18.к1$ |
|
|
|
|
|
'' |
С |
-^v'^^^v^^^^ |
|
|
|
|
|
к /Л |
|
«£Ш| |
|
|
С |
^ в ^ И |
i |
I F |
1 vi |
|
1 |
J |
i |
|
• |
• • А .. В |
|
! |
G |
1 |
Й' |
|
|
t Til |
1 |
Данные |
Параметры шкалы! |
100 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
II а, |
58 |
AxisMin |
1 |
-100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
из |
63 |
AxisMax |
j |
lOOO |
-20 - |
АлД^ |
|
-12 |
MajorUnit |
1 |
20| |
|
• |
60 |
80 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
Н |
74 |
|
|
|
60 • |
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h7 |
76 |
|
|
|
40 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
И) |
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И |
48 |
|
|
|
20 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
2 |
|
|
|
0 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
ге" |
-5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И 4 |
25 |
|
|
|
-40 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И 5 |
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
22 |
|
|
|
-60 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И 7 |
29 |
|
|
|
-80 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И 8 |
77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Щ. |
78 |
|
|
|
-100 - |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пи" |
8 |
|
|
|
|
1 |
3 |
5 |
7 |
9 |
11 |
13 |
15 |
17 |
19 |
21 |
23 |
25 |
21 |
27 |
|
|
|
|
122 |
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
66 |
|
|
|
|
|
|
|
|
Jjli |
|
|
. |
|
|
|
1 |
•tlJ^I |
|м 4 |
• ИКЛис r l / |
|
|
|
|
|
|
|
|
|
|
|
|
|
Pwc. 75.7^. Макрос обработки событий, запускаемый при изменении ячеек листа, из меняет свойства оси диаграммы
Таблица 16.1. События, распознаваемые объектом диаграммы
Событие |
Действие, повлекшее событие |
A c t i v a t e BeforeDoubleClick
Активизация диаграммы
На элементе диаграммы выполнен двойной щелчок. Событие ге нерируется перед стандартной реакцией на двойной щелчок (т.е. перед выводом диалогового окна форматирования)
BeforeRightClick |
На элементе диа1граммы выполнен щелчок правой кнопкой мыши. |
|
Событие генерируется перед стандартной реакцией (т.е. перед |
|
выводом контекстного |
меню) |
C a l c u l a t e |
Диаграмма принимает новые или измененные данные |
Deactivate |
Отмена активизации диаграммы |
DragOver |
Диапазон или ячейка перетаскиваются над диаграммой |
DragPlot |
Диапазон или ячейка перетаскиваются и опускаются на диаграмму |
MouseDown |
Нажатие кнопки мыши (указатель мыши в это время находится на |
|
диаграмме) |
|
MouseMove |
Положение указателя мыши на диаграмме изменяется |
MouseUp |
Отпускание кнопки мыши (указатель мыши в это время находится |
|
на диаграмме) |
|
Resize |
Изменение размеров диаграммы. В листах диаграмм это событие |
|
генерируется, только |
если установлен флажок Масштабировать |
|
диаграмму по размеру |
окна |
Select |
Выделение элемента диаграммы |
SeriesChange |
Значение точки данных диаграммы изменяется путем перетаски |
|
вания точки |
|
Глава 16. Использование VBA в диаграммах |
425 |
Процедуры обработки событий диаграммы должны располагаться в модуле кодов листа диаграмм (например, в модуле Диаграмма!).
Подключение событий внедренных диаграмм
События листов диаграмм (но не внедренных диаграмм) подключены всегда. Чтобы исполь>зовать процедуры обработки событий с внедренными диаграммами, выполните ряд действий.
1.Создайте модуль класса. В редакторе Visual Basic выделите проект в окне проек тов и выберите команду /nsert'=^C/ass Module (Вставка^^^Модуль класса). При этом в проект добавляется новый (пустой) модуль класса.
2.Объявите глобальный объект chart. Переменная типа Chart должна быть объяв лена в модуле классов с помощью ключевого слова WithEvents, например:
Public WithEvents EmbChart As Chart
3.Свяжите объявленный объект с диафаммой. Для этого объявите объект типа ciassi (допустим, так называется модуль класса). Объектная переменная должна быть объяв лена на уровне модуля в обычном модуле VBA (не в модуле класса), например:
Dim MyChart As New C l a s s i
4. Создайте экземпляр объекта. Для этого выполните, например, такой оператор:
Set MyChart.EmbChart = A c t i v e S h e e t . C h a r t O b j e c t s ( 1 ) . C h a r t
После выполнения предыдущего оператора ссылка MyChart в модуле класса ука зывает на первую внедренную диаграмму активного листа. Теперь при наступлении события листа будут выполнены процедуры обработки событий, расположенные в модуле класса.
5.Создайте процедуры для классов диаграмм. Они располагаются в модуле класса. Ниже приведен пример простой процедуры.
P r i v a t e Sub EmbChart_Activate{)
MsgBox EmbChart.Parent.Name & " активизирована."
End Sub
6.Выполните оператор, уничтожающий объект и отменяющий прослушивание со бытия. Такой оператор имеет следующий вид:
Set MyChart.EmbChart = Nothing
Примеры использования событий диаграмм приведены в рабочих книгах Pici6_co6biTHH
листа диаграмм . xls и Р1с1б_события внедренных диаграмм . xls .
Нажатие кнопки мыши
Событие MouseDown происходит в момент щелчка на элементе диаграммы. В Excel определено также событие MouseUp — отпускание кнопки мыши. Следовательно, один щелчок кнопкой мыши генерирует два события. В примере этого раздела ис пользуется событие MouseDown.
На рис. 16.19 показана диаграмма с одним рядом, содержащим три точки данных. Диаграмма работает как меню: щелчок на столбике приводит к активизации соответ ствующего рабочего листа. Например, когда пользователь щелкает на столбике Юг, ак тивизируется рабочий лист Юг.
Ниже приведен код процедуры обработки события Chart_MouseDown. Процедура выполняется при каждом щелчке кнопкой мыши на диаграмме.
Private Sub Chart_MouseDown(ByVal Button As Long, __ ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
Dim ElementlD As Long
4 2 6 |
Часть III. Использование VBA |
Dim argl As Long, arg2 As Long
GetChartElement X, Y, ElementlD, argl, arg2
If ElementlD = xlSeries Then
Select Case arg2
Case 1
Sheets("Север").Activate
Case 2
Sheets("Юг").Activate
Case 3
Sheets("Запад").Activate
End Select
End If
End Sub
yiJfltrlLWM |
1Ш!'йОд1^ |
|
Для детализации по регионам щелкните на столбике |
|
$2 500 т'' |
|
1 |
$2 00о|' |
|
ч |
fg^^fefe |
|
о |
|
^ |
$1 500f |
|
,t $1000-f' |
|
О |
|
|
|
$500 4 |
|
|
$0 |
Запад |
|
Север |
Н 4 k |
»П\Диаграмма1 /TfiaewatftflncT /Сее^ |
j(Kit_JЗатд'7' |
Рис, 16.19. Отслеживание события MouseDown позволяет создать диа грамму, работающую как меню
Обратите внимание: процедура принимает несколько аргументов, с помощью ко торых можно выяснить, на чем был выполнен щелчок. Нас интересуют аргументы х и у — координаты указателя мыши в момент щелчка. Оператор GetChartElement пре образует координаты X и у в значения переменных ElementlD, argl и arg2.
•ElementlD — это условный номер элемента диаграммы с координатами х и у. Например, значение 3 соответствует ряду. Код VBA распознает также встроен ную константу XlSeries, имеющую значение 3.
•argl содержит дополнительную информацию об элементе с координатами х и у. Если номер ElementlD означает ряд, то переменная argl содержит число, соответствующее номеру ряда.
•arg2 также содержит дополнительную информацию об элементе с координата ми х и у. Если этот элемент — ряд, то переменная arg2 содержит номер точки данных ряда.
При некоторых значениях переменной ElementlD аргументы a r g l и arg2 не используются. Например, если щелчок выполнен на области построения, то значение ElementlD равно 2 (xlChartArea), а значения a r g l и arg2, естест
венно, бессмысленны.
Глава 16. Использование VBA в диаграммах |
427 |
Диафамма, показанная на рис. 16.19, выводит только один ряд, поэтому в процедуре используется только аргумент arg2, принимающий значения 1, 2 или 3. Оператор Select Case активизирует один из листов в зависимости от значения переменной arg2.
Аналогичный пример для внедренной диаграммы находится в рабочем листе
Р1с1б_нажатие мыши, внедренная диаграмма.xls.
Прохождение мыши
Иногда возникает необходимость изменить подсказку диаграммы — небольшое со общение, выводимое рядом с указателем мыши во время его прохождения над эле ментами диаграммы. В подсказке диаграммы выводится имя элемента и (для рядов) значение точки данных. Объектная модель диаграмм не содержит подсказок, поэтому изменить их с помощью кода VBA невозможно.
Чтобы подключить или отключить вывод подсказок, выберите команду Сервис'=> Параметры, активизируйте вкладку Диаграмма и установите или снимите лю бой из двух флажков группы Всплывающие подсказки отображают.
В этом разделе рассматривается альтернативный способ предоставления подсказки. На рис. 16.20 показана гистограмма, в которой используется событие Mouseover. Когда указатель мыши находится на столбике гистограммы, в левом верхнем углу по является текстовая область (объект рисунка) с информацией о точке данных. Текст подсказки хранится в заданном диапазоне и может отображать любую дополнитель ную информацию о текущей точке данных.
О|Р«с16_20> |
W^:'f''^^:' >101х| |
|
"^ |
Финансовый ре«ультат sa 1-й квартал
6 000 000
4 000 000 4
I 000 000 |
|
|
Январь |
Февраль |
Март |
|
а Регион 1 • Регион 2 |
|
Н 4 » иКДиаграмма1/Пист1 / |
l U |
J ±f |
Рис. 16.20. В текстовой области выводится информация о точке данных, над ко торой проходит указатель мыши
Приведенная ниже процедура обработки события расположена в модуле кодов
листа диаграмм. |
Button As Long, _ |
Private Sub Chart_MouseMove(ByVal |
ByVal Shift As Long, _ |
428 |
Часть III. Использование VBA |
ByVal X As Long, ByVal Y As Long) Dim ElementId As Long
Dim argl As Long, arg2 As Long Dim NewText As String
On Error Resume Next
ActiveChart.GetChartElement X, Y, Elementld, argl, arg2 If Elementld = xlSeries Then
NewText = Sheets("Лист1")-Range("Comments")• _ Offset(arg2, argl)
Else
NewText = "" ActiveChart.Shapes(1).Visible = False
End If
If NewText <> ActiveChart.Shapes(1). _ TextFrame.Characters.Text Then
ActiveChart.Shapes(1).TextFrame.Characters.Text = _ NewText
ActiveChart.Shapes(1).Visible = True End If
End Sub
Процедура отслеживает все движения мыши по листу диафамм. Координаты мыши передаются процедуре в переменных х и у. аргументы Button и Shift не используются.
Как и в предыдущем примере, ключевой элемент процедуры — метод GetChartElement. Если переменная ElementlD равна x l S e r i e s , значит, указатель мыши находится над рядом. Тогда переменой NewText присваивается текст опреде ленной ячейки. Ячейка содержит описание текущей точки данных (рис. 16.21). Если указатель мыши находится не над рядом, то текстовая область скрывается. В ином случае в ней выводится содержимое переменной NewText.
c|Picl6_20.Kls |
|
--ШГхП |
|
Регион 1 |
Регион 2 |
Январь |
3 245 151 |
1 434 343 |
Февраль |
5 546 523 |
1 238 709 |
Март |
5 083 204 |
3 224 855 |
Кояментарин |
Регион 2. Январь = |
|
Регион 1. Январь = |
|
$3245151.000 |
$1434343.000 |
|
Регион 1. Февраль = |
Регион 2. Февраль = |
|
$5546523.000 |
$1238709.000 |
|
Две недели стимулирования |
|
|
сбыта. |
|
|
Регион 1, Март = |
Регион 2. Март = |
|
$5083204,000 |
$3224855.000 |
|
|
Слияние с LA Corporation. |
Н 4 ТЩ^Ш!Ш!^2К1^!ь7Л./ '" liL .1|Й
Рис. 16.21, Диапазон B7:D9 содержит информацию о точ ках данных, выводимую в текстовой области, когда указа тель мыши находится над рядом
Аналогичный пример для внедренной диаграммы приведен в рабочей книге
Picl6_пpoxoждeниe мыши, внедренная диаграмма.xls.
Глава 16. Использование VBA в диаграммах |
429 |