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

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




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

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


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

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




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


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



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