2015-04-20 7 views
0

Я пытаюсь обновить свою sourcedata в диаграмме. Я не хочу динамический диапазон, потому что график будет тянуть каждый раз из нового диапазона при каждом нажатии кнопки. Если я использую динамический или именованный диапазон, я заблокирован в этом диапазоне.Код VBA для переноса sourcedata в диаграмме excel

Я пробовал:

ActiveSheet.ChartObjects("Chart 2").Activate 

ActiveChart.PlotArea.Select 

ActiveChart.SetSourceData Source:=Range("A1:C3").Offset(0,3) 

Это работает только один раз, хотя. Чтобы быть ясным, у меня есть кнопка для обновления диаграммы в электронной таблице. Когда кнопка нажата, макрос будет смотреть текущие данные в активной диаграмме и сдвигать источник на 3 столбца. Это будет происходить каждый раз, когда нажимается кнопка, и данные должны оставаться на листе. Я исчерпал все, что знаю, и могу найти онлайн поиск Goracle.

Любая помощь?

Спасибо заранее, Lilith

ответ

1

SeriesCollection(j) в ActiveChart всегда имеет Formula свойство, которое выглядит следующим образом:

=SERIES(,,Sheet1!$A$1:$C$3,1) 

Таким образом, вы можете добавить пользовательскую функцию к вашему проекту, который разбирает строка Split на $ и возвращает соответствующий сдвиг в диапазоне 3 столбцов:

Function ShiftBy3(ByVal formulaString As String) As String 
    cRange = Split(formulaString, "$")(1) + Split(formulaString, "$")(2) + Split(formulaString, "$")(3) + Split(Split(formulaString, "$")(4), ",")(0) 
    newAddress = Range(cRange).Offset(0,3).Address 
    ShiftBy3 = Split(formulaString, "$")(0) + newAddress + "," + Split(Split(formulaString, "$")(4), ",")(1) 
End Function 

, а затем сдвигая просто Переустановка формулу каждый раз:

ActiveChart.SeriesCollection(1).Formula = ShiftBy3(ActiveChart.SeriesCollection(1).Formula) 
+1

избил меня! –

1

Один из подходов заключается в обновлении Formula свойство для каждой серии на графике:

Sub Tester() 
Const SER As String = "=SERIES(" 
Dim s As Series, f As String, arr, rng1, rng2, sn 
Dim cht As Chart 

    Set cht = ActiveSheet.ChartObjects("Chart 2").Chart 
    sn = ActiveSheet.Name 
    For Each s In cht.SeriesCollection 
     f = s.Formula 
     Debug.Print f '<<<added 
     f = Replace(f, SER, "") 
     f = Left(f, Len(f) - 1) 
     arr = Split(f, ",") 
     Set rng1 = Range(arr(1)) 
     Set rng2 = Range(arr(2)) 

     s.Formula = SER & Join(Array(arr(0), _ 
       rng1.Parent.Name & "!" & rng1.Offset(0, 3).Address(), _ 
       rng2.Parent.Name & "!" & rng2.Offset(0, 3).Address(), _ 
       arr(3)), ",") & ")" 

    Next s 

End Sub 
+0

Вы оба потрясающие. Я попробовал код Тима, но он не прошел («Метод« Диапазон »объекта« Глобал »не удалось») в строке Set rng1 = Range (arr (1)). Я пробовал код Маттео, потому что я не уверен, куда его поместить. Возможно, я тоже ошибаюсь. – Angela

+0

Если вы добавите 'Debug.Print f', как показано выше, какой результат вы получаете? (он появится в окне Immediate - нажмите Ctrl + G в редакторе, чтобы открыть это). Также - убедитесь, что у вас нет «Option Base 1» в верхней части вашего кода. –

+0

Ничего не случилось с добавлением кода отладки, только всплывающее отладочное сообщение по-прежнему дает ту же ошибку 1004 в одной строке, Set rng1 = Range (arr (1)) – Angela

0

Вот рабочий код пришел мой босс с.

Dim var 

var = Cells(4, 4) 

ActiveSheet.ChartObjects("Chart 2").Activate 
ActiveChart.PlotArea.Select 
ActiveChart.SetSourceData Source:=Range(Cells(1, 1 + var), Cells(3, 3 + var)) 
Cells(4, 4).Value = Cells(4, 4).Value + 3 

Поблагодарите Тима и Маттео за все время и помощь. Я действительно ценю это!

Смежные вопросы