我的“图表数据范围”是='sheet1'!$A$1:$Z$10
。我想制作一个VBA宏(或者如果有人知道我可以使用的公式,但我无法想出一个),以便在每次运行宏时将chart1
的范围的结束列增加1。所以基本上:VBA:修改图表数据范围
chart1.endCol = chart1.endCol + 1
,这是什么使用ActiveChart
或是否有更好的方法的语法?
我的“图表数据范围”是='sheet1'!$A$1:$Z$10
。我想制作一个VBA宏(或者如果有人知道我可以使用的公式,但我无法想出一个),以便在每次运行宏时将chart1
的范围的结束列增加1。所以基本上:VBA:修改图表数据范围
chart1.endCol = chart1.endCol + 1
,这是什么使用ActiveChart
或是否有更好的方法的语法?
假设你要扩大范围(通过添加一个额外的列)添加一个多观察每个系列中,你图(而不是添加一个新的系列),您可以使用此代码:
Sub ChangeChartRange()
Dim i As Integer, r As Integer, n As Integer, p1 As Integer, p2 As Integer, p3 As Integer
Dim rng As Range
Dim ax As Range
'Cycles through each series
For n = 1 To ActiveChart.SeriesCollection.Count Step 1
r = 0
'Finds the current range of the series and the axis
For i = 1 To Len(ActiveChart.SeriesCollection(n).Formula) Step 1
If Mid(ActiveChart.SeriesCollection(n).Formula, i, 1) = "," Then
r = r + 1
If r = 1 Then p1 = i + 1
If r = 2 Then p2 = i
If r = 3 Then p3 = i
End If
Next i
'Defines new range
Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 - 1))
Set rng = Range(rng, rng.Offset(0, 1))
'Sets new range for each series
ActiveChart.SeriesCollection(n).Values = rng
'Updates axis
Set ax = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p1, p2 - p1))
Set ax = Range(ax, ax.Offset(0, 1))
ActiveChart.SeriesCollection(n).XValues = ax
Next n
End Sub
Offset function
动态范围使之成为可能。
的样本数据
步骤
=OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2))
,并给它一个名字 mobileRange
该屏幕会在下面图例条目Edit
点击(手机被选中)
mobileRange
命名的范围。+1,不需要宏。 –
我同意这对单个数据系列更好,但不能在多个系列的“图表数据范围”中使用此功能。由于我有大约一百个系列,我宁愿不这样做。 – Stuart
假设你只运行一个Chart Selected的宏,我的想法是改变公式中每个Series的范围。您可以将更改应用于工作表中的所有图表。
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
样本数据 - 初始
第一次运行后:
第二轮:
第三轮:
如果你要声明的变量(你应该),你应该声明为正确类型:'暗淡我作为整数, r为Integer,n为Integer,p1为Integer,p2为Integer'。你的声明创建'i,r,n,p1'作为'Variant' :) –
@DavidZemens我其实并没有意识到这一点。谢谢! –
不用担心!这是一个非常常见的错误,我认为:) –