私の「チャートデータ範囲」は='sheet1'!$A$1:$Z$10
. chart1
マクロを実行するたびに、範囲の終了列を 1 ずつ増やす VBA マクロを作成したいと思います (または、使用できる数式を誰かが知っているが、それを理解できなかった場合) 。したがって、本質的に:
chart1.endCol = chart1.endCol + 1
これを使用するための構文は何ですか、ActiveChart
またはより良い方法はありますか?
Offset function
ダイナミックレンジがそれを可能にします。
サンプルデータ
手順
=OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2))
それに名前を付けますmobileRange
この画面になります
Legend Entries の下にある をクリックしEdit
ます。(mobiles が選択されています)
mobileRange
名前付き範囲を指すように Series 値を変更します。グラフを選択してマクロを実行すると仮定すると、私の考えは、各シリーズの式の範囲を変更することです。ワークシート内のすべてのチャートに変更を適用できます。
更新: スクリーンショット付きの複数のシリーズに対応するようにコードを変更しました
新しいシリーズ文字列の書式設定では、ワークシート名の前後にアポストロフィを含める必要があります (以下で既に変更されています): aFormulaNew(i) = "'" & oRng.Worksheet.Name & "'" & "!" & oRng.Address
. また、列ではなく行を変更する場合は、必要に応じてオフセットをSet oRng = oRng.Worksheet.Range(oRng, oRng.Offset(1, 0))
または に変更します。oRng.Offset(1, 0)
シリーズの開始位置を調整するために、範囲内の最初の要素を含めることもできます。Set oRng = oRng.Worksheet.Range(oRng.Offset(1, 0), oRng.Offset(1, 0))
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
サンプルデータ - 初期
最初の実行後:
2 回目の実行:
3 回目の実行: