グラフを画像にするには
グラフはVBAではChartObjectオブジェクトとChartオブジェクトを使って操作します。
ChartObjectオブジェクトとChartオブジェクトは親子関係にあり、ChartObjectのChartプロパティを使ってChartオブジェクトを生成できます。ChartObjectはグラフの位置などの外観などを操作し、Chartはグラフの内容を指します。
このChartオブジェクトのExportメソッドを使うことでグラフを画像化できます。
扱える画像の種類
Chart.Exportメソッドで扱える画像の種類にはJPEG、GIF、BMP、PNGがあります。TIFFなどは扱えません。
JPEGには拡張子の種類が複数ありますが、その中でも扱えるものと扱えないものがあります。たとえば.jpegや.jpgや扱えますが、.jpeは扱えません。
「扱えない」ものは、エラーが発生しますがファイルとしては一応出力されます。ファイルは出力されるのですが画像として解釈できないためか0バイトのファイルとして出力されます。
調べた中では、.pngファイルが画像の劣化も無く、ファイルサイズも小さいので一番良いのではないかと思います。JPEGは劣化が激しいです。
調査結果 | 拡張子 |
扱える | .png(おすすめ)、.jpg、.jpeg、.gif、.bmp |
扱えない | .tiff、.dib、.svg、.pic、.pict、.eps |
以下のコードもPNGファイルを出力するようにしています。
シートにある全てのグラフをPNGファイルとして出力するコード
アクティブシートにある全てのグラフをPNG画像として出力するコードです。
PNG画像は「セル座標+.png」というファイル名を付けてブックがあるフォルダに保存されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Sub GraphToPng() Dim co As ChartObject '// グラフ枠 Dim sht As Worksheet '// アクティブシート Dim c As Chart '// グラフ Dim sAddress As String '// セル位置 Dim sFolder As String '// 画像ファイル出力先フォルダ Dim sExtension As String '// 出力画像の拡張子 '// ブックがあるフォルダを画像ファイル出力先フォルダとして取得 sFolder = ActiveWorkbook.Path '// 未保存のブックの場合 If (sFolder = "") Then Call MsgBox("ブックを保存してください", vbOKOnly) '// 処理せずに抜ける Exit Sub End If '// 画像拡張子を設定 sExtension = ".png" '// アクティブシートをWorksheetオブジェクトにセット Set sht = ActiveSheet '// ズームを100%に戻す(出力する画像サイズはズームに影響するため) ActiveWindow.Zoom = 100 '// アクティブシートの全グラフをループ For Each co In sht.ChartObjects '// 現ループのグラフがあるセル座標を取得 sAddress = co.TopLeftCell.Address(False, False) '// 対象グラフを選択する '// グラフを画面表示させることが目的。 '// これをしないと0バイトの画像ファイルが出力されることがある Range(sAddress).Select '// Chartオブジェクトを取得 Set c = co.Chart '// 画像出力 Call c.Export(sFolder & "\" & sAddress & sExtension) Next End Sub |
コード説明
コメントに大体のことは書いているので実行の仕方や処理概要などを補足します。
このコードを実行する場合は事前にグラフがあるシートをアクティブにした状態にしておく必要があります。
ファイルの保存先はブックが置いてあるフォルダと同じにしています。理由はエラー処理がまず必要ないためです。任意のフォルダにするとそのフォルダが存在しているかどうかのチェックが必要になります。もし任意のフォルダへ保存したい場合はそのあたりの考慮をしてください。
あと、新規ブックで「Book1」のままになっているような未保存のブックも保存先が確定していないため、処理をしないようにしています。
ズームを100%にしているのは、Chart.Exportメソッドを実行する際の画像サイズに影響するためです。ズームのサイズが10%など小さいと画像も小さくなり、400%だと画像も大きくなります。そのため標準サイズとしてズームを100%に戻しています。
ループ内でグラフのセル位置をSelectメソッドで選択していますが、これはグラフがウィンドウに表示されていない場合を考慮しています。画面上に見えていないグラフをExportメソッドで保存しようとすると、画像として認識できないのかファイルは出力されますが0バイトになっていることがあります。それを回避するために各グラフを一度選択してからExportメソッドを実行するようにしています。
ファイル名をグラフの名前にしたい場合など、ファイル名に付けたいものはいろいろと要望があると思いますのでそこはカスタマイズしてください。「グラフ名+.png」にしたい場合はExportメソッドの行を「Call c.Export(sFolder & “\” & co.Name & sExtension)」のように変えてください。
実行サンプル
以下のように、シートにグラフが複数あるとします。ここでは4つです。グラフが雑だ、コピペしてるだろ、なんてのはスルーしてください。
上のコードを実行するとブックのフォルダにPNGファイルが4ファイル出力されます。それぞれのファイル名はグラフが配置されている左上のセル位置になります。
“VBAでグラフを画像ファイル(PNG等)として保存する” への1件のフィードバック