VBAですべてのワークシート上のグラフを一括で操作する方法についてご説明します。
1つのシート上であれば 「Ctrlキー+A」で サイズや位置など一括で操作出来ますが、シートを跨いでしまいますと一括の操作も出来ないため、非常に作業効率が悪くなってしまします。
また、1つのシートであってもプロットエリアの変更などは一括で操作出来ませんので、VBAで一括で操作出来るようになると、非常に作業効率を改善できます。
その他のグラフの操作については下記記事をご覧ください。
- グラフの作成と詳細設定をする方法
- 作成済みのグラフのデータ範囲を変更する
- シートに作成済みの埋め込みグラフを取得する
- 選択したセルの行のデータを動的に次々グラフに反映させる方法
- シート上のグラフを一括で操作する方法
1.グラフを一括で操作する方法とサンプルコード
全てのワークシート上のグラフを一括で操作するには、1つのワークシート上のグラフを一括で操作する方法をすべてのワークシートで行います。
まずは1つのシート上のグラフを一括で操作する方法です。
グラフを一括で操作するには、「ChartObjects」コレクションオブジェクトをループで1つずつ処理していきます。
ループの対象がグラフのコレクションなので素直に「For Each In Next」を使用することをおすすめします。
ループの詳細については「 「For~Next」「Do~Loop」 ループの使い方 」をご覧ください。
グラフを操作する際にはグラフが設置されているシートを指定します。
グラフをループするサンプルコード
ワークシート上のグラフをループするコードです。
シート上に次のような3つのグラフを用意しました。
このグラフをループして、グラフの名前を取得します。
Sub Sample1()
Dim Cht As ChartObject
Dim ChtName As String
With ActiveSheet
For Each Cht In .ChartObjects 'グラフのコレクションをループ
ChtName = ChtName & Cht.Name 'グラフの名前を取得
Next
MsgBox ChtName 'グラフの名前を表示
End With
End Sub
コードの説明
ほとんどコメントに記載していますが、簡単に説明です。
「With ActiveSheet」でグラフが設置されているシートを指定ています。
もちろん他のシート名やインデックスで指定しても構いません。
「For Each Cht In .ChartObjects」でグラフのコレクションオブジェクトをループしています。
これでグラフが何個あってもすべてループします。
ループの中に処理を記述することで、すべてのグラフに一括で処理が出来ます。
2.全てのシート上のグラフを一括で操作する方法
1つのシート上のグラフの一括操作の方法がわかりましたので、次は全てのシートのグラフを操作する方法です。
とても簡単です。
シートを順番にループして、ループ中に上記で説明したグラフを一括で操作する処理を記述するだけです。
シートのループも「Worksheets」コレクションをループしますので、こちらも素直に「For Each In Next」を使用することをおすすめします。
シートをループする方法は次のように記述します。
Sub Samle2()
Dim WS As Worksheet
For Each WS In Worksheets
'この中に処理を記述
Next
End Sub
次のように「グラフ1」~「グラフ3」までのシートに、上記で使ったグラフ3つをそれぞれ用意しました。
グラフには「グラフ1の1」といったようにシート名+番号にしてありますので、この3つのシートのグラフ名をすべて取得します。
Sub Sample3()
Dim WS As Worksheet
Dim Cht As ChartObject
Dim ChtName As String
For Each WS In Worksheets 'シートコレクションをループ
With WS
For Each Cht In .ChartObjects 'グラフコレクションをループ
ChtName = ChtName & Cht.Name & vbCrLf 'グラフの名前を取得
Next
End With
Next
MsgBox ChtName 'グラフの名前を表示
End Sub
各シートのグラフの名前が取得出来ました。
3.グラフの設定を変更するサンプルコード
グラフをループして操作する方法がわかりましたので、少し具体的な処理のサンプルコードをご紹介したいと思います。
グラフの位置とサイズを一括で指定する方法
グラフの位置とサイズを一括で指定するコードです。
グラフの位置を指定する方法
グラフの位置を設定するには、「ChartObject」のTopプロパティとLeftプロパティで設定します。
数値で「x」「y」座標を指定する事も出来ますし、「A1」などのセルの番地でも指定できます。
ループで操作するには数値で指定した方がコードがすっきりします。
グラフのサイズを変更する方法
グラフの大きさを設定するには、「ChartObject」のWidthプロパティとHeightプロパティで設定します。
次のようにセルでも指定出来ますし、位置同様に数値でも指定可能です。
Width = Range("G2:L13").Width
Height = Range("G2:L13").Height
グラフの位置とサイズを一括で指定するサンプルコード
それではすべてのワークシート上のグラフの位置とサイズを一括で変更したいと思います。
ワークシートをループして、その中にシート上のグラフをループします。
そしてそのグラフのループの中に処理内容は記述します。
Sub Sample4()
Dim WS As Worksheet
Dim Cht As ChartObject
Dim ChtTop As Long
Dim ChtLeft As Long
Dim ChtWidth As Long
Dim ChtHeight As Long
For Each WS In Worksheets 'シートコレクションをループ
ChtTop = 10 '最初のTOP位置
ChtLeft = 10 '最初のLEFT位置
ChtWidth = 300 'グラフの幅
ChtHeight = 200 'グラフの高さ
With WS
For Each Cht In .ChartObjects 'グラフのコレクションをループ
With Cht
.Top = ChtTop 'グラフのTOP位置
.Left = ChtLeft 'グラフのLEFT位置
.Width = ChtWidth 'グラフのTOP位置
.Height = ChtHeight 'グラフのLEFT位置
End With
ChtTop = ChtTop + 100 '次のグラフのTOP位置
ChtLeft = ChtLeft + 250 '次のグラフのLEFT位置
Next
End With
Next
End Sub
全てのシートのグラフを変更できました。
コードの説明
基本的な処理内容はコメントに記述していますが、簡単にコードの説明です。
「For Each WS In Worksheets」でシートコレクションをループしています。
「ChtTop = 10」~「ChtHeight = 200」はサイズや位置を変更する際に1か所変更すれば良いように変数にしています。
Const変数で宣言時に指定しても構いません。
「For Each Cht In .ChartObjects」でグラフのコレクションをループしています。
「With Cht」~「End With」の中にグラフの位置とサイズを指定する処理を記述しています。
位置は等間隔でずらすため、数値を加算しています。