Помогите, пожалуйста, с добавлением линии среднего/тренда. Во вложении есть график, для которого у меня возникает затруднение. Каждая точка графика прописывается отдельно (программно). При попытке построить линию - Ексель предлагает сформировать её в рамках одного из объектов вместо всего набора объектов.
Подскажите, что нужно сделать или как изменить исходные данные для получения точечной диаграммы по объектам с линией среднего?
P.S. во вложении также две мои кнопки. Позволяют построить диаграмму по отфильтрованным значениям, т.е. скрытые строки таблицы игнорируются. Желающие могут поиграться / воспользоваться.
Всем привет и хорошего настроения!
Помогите, пожалуйста, с добавлением линии среднего/тренда. Во вложении есть график, для которого у меня возникает затруднение. Каждая точка графика прописывается отдельно (программно). При попытке построить линию - Ексель предлагает сформировать её в рамках одного из объектов вместо всего набора объектов.
Подскажите, что нужно сделать или как изменить исходные данные для получения точечной диаграммы по объектам с линией среднего?
P.S. во вложении также две мои кнопки. Позволяют построить диаграмму по отфильтрованным значениям, т.е. скрытые строки таблицы игнорируются. Желающие могут поиграться / воспользоваться.Rioran
_Boroda_, благодарю, действительно там должны быть i.
Для демонстрации вопроса взял устаревшую версию программы, в действующем механизме это было исправлено.
Перевыкладываю файл с исправленным кодом. Плюс сам код, кому интересно. Может, натолкнёт на мысль, КАК я формирую график:
[vba]
Код
Option Explicit Option Base 1
Sub Clear_Chart() Dim Pts&, i& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart Pts = .FullSeriesCollection.Count If Pts = 0 Then Exit Sub For i = Pts To 1 Step -1 .FullSeriesCollection(i).Delete Next i End With End Sub
Sub Fill_Chart() Call Clear_Chart Dim Pts&, i&, j& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart Pts = [Data[Object]].Rows.Count For i = 1 To Pts If [Data[Object]].Rows(i).Hidden = False Then j = j + 1 .SeriesCollection.NewSeries .FullSeriesCollection(j).Name = [Data[Object]].Cells(i, 1).Value .FullSeriesCollection(j).XValues = [Data[XVal]].Cells(i, 1).Value .FullSeriesCollection(j).Values = [Data[Val]].Cells(i, 1).Value End If Next i End With End Sub
[/vba]
_Boroda_, благодарю, действительно там должны быть i.
Для демонстрации вопроса взял устаревшую версию программы, в действующем механизме это было исправлено.
Перевыкладываю файл с исправленным кодом. Плюс сам код, кому интересно. Может, натолкнёт на мысль, КАК я формирую график:
[vba]
Код
Option Explicit Option Base 1
Sub Clear_Chart() Dim Pts&, i& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart Pts = .FullSeriesCollection.Count If Pts = 0 Then Exit Sub For i = Pts To 1 Step -1 .FullSeriesCollection(i).Delete Next i End With End Sub
Sub Fill_Chart() Call Clear_Chart Dim Pts&, i&, j& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart Pts = [Data[Object]].Rows.Count For i = 1 To Pts If [Data[Object]].Rows(i).Hidden = False Then j = j + 1 .SeriesCollection.NewSeries .FullSeriesCollection(j).Name = [Data[Object]].Cells(i, 1).Value .FullSeriesCollection(j).XValues = [Data[XVal]].Cells(i, 1).Value .FullSeriesCollection(j).Values = [Data[Val]].Cells(i, 1).Value End If Next i End With End Sub
А зачем ты именно так формируешь? у тебя же куча рядов получается. Вот такой код запусти и посмотри, что получится ("=Chart_List!$D$30:$D$54" в [Data[Object]] сам потом переделай) [vba]
Код
Sub Fill_Chart() Call Clear_Chart Dim Pts&, i&, j& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart .SeriesCollection.NewSeries .FullSeriesCollection(1).XValues = "=Chart_List!$D$30:$D$54" .FullSeriesCollection(1).Values = "=Chart_List!$C$30:$C$54" .FullSeriesCollection(1).Trendlines.Add End With End Sub
[/vba] Здесь один ряд и по нему можно построить тренд. Причем, ряд сразу целиковый, по всем значениям таблицы - все равно диаграммы не показывают скрытые ячейки. Если нужно по каждой группе свой ряд, то вот это уже можно в цикл засунуть. Если очень нужна разная раскраска точек, то циклом покрась каждую.
Или еще вариант - свои точки рисуешь так, как и рисовал, затем поверх них рисуешь (с помощью моего кода) еще один ряд, красишь его в бесцветный цвет и строишь по нему тренд.
Кстати, в 2010 у меня твой код не работает. Ругается на строку [vba]
Код
Pts = .FullSeriesCollection.Count
[/vba]
А зачем ты именно так формируешь? у тебя же куча рядов получается. Вот такой код запусти и посмотри, что получится ("=Chart_List!$D$30:$D$54" в [Data[Object]] сам потом переделай) [vba]
Код
Sub Fill_Chart() Call Clear_Chart Dim Pts&, i&, j& With ThisWorkbook.Worksheets("Chart_List").ChartObjects("Rio_Chart").Chart .SeriesCollection.NewSeries .FullSeriesCollection(1).XValues = "=Chart_List!$D$30:$D$54" .FullSeriesCollection(1).Values = "=Chart_List!$C$30:$C$54" .FullSeriesCollection(1).Trendlines.Add End With End Sub
[/vba] Здесь один ряд и по нему можно построить тренд. Причем, ряд сразу целиковый, по всем значениям таблицы - все равно диаграммы не показывают скрытые ячейки. Если нужно по каждой группе свой ряд, то вот это уже можно в цикл засунуть. Если очень нужна разная раскраска точек, то циклом покрась каждую.
Или еще вариант - свои точки рисуешь так, как и рисовал, затем поверх них рисуешь (с помощью моего кода) еще один ряд, красишь его в бесцветный цвет и строишь по нему тренд.
Кстати, в 2010 у меня твой код не работает. Ругается на строку [vba]
Это позволяет сохранить связь с именем объекта. Название теряется - а его хотелось бы видеть, наводя мышь на точку. Я попробовал в твоё первое решение добавить обозначения объектов, но тогда при большом количестве объектов получается каша. Попробую завтра как ты сказал - с невидимками поработать.
А со средним пока непонятно. Вычисляю значение, добавляю его отдельным рядом - но точка упорно не хочет становится линией на всю диаграмму.
UPDATE_1: Получил линию среднего через добавление отдельного ряда через две точки, по которым строю линию тренда. По оси Х точки соответствуют минимальному и максимальному Х среди просматриваемых значений. По оси У точки занимают расчитаное положение. Пока получается слишком программно и громоздко.
_Boroda_, спасибо. С линией тренда всё довольно просто.
[vba]
Код
Pts = .FullSeriesCollection.Count
[/vba] Удали слово Full из строки. Работает? На 2013 и этот вариант работает. Я кальку брал с макрорекодера, он через Full сделал.
Это позволяет сохранить связь с именем объекта. Название теряется - а его хотелось бы видеть, наводя мышь на точку. Я попробовал в твоё первое решение добавить обозначения объектов, но тогда при большом количестве объектов получается каша. Попробую завтра как ты сказал - с невидимками поработать.
А со средним пока непонятно. Вычисляю значение, добавляю его отдельным рядом - но точка упорно не хочет становится линией на всю диаграмму.
UPDATE_1: Получил линию среднего через добавление отдельного ряда через две точки, по которым строю линию тренда. По оси Х точки соответствуют минимальному и максимальному Х среди просматриваемых значений. По оси У точки занимают расчитаное положение. Пока получается слишком программно и громоздко.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Среда, 08.07.2015, 18:19
Так тебе среднее нужно или тренд? Всё, понял, ты хочешь не тренд, а строго горизонтальную линию, по вертикали равную среднему значению по видимым ячейкам поля Val.
Так тебе среднее нужно или тренд? Всё, понял, ты хочешь не тренд, а строго горизонтальную линию, по вертикали равную среднему значению по видимым ячейкам поля Val.