これは、次の 2 つの手順で実現できます。
- 動的な名前付き範囲を作成する
- チャート データ ソースを名前付き範囲に更新するための VBA コードを追加します。
動的な名前付き範囲を作成する
データ範囲の行数をデータ シートのセルに入力します。
データ シート (挿入 - 名前 - 定義)に、 MyRangeという名前の範囲を作成します。これには、次のような数式が含まれます。
=OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)
式を更新してレイアウトに合わせます
- Sheet1!$A$1これをデータ範囲の左上に設定します
- Sheet1!$D$1は、これを行数を含むセルに設定します
- 3この値を列数に設定します
名前付き範囲が機能していることをテストします。
ドロップダウン メニューの [編集] - [移動] を選択し、参照フィールドにMyRangeと入力します。グラフのデータ領域が選択されている必要があります。
VBA コードを追加する
VBA IDE を開く (Alt-F11)
VBAProject ウィンドウで Sheet1 を選択し、このコードを挿入します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$D$1" Then Exit Sub
'Change $D$1 to the cell where you have entered the number of rows
'When the sheet changes, code checks to see if the cell $D$1 has changed
ThisWorkbook.Sheets("Sheet1").ChartObjects(1).Chart.SetSourceData _
Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
' ThisWorkbook.Sheets("Chart1").SetSourceData _
Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
'The first line of code assumes that chart is embedded into Sheet1
'The second line assumes that the chart is in its own chart sheet
'Uncomment and change as required
'Add more code here to update all the other charts
End Sub
注意事項
名前付き範囲をグラフのデータ ソースとして直接使用しないでください。名前付き範囲「MyRange」をチャートのソース データ - データ範囲として入力すると、Excel は名前付き範囲を実際の範囲に自動的に変換します。したがって、名前付き範囲を今後変更しても、グラフは更新されません。
上記のアプローチは、パフォーマンスに影響を与える可能性があります。
名前付き範囲のOFFSET関数は「揮発性」です。つまり、ブック内のセルが計算されるたびに再計算されます。パフォーマンスが問題になる場合は、 INDEX式に置き換えてください。
=Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)
Sheet1 でデータが変更されるたびにコードが実行されます。パフォーマンスが問題になる場合は、コードを変更して、要求されたとき (つまり、ボタンまたはメニューから) のみ実行するようにします。