Страница 1 из 2

Excel - запуск модуля при изменении графика?

Добавлено: 09 дек 2005, 11:41
_Andrew
Подскажите пожалуйста каким образом можна заставить выполнятся модуль VBA каждый раз при изменении графика (обьекта Chart) если например я меняю масштаб оси или меняю на графике обьект TextBox - должен запуститься модуль. То есть как можно обработать такое событие? (В стандартных событиях обьекта Chart такого события нет)

Добавлено: 09 дек 2005, 12:01
Naeel Maqsudov
(В стандартных событиях обьекта Chart такого события нет)
Вот. А нестандартных событий не бывает. Т.е. никак.
А зачем?

Добавлено: 09 дек 2005, 12:06
_Andrew
например: я привязал TextBox к точке на графике, причем сделал это програмно, теперь пользователь захотел изменить масштаб оси и мне нужно этот TextBox перестроить - как мне зафиксировать такое событие? Может это можно сделать как-то иначе? Подскажите

Добавлено: 09 дек 2005, 12:37
Naeel Maqsudov
У Вас на рабочем листе лижит Chart, а поверх него TextBox (именно элемент управления TextBox, или автофигура TextBox)?

Хотя, это не важно. В любом случае нельзя.
Предположим, что скорее всего имеется в виду автофигура.

Т.е. наверное Вы просто хотите к точке на графике прицепить пометку со статическим текстом, и чтобы она за точкой бегала.

Так нет ничего проще. Щелкните на точке графика так, чтобы выделилась не серия данных, а сама эта точка. Потом сделайте на ней двойной щелчок. Вывалится диалог "Format Data Point". Идите на закладку "Data Labels" и включите там Sow Label.

Теперь в появившуюся метку впишите что надо, отформатируйте, поверните под нужным углом и наслаждайтесь.

Добавлено: 09 дек 2005, 14:59
_Andrew
На самом деле не все так просто: на счет TextBox это был упрощеный пример, на самом деле есть нарисованая вторая ось X c нарисоваными делениями и значениями к ним, причем это все привязано к координатам на листе примерно таким образом
Width = (ActiveChart.Axes(xlCategory, xlPrimary).Width)
Height = (ActiveChart.Axes(xlValue, xlPrimary).Height)
Left = (ActiveChart.Axes(xlCategory, xlPrimary).Left)
Top = (ActiveChart.Axes(xlValue, xlPrimary).Top)
Теперь при изменении размеров области графика необходимо эту "ось" удалить и нарисовать заново. (для ее удаления и рисования есть модуль в VBA)
Вопрос о второй оси Х я задавал в форуме(см. тему несколько строк ниже)

Добавлено: 09 дек 2005, 16:09
Naeel Maqsudov
А чем не устраивает стандартная возможность иметь 2 вертикальные оси на графике?

ActiveChart.SeriesCollection(<номер_серии>).AxisGroup = 2

Так серия данных привязывается ко второй оси.
Вторя ось появляется справа с делениями в масштабе данных указанной серии.

Добавлено: 09 дек 2005, 16:24
_Andrew
дело в том что на графике нужно иметь две горизонтальные оси, а не вертикальные, и если набор данных один, то возможности привязать вторую горизонтальную ось по-моему нет?

Добавлено: 10 дек 2005, 04:28
Naeel Maqsudov
Повесить собственный обработчик на любое изменение графика нельзя. Поэтому однозначно надо копать в другую сторону. Возможных решений пока 2.5 штуки.

1)
обойтись стандартными возможностями (но автора вопроса это не устраивает)

2)
так как графики Excel-это COM-объект, попробовать его субклассить и создать на его основе собственный ActiveX компонент (очень громоздко)

и еще половина рещения)
Дорисовывать график автофигурами, (как это сейчас и делается), однако обновления при ручном изменении в этом случае придется запретить (забить на них), так как сделать это полноценно практически нереально.

2ALL:
Коллеги! Еще предложения есть?

Добавлено: 12 дек 2005, 04:35
Avsha
дело в том что на графике нужно иметь две горизонтальные оси, а не вертикальные, и если набор данных один, то возможности привязать вторую горизонтальную ось по-моему нет?
может подойдет это ...
2 оси (х) на одном графике в Excel ?
forum/viewtopic.php?t=4491

Добавлено: 13 дек 2005, 11:21
_Andrew
Naeel Maqsudov писал(а): так как графики Excel-это COM-объект, попробовать его субклассить и создать на его основе собственный ActiveX компонент (очень громоздко)
Вы не могли бы описать этот вариант более подробно? Идея интересная, но как это реализовать я не представляю.