8

私の「チャートデータ範囲」は='sheet1'!$A$1:$Z$10. chart1マクロを実行するたびに、範囲の終了列を 1 ずつ増やす VBA マクロを作成したいと思います (または、使用できる数式を誰かが知っているが、それを理解できなかった場合) 。したがって、本質的に:

chart1.endCol = chart1.endCol + 1

これを使用するための構文は何ですか、ActiveChartまたはより良い方法はありますか?

4

5 に答える 5

6

Offset functionダイナミックレンジがそれを可能にします。

サンプルデータ

ここに画像の説明を入力

手順

  • 動的な名前付き範囲を定義し、 =OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2))それに名前を付けますmobileRange
  • チャートを右クリック
  • データの選択をクリックします

この画面になります

ここに画像の説明を入力

Legend Entries の下にある をクリックしEditます。(mobiles が選択されています)

ここに画像の説明を入力

  • mobileRange名前付き範囲を指すように Series 値を変更します。
  • 将来の月のデータがモバイル売上に追加されると、グラフに自動的に反映されるようになりました。
于 2013-10-10T04:45:40.653 に答える
4

グラフを選択してマクロを実行すると仮定すると、私の考えは、各シリーズの式の範囲を変更することです。ワークシート内のすべてのチャートに変更を適用できます。

更新: スクリーンショット付きの複数のシリーズに対応するようにコードを変更しました

新しいシリーズ文字列の書式設定では、ワークシート名の前後にアポストロフィを含める必要があります (以下で既に変更されています): 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 回目の実行:

サードラン

于 2013-10-10T04:52:28.270 に答える