Вопрос по работе с диаграммами

Программирование на Visual Basic for Applications
vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Вопрос по работе с диаграммами

Сообщение vagrant » 20.08.2007 (Пн) 15:06

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

В принципе получается это сделать модификацией контекстного меню Series, но есть проблема - никак не могу получить номер выделенной точки?!!!
Я пока обошел это ректально:
работаю с объектом Selection (после выделения точки),
меняю ему скажем MarkerStyle,
перебираю через For Each все объекты .SeriesCollection(1).Points на предмет поиска точки с этим значением MarkerStyle и нумерую их по ходу,
отсюда получается номер точки, с которым можно работать.

Вместе с тем при наведении курсора на точку сразу всплывает нужная информация (подсказка), массаракш! Только как ее снять из программы?

Подскажите, плиз, про получение номера точки. Может меня заклинило, а так все просто?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.08.2007 (Пн) 19:40

Ты не поверишь, но если нужная точка выделена, то Selection -- это как раз она и есть...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Сообщение vagrant » 20.08.2007 (Пн) 19:55

Правильно.

Но нужно смотреть, какие свойства объекта Selection доступны.
К сожалению по умолчанию НЕ доступны Value или Xvalue или еще что-нибудь, идентифицирующее конкретную точку.

К точке диаграммы можно обратиться .Points(5) допустим и все с ней сделать. Но как узнать, что она 5-я (или 67-я)? Вот в чем прикол.

Я, правда, нашел еще один полуректальный метод. Надо сначала сказать, что нужно подписать точку, например координатой X. Тогда будут доступны ее характеристики через Selection.DataLabel.Text, например.
Но при этом приходится укрывать эти метки, чтобы не мешались. Что тоже извращение, в общем.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.08.2007 (Пн) 20:03

Selection возвращает объект Point.
.Points(5) возвращает объект Point.

В чём разница? :roll:
Какая ещё "идентификация", если тебе сразу дают в Selection то, что вернула бы Points(5)?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Сообщение vagrant » 20.08.2007 (Пн) 20:27

Selection возвращает гораздо меньше, чем я получаю, обратившись к объекту .Points(i).

Почему это так, не знаю.

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

Наверное более простой ворос про всплывающую подсказку. Кто знает, как ее прочитать из программы? Наводим пойнтер мыши на точку - появляется надпись: ряд такой-то, координаты x и у. Можно ли это событие перехватить из программы и считать подсказку?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.08.2007 (Пн) 20:30

vagrant писал(а):Selection возвращает гораздо меньше, чем я получаю, обратившись к объекту .Points(i).

Хочу подробного пояснения этой фразы. С примерами.

vagrant писал(а):Я понимаю, что в это трудно поверить, но попробуйте из программы определить, какую точку вы выделили в диаграмме и станет все ясно.

Я выделил точку Selection.
?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 20.08.2007 (Пн) 21:18

Задача на самом деле нетривиальная. См.:
http://peltiertech.com/Excel/Charts/cha ... #PointInfo
Привет,
KL

vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Сообщение vagrant » 20.08.2007 (Пн) 21:23

Н-да, кое-что я неправильно сформулировал.

Может так:
если посмотреть после создания диаграммы свойства какой-то конкретной ее точки, например свойства объекта tb

Set tb = ActiveChart.SeriesCollection(1).Points(5)

то окажется, что среди них нигде не фигурирует сам номер 5 (если не задать отображение Labels).

Тоже самое, если обратиться к Selection (тут я не прав, действительно тоже самое). Но мне не легче.

Разница в том, что в первом случае я (и программа) точно знаем номер точки в серии, а во втором - я не вижу по чем определить этот самый номер. На Selection нигде не написано, что это Points(5).
А мне работать не с самой точкой (в этом случае информации достаточно), а с данными в листе.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 20.08.2007 (Пн) 21:32

А чем тебе решение Дж.Пелтиера (см. выше) не подошло? Оно же тебе и номер и значение выдает.
Привет,
KL

vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Сообщение vagrant » 20.08.2007 (Пн) 21:37

to KL:
Спасибо за ресурс, ни разу не был!

Но пример

Код: Выделить всё
Private Sub Chart_Select(ByVal ElementID As Long, _
    ByVal Arg1 As Long, ByVal Arg2 As Long)

If ElementID = xlSeries Then
    If Arg2 > 0 Then
        MsgBox "Series " & Arg1 & vbCrLf _
            & SeriesCollection(Arg1).Name & vbCrLf _
            & "Point " & Arg2 & vbCrLf _
            & "X = " & WorksheetFunction.Index _
                (SeriesCollection(Arg1).XValues, Arg2) & vbCrLf _
            & "Y = " & WorksheetFunction.Index _
                (SeriesCollection(Arg1).Values, Arg2) & vbCrLf & vbCrLf _
            & "Any questions?"
    Else
        MsgBox "Select a single point, please", vbInformation, "Pick a Point"
    End If
End If
End Sub


и правильный и у Уокенбаха есть (только не рассказывается кто такие Arg1 и Arg2) и я его сразу использовал по-началу.
Но он требует добавления кода в созданную книгу (раз) и ссылки в Reference на мою программу, иначе не вытащить эти самые Arg1 и Arg2 (два).
Оба обстоятельства не очень радуют.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 20.08.2007 (Пн) 22:21

1) Уокенбах - специаллист по Excel общего профиля, а Пелтиер признанный (в т.ч. и Уокенбахом) спец по диаграммам и сводным таблицам :-)

2) Не понял. А как же ты собираешься отлавливать момент выбора точки кроме как добавлением кода в созданную книгу?

3) И почему твою программу нельзя загнать в надстройку?
Привет,
KL

vagrant
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 20.08.2007 (Пн) 14:39

Сообщение vagrant » 21.08.2007 (Вт) 0:03

Моя программа как раз надстройка и есть. Для прогнозирования.

Идеология простая: результат работы - обычная книга Excel с результатами обработки данных, которую можно открыть, посмотреть, по мелочи откорректировать на любом компьютере. Работать с ней специальными методами (подбор тренда, сезонных факторов, и т.п.) можно, если запустить диалоговое окно надстройки. Единственное что требуется, чтобы надстройка узнавала книги, которые создала и с которыми она может работать.

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

А насчет момента выбора хорошо с контекстным меню получается. Меню корректируется в момент запуска интерфейса надстройки и позволяет работать с любой диаграммой, прописаны в ней специально реакции на события или нет. А дальше через Selection.DataLabel.Text получаем нужную информацию и все работает.
Просто коряво как-то, подписи к точкам приходится делать маленькими (Font.Size=1), белыми и складировать стопкой на краю диаграммы. Неаккуратненько. Громоздко. Мало ли какие пенки полезут потом.

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


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

    TopList