Предполагая, что вы запускаете макрос только с выбранной диаграммой, моя идея состоит в том, чтобы изменить диапазон в формуле для каждой серии. Вы можете вызвать изменение для всех диаграмм на листе.
UPDATE: Изменились код для размещения нескольких серий со скриншотами
Sub ChartRangeAdd()
On Error Resume Next
Dim oCht As Chart, aFormulaOld As Variant, aFormulaNew As Variant
Dim i As Long, s As Long
Dim oRng As Range, sTmp As String, sBase As String
Set oCht = ActiveSheet.ChartObjects(1).Chart
oCht.Select
For s = 1 To oCht.SeriesCollection.count
sTmp = oCht.SeriesCollection(s).Formula
sBase = Split(sTmp, "(")(0) & "(<FORMULA>)" ' "=SERIES(" & "<FORMULA>)"
sTmp = Split(sTmp, "(")(1) ' "..., ..., ...)"
aFormulaOld = Split(Left(sTmp, Len(sTmp) - 1), ",") ' "..., ..., ..."
aFormulaNew = Array()
ReDim aFormulaNew(UBound(aFormulaOld))
' Process all series in the formula
For i = 0 To UBound(aFormulaOld)
Set oRng = Range(aFormulaOld(i))
' Attempt to put the value into Range, keep the same if it's not valid Range
If Err.Number = 0 Then
Set oRng = oRng.Worksheet.Range(oRng, oRng.Offset(0, 1))
aFormulaNew(i) = oRng.Worksheet.Name & "!" & oRng.Address
Else
aFormulaNew(i) = aFormulaOld(i)
Err.Clear
End If
Next i
sTmp = Replace(sBase, "<FORMULA>", Join(aFormulaNew, ","))
Debug.Print "Series(" & s & ") from """ & oCht.SeriesCollection(s).Formula & """ to """ & sTmp & """"
oCht.SeriesCollection(s).Formula = sTmp
sTmp = ""
Next s
Set oCht = Nothing
End Sub
Пример данных - Initial
После первого запуска:
Второй запуск:
Третий Пробег:
Если вы собираетесь объявить переменные (которые вы должны), вы должны объявить их как собственные типы: 'Dim I As Integer, r как Integer, n как Integer, p1 как Integer, p2 как Integer'. Ваше объявление создает 'i, r, n, p1' как' Variant' :) –
@DavidZemens Я действительно не знал об этом. Благодаря! –
не беспокойтесь! Это очень распространенная ошибка, я думаю :) –