Excelで作成した図形やフローチャートを、プレゼン資料やWebサイトで使いたいと思ったことはありませんか?手作業でスクリーンショットを撮ってトリミングするのは少し面倒です。VBAを使えば、特定のシェイプだけを高品質な画像ファイルとして、好きな場所に一瞬で保存することが可能です。
今回は、そのための少し応用的ながらも確実なテクニックを、コードの仕組みと共に詳しく解説します。
なぜ直接エクスポートできないのか?
まず知っておくべきなのは、残念ながらVBAにはShape.ExportAsImage()
のような、図形を直接画像として保存する簡単な命令が用意されていない、ということです。そのため、少し工夫を凝らした手順を踏む必要があります。
Chartオブジェクトを「一時的なキャンバス」として使う方法
直接保存ができないため、VBAではよくChart(グラフ)オブジェクトを「一時的なキャンバス」として利用するという手法が取られます。具体的な手順は以下の通りです。
- 対象のシェイプを画像としてクリップボードにコピーする (
.CopyPicture
)。 - 一時的な「真っ白なグラフ(Chartオブジェクト)」をシート上に作成する。
- そのグラフ(キャンバス)に、クリップボードの画像を貼り付ける (
.Paste
)。 - 画像が貼り付けられたグラフを、画像ファイルとして書き出す (
.Export
)。 - 役目を終えた一時的なグラフをシート上から削除する (
.Delete
)。
この手順を踏むことで、シェイプを間接的に画像ファイルとして保存できるのです。
実践コード:シェイプをPNG画像として書き出す
この処理は少し特殊で、「コピー」と「貼り付け」の間に少し時間を置く必要があるため、2つのプロシージャに分けて実装します。
事前準備
シートに画像として書き出したい図形を配置し、その名前を「ExportTargetShape」としておきましょう。(図形を選択 > 図形の書式設定タブ > オブジェクトの選択と表示 で名前を変更できます)
VBAコード例
以下の2つのプロシージャを、標準モジュールにコピーしてください。
' --- プロシージャ1:シェイプをコピーし、一時グラフを作成 ---
Sub ExportShapeAsImage()
' 画像として書き出したいシェイプを指定
With ActiveSheet.Shapes("ExportTargetShape")
' (1) シェイプを画像としてクリップボードにコピー
.CopyPicture
' (2) 一時的なグラフオブジェクトを作成し、名前を付ける
' シェイプと同じサイズで作成するのがポイント
ActiveSheet.ChartObjects.Add(0, 0, .Width, .Height).Name = "TempChartForExport"
End With
' (重要) クリップボードへのコピーが完了するのを待つため、
' 1秒後に次のプロシージャを呼び出す予約をする
Application.OnTime Now + TimeValue("00:00:01"), "PasteAndExportChart"
End Sub
' --- プロシージャ2:グラフに貼り付けて書き出し、後片付け ---
Sub PasteAndExportChart()
' (2)で作成した一時的なグラフオブジェクトを操作
With ActiveSheet.ChartObjects("TempChartForExport")
' (3) グラフエリアに画像を貼り付け
.Chart.Paste
' (4) グラフをPNGファイルとして書き出す
' ThisWorkbook.Path は、このExcelファイルと同じフォルダを指す
.Chart.Export ThisWorkbook.Path & "\ShapeImage.png"
' (5) 役目を終えた一時グラフを削除
.Delete
End With
MsgBox "シェイプを画像として保存しました。", vbInformation
End Sub
コードの解説
ExportShapeAsImage
プロシージャ
このプロシージャの役割は「準備」です。 .CopyPicture
でシェイプを画像としてコピーし、.Add
でからのグラフを一時的なキャンバスとして作成しています。
最も重要なのがApplication.OnTime
の部分です。.CopyPicture
の処理は、VBAのコード実行と非同期に行われるため、すぐに次の貼り付け処理を行うと、コピーが完了しておらず失敗することがあります。そのため、OnTime
を使って1秒後に次のPasteAndExportChart
プロシージャを実行するよう予約し、安全に処理を続行させています。
PasteAndExportChart
プロシージャ
1秒後に呼び出されるこちらのプロシージャが、実際の「貼り付け」と「書き出し」を行います。 .Chart.Paste
で画像を貼り付けた後、.Chart.Export
でファイルとして保存します。ファイル名の拡張子を.jpg
などにすれば、その形式で保存することも可能です。 最後に、TempChartForExport
はあくまで一時的なものなので、.Delete
で忘れずに削除して後片付けをします。
まとめ
今回は、VBAでシェイプを画像ファイルとして保存する、少し高度なテクニックを解説しました。
- VBAにはシェイプを直接画像として保存する命令はない。
ChartObject
を一時的なキャンバスとして利用するのが定石。- 手順は「コピー → 一時グラフ作成 → (時間差) → 貼り付け → 書き出し → 削除」。
- コピーと貼り付けの間の時間差は
Application.OnTime
を使って確実にもうける。
一見複雑に見えますが、この一連の流れは非常に応用が効くテクニックです。レポート用の図を自動生成したり、マニュアル用の画像を量産したりと、様々な業務の自動化に役立ててみてください。