78本目 グラフのデータ範囲を拡張する

VBA100本ノック

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本目、グラフのデータ範囲を拡張する問題でした!!

あぁ…これ…なんかあったなあ…会社で…
グラフを自動で生成して、拡張するみたいなやつ…

その時は、行を表示、非表示にしたりして対応してたっけ…

これを使えば良かったのか…
勉強になるなぁ…ありがとうございました!!!

コメント

タイトルとURLをコピーしました