VBA練習問題
VBA100本ノック 78本目:グラフのデータ範囲拡張

VBAを100本の練習問題で鍛えます
最終更新日:2021-02-22

VBA100本ノック 78本目:グラフのデータ範囲拡張


シートの複数のグラフに対して、データ範囲を自動拡張する問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータは、VBA100本ノックの目次ページ からもダウンロードできます。
マクロVBAを初心者向けの基本から上級者向けの高度な内容までサンプルコードを掲載し解説しています。エクセル関数・機能・基本操作の入門解説からマクロVBAまでエクセル全般を網羅しています。


出題

出題ツイートへのリンク

#VBA100本ノック 78本目
シートには複数のグラフがあります。
シートの全グラフのデータの範囲を一括で変更します。
データ範囲の下に追加された行をグラフのデータ範囲に追加してください。
※画像では2021/01を追加(B1:C10をB1:C11)します。
※シートは任意

マクロ VBA サンプル画像

マクロ VBA 100本ノック


サンプルファイルです。
https://excel-ubara.com/vba100sample/VBA100_78.xlsm
https://excel-ubara.com/vba100sample/VBA100_78.zip


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

シートの全グラフはChartObjectsコレクションで取得します。
グラフには系列がありSeriesCollectionで取得します。
SeriesCollectionのFormulaでデータ範囲を取得できます。
このデータ範囲をCurrentRegionの最終行まで広げるようにしました。
サンプルは1系列でしたが複数系列にも対応してみました。

Sub VBA100_78_01()
  Dim ws As Worksheet
  Set ws = ActiveSheet
  
  Dim cht As ChartObject, src As Series, aryFormula() As String
  
  For Each cht In ws.ChartObjects
    For Each src In cht.Chart.SeriesCollection
      aryFormula = Split(src.Formula, ",")
      aryFormula(1) = getNewRegion(aryFormula(1))
      aryFormula(2) = getNewRegion(aryFormula(2))
      src.Formula = Join(aryFormula, ",")
    Next
  Next
End Sub

Function getNewRegion(ByVal sFormula As String) As String
  Dim rngOld As Range, rngNew As Range
  Set rngOld = Application.Range(sFormula)
  Set rngNew = rngOld.CurrentRegion
  Set rngNew = rngOld.Resize(rngNew.Item(rngNew.Count).Row - rngOld.Item(1).Row + 1)
  getNewRegion = rngNew.Address(external:=True)
End Function


範囲を広げるだけの割には面倒なVBAになっています。
そもそも元のセル範囲が分かれば、単純にCurrentRegionから取得したRnageをSetSourceDataに入れるだけで済んでしまいます。
これについては記事補足に掲載しました。


補足

サンプルファイルを見た方は、タイトルがセル参照になっているのに気づいたと思います。
実際にそれを使って回答された方も複数おられました。
このタイトルのセル範囲を基準にしてデータ範囲を取得できるように配置しておけば、難しい系列の数式解析などする必要は無くなります。

Sub VBA100_78_02()
  Dim ws As Worksheet: Set ws = ActiveSheet
  Dim cht As ChartObject, src As Series, rng As Range
  
  For Each cht In ws.ChartObjects
    Set rng = Application.Range(cht.Chart.ChartTitle.Formula)
    Set rng = rng.CurrentRegion
    Set rng = Intersect(rng, rng.Offset(, 1))
    Call cht.Chart.SetSourceData(rng)
  Next
End Sub

今回のサンプルではタイトルとデータ部分が隣接していましたが、位置関係さえ決まっていれば離れていても構いません。
Offset等でずらして範囲取得するようにすれば良いでしょう。

ただし、グラフのデータ範囲は単純な1領域になっている必要ががあります。
つまり、単純な範囲設定でグラフを作成できるような元表を用意することが大切だという事になります。


サイト内関連ページ

第96回.グラフ(Chart)|VBA入門
マクロVBAでグラフを扱う時の解説になりますが、グラフの全ては解説しきれませんし、マクロVBAでグラフを全て作成しようとするのはかなり大変です。雛形のグラフを作成しておき、VBAでは必要な部分のみ変更するようにした方が良いでしょう。マクロVBAでグラフを扱うには、数多くのオブジェクトを理解する必要があります。
円グラフの色設定(Chart,SeriesCollection)
円グラフの色を、元の表から設定します。以下は、ウイザードでグラフを作成した状態です。A列に指定した、塗りつぶし色を、グラフに反映させます。たった、これだけです。手作業よりは、はるかに簡単ですし、応用範囲が広いと思います。
棒グラフ・折れ線グラフのサンプルマクロ
グラフはプロパティ・メソッドも多いので、自分の覚書もかねて掲載しました。この元データから、以下のグラフが作成されます。解説は、プログラム内のコメントを参考にして下さい。系列データのデータ数が増えた時に、データ範囲を変更するマクロも掲載しておきます。
人口ピラミッドのグラフをマクロで作成
人口ピラミッドのグラフ作成は、設定項目が多く、かなり面倒です。マクロでサクッと作って、細かい部分を手動で設定できれば楽です。この表から、以下のグラフを作成します。手動で設定すると、かなり多くの手順が必要になります。
グラフで特定の横軸の色を変更し基準線を引くマクロ
特定の横軸のみ色を変更する、つまり、基準値や下限・上限等に線を引きたい場合のマクロVBAになります。手動でやろえとすると結構面倒なので、いざやろうとするとなかなか出来なかったりします。グラフの元データに線を引きたい数値の系列をシートに追加しておくと、もう少し楽にできますが、ここでは、シートには手を加えずに基準線を引…
グラフのデータ範囲を自動拡張するマクロ
グラフのデータ範囲を自動で拡張・縮小するマクロVBAになります、グラフのデータ範囲を変更する事は度々ありますが、作業自体は大した事はないのですが、やはり面倒ですし、グラフの数が多いと、結構な手間になります。注意 以下は、棒グラフ・折れ線グラフの場合になります。




同じテーマ「VBA100本ノック」の記事

75本目:ログインフォームの作成
76本目:ボタンの表示名の位置へ移動
77本目:シート挿入イベント
78本目:グラフのデータ範囲拡張
79本目:Wordにセル範囲を図として挿入
80本目:読み取り専用で保存できないブックにする
81本目:全フィルターの絞り込解除
81本目:全フィルターの絞り込解除
82本目:ブックのドキュメントプロパティを取得
83本目:請求書を作成してPDF出力
84本目:ブックの自動バックアップ


新着記事NEW ・・・新着記事一覧を見る

還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ