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


解答
Sub ノック78本目()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim ch As ChartObject
Dim ch_Range As Range 'グラフのデータ範囲
For Each ch In ws.ChartObjects
Set ch_Range = ws.Range(ch.TopLeftCell.Address).Offset(1, -1).CurrentRegion
ch_Range.Select '見る用
Set ch_Range = Intersect(ch_Range, ws.Range("B:C"))
ch_Range.Select
ch.Chart.SetSourceData Source:=ch_Range
Next
End Sub
■考え方・流れ
0:00 冒頭・問題確認
1:52 データ範囲を拡張する(マクロの記録)
3:45 各グラフのデータ範囲の取得
7:15 グラフのデータ範囲を変更する

大量のグラフを
手動で変更するのは
めんどくさいですもんね!

めんどくさがらずに
根性でやれバカモノ!

おいおい…
データ範囲を拡張する(マクロの記録)
さて!じゃあまずは…
データ範囲を拡張(変更)するコードがわからない!!ということで…
マクロの記録で調べてみよう!!

そっすると、こんなコードが記録されるぞ!!
これは分かりやすいね!

ActiveChart.SetSourceData Source:=のところだね!
各グラフのデータ範囲の取得
よし!そしたらお次!
各グラフが今、どこにあるのかを調べるぞ!!
これは…神髄さんが、きれーいに作ってくれたことを活かして…
今グラフのある位置の、左のセルに、CurrentRegionのどこかが入ってると仮定して考えたぞ!!
それ以外の場合はここを工夫しないといけないな!

これをコードで求めようと思ったら、こんな感じ!!↓
順番に考えていけば簡単だね!

まずは、全てのグラフの左上の位置を求めるコード!

実行結果↓
C列にずれてるのもあるけど…
その後、表範囲をCurrentRegionで取得するからここは関係ないかな!

あとはラストスパート!!
グラフのデータ範囲を変更する
最後!!
取得したセルを基準とする表範囲に対して、処理をしていくぞ!!
一つずつ順番に進めてるだけだから、落ち着いたら大丈夫!!

Offsetで、一つ下、一つ左のセルに移動したところを基準として…

そこの表範囲(CurrentRegion)と、B列C列の交点を、Intersectメソッドさんで求めたらOK!!
これでグラフ範囲が求まったから…
後は元の範囲を変更してあげればいいだけ!

綺麗な表だったら、こんな感じで自分でロジックを組み立てて修正しやすいね!!
終わりです!!お疲れさまでした!

この問題は簡単だったね!

お疲れさまでした!
あとがたり
おはこんばんちは。uぷ主です。
78本目、グラフのデータ範囲を拡張する問題でした!!
あぁ…これ…なんかあったなあ…会社で…
グラフを自動で生成して、拡張するみたいなやつ…
その時は、行を表示、非表示にしたりして対応してたっけ…
これを使えば良かったのか…
勉強になるなぁ…ありがとうございました!!!
コメント