【Excel VBA】図形(シェイプ)を画像ファイル(PNG/JPG)として保存する方法

Excelで作成した図形やフローチャートを、プレゼン資料やWebサイトで使いたいと思ったことはありませんか?手作業でスクリーンショットを撮ってトリミングするのは少し面倒です。VBAを使えば、特定のシェイプだけを高品質な画像ファイルとして、好きな場所に一瞬で保存することが可能です。

今回は、そのための少し応用的ながらも確実なテクニックを、コードの仕組みと共に詳しく解説します。


目次

なぜ直接エクスポートできないのか?

まず知っておくべきなのは、残念ながらVBAにはShape.ExportAsImage()のような、図形を直接画像として保存する簡単な命令が用意されていない、ということです。そのため、少し工夫を凝らした手順を踏む必要があります。


Chartオブジェクトを「一時的なキャンバス」として使う方法

直接保存ができないため、VBAではよくChart(グラフ)オブジェクトを「一時的なキャンバス」として利用するという手法が取られます。具体的な手順は以下の通りです。

  1. 対象のシェイプを画像としてクリップボードにコピーする (.CopyPicture)。
  2. 一時的な「真っ白なグラフ(Chartオブジェクト)」をシート上に作成する。
  3. そのグラフ(キャンバス)に、クリップボードの画像を貼り付ける (.Paste)。
  4. 画像が貼り付けられたグラフを、画像ファイルとして書き出す (.Export)。
  5. 役目を終えた一時的なグラフをシート上から削除する (.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 を使って確実にもうける。

一見複雑に見えますが、この一連の流れは非常に応用が効くテクニックです。レポート用の図を自動生成したり、マニュアル用の画像を量産したりと、様々な業務の自動化に役立ててみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次