Excel VBAでグラフを作成する際、最も重要なのがデータ範囲の指定方法です。
固定範囲を指定する場合と、行数が変化しても対応できる動的範囲を指定する方法の2種類があります。
「毎月データが増える Excelでグラフを自動更新したい」
「VBAで柔軟なグラフ作成処理を書きたい」
そんなときに必須となる知識です。本記事では、固定範囲と動的範囲の指定方法を丁寧に解説します。
目次
1. 固定範囲を指定する基本方法
まずは、決まったセル範囲をグラフに設定する方法です。
● 固定範囲の指定イメージ
Dim chtObj As ChartObject
Set chtObj = ActiveSheet.ChartObjects.Add(100, 50, 400, 250)
With chtObj.Chart
.SetSourceData Source:=Range("A1:B6") '固定範囲
End With
上記例では、「A1:B6」の範囲をそのままデータとして設定しています。
● 固定範囲のメリット・デメリット
| 項目 | 内容 |
|---|---|
| メリット | コードがシンプル、理解しやすい |
| デメリット | データが増減したときに対応できない(エラー or 範囲外) |
固定データのレポートや初心者の練習には適していますが、実務で使うには不便になるケースが多いです。
2. 動的範囲を指定する方法(データが増えても対応)
毎月データが増える帳票や、抽出結果が変動するケースでは、動的にデータ範囲を取得する必要があります。
以下では代表的な方法を紹介します。
2-1. 最終行を自動取得して範囲設定する方法
最も一般的なのは、最終行を取得して範囲を設定するやり方です。
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行取得
Dim chtObj As ChartObject
Set chtObj = ActiveSheet.ChartObjects.Add(100, 50, 400, 250)
With chtObj.Chart
.SetSourceData Source:=Range("A1:B" & lastRow) '動的範囲
End With
● ポイント
Cells(Rows.Count, "A").End(xlUp).Rowで最終行を取得"A1:B" & lastRowで可変範囲を作成
実務ではほぼ必須テクニックです。
2-2. Excelテーブル(ListObject)を利用する方法
データ管理に慣れている方にはテーブル化がおすすめです。
テーブルは自動拡張されるため、範囲指定がシンプルになります。
Dim lo As ListObject
Set lo = ActiveSheet.ListObjects("Table1") 'テーブル名
Dim chtObj As ChartObject
Set chtObj = ActiveSheet.ChartObjects.Add(100, 50, 400, 250)
With chtObj.Chart
.SetSourceData lo.Range 'テーブル全体を対象に
End With
● テーブルのメリット
| メリット | |
|---|---|
| 自動拡張 | 行追加で自動的にグラフに反映 |
| コードが短くなる | Range文字列不要 |
| メンテナンス性が高い | 列順変更にも対応しやすい |
Excel作業の自動化と相性抜群です。
2-3. 名前付き範囲(Name Range)を使う方法
Excelの「名前の定義」機能を使い、動的名前範囲を設定する方法です。
例:OFFSET関数で範囲作成(Excel側)
=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),2)
VBAで参照する例:
With chtObj.Chart
.SetSourceData Source:=Range("SalesRange") '名前付き範囲
End With
レガシーExcelシステムでよく使われる手法です。
3. 動的範囲選択の注意点とおすすめ
| 方法 | 難易度 | 実務おすすめ度 | コメント |
|---|---|---|---|
| 固定範囲 | ★☆☆☆☆ | 低 | 一時的な用途向け |
| 最終行取得 | ★★★☆☆ | 高 | ほとんどの案件で使用 |
| テーブル | ★★★☆☆ | 最高 | 迷ったらコレ |
| 名前付き範囲 | ★★★★☆ | 中 | 既存資産の活用に最適 |
4. まとめ:柔軟なグラフ自動化には動的範囲が必須
Excel VBAでグラフを自動生成する際は、状況に応じて範囲指定を使い分けましょう。
- 固定範囲:簡単だが変化に弱い
- 動的範囲:最終行取得 or テーブルが実務向き
- テーブル利用が最もメンテしやすくおすすめ
コメント