サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

ワークシート上の図を画像ファイルとして保存【Excel/VBA/Windows】

Excel を使う理由

 サポンテは Excel で簡単な図を書くことがあります。

 なぜ Excel を使うか?普及率が群を抜いて高いためです。サポンテは色々な会社で仕事しましたが、いまのところ 100% の会社でインストールされています。アプリのインストールを制限されている環境でも、これだけは確実にインストールされています。Visio などのドローソフトを導入する費用がなかったり、自分で勝手にソフトをインストールできない環境に置かれても、Excel が導入されていない企業はありませんでした。

Excel で描いた図をイメージファイルとして出力したい

 書いた図を、PNG などに出力したいことが、しばしば発生します。

 ネットで調べると、方法はいろいろあります。

【Excel】表や図形を画像化して再利用したい! エクセルファイルから画像を取り出す時短テク - いまさら聞けないExcelの使い方講座 - 窓の杜

 サポンテは以前は「Web として保存し、<ファイル名.files> の中から png を探して抜き出す」という方法を採っていました。

 ただ、頻繁になるとめんどくさい。ワンクリックでやりたい。マクロでやりたい。

 これもまあ、ネットで調べると方法はありました。

【Excel/VBA】VBAでオブジェクトを画像として保存する方法 | サシミスタジオ

 満足できませんでした。結局、自分で作りました。後ほどソースを示します。

使い方

  1. A1 セルに、画像を出力したいパスを入力します。
  2. 同じワークシートに図形を描画します。
  3. マクロ「現在のワークシートの全ての図を画像ファイルとして保存()」を実行します。

VBA ソースコード

 PowerShell を使っているので、Windows 専用となります。

Option Explicit

Sub 現在のワークシートの全ての図を画像ファイルとして保存()
    Dim i as Long
    Dim shapeNames() As String
    Redim shapeNames(ActiveSheet.Shapes.Count)
    
    For i = 0 To ActiveSheet.Shapes.Count - 1
        shapeNames(i) = ActiveSheet.Shapes(i + 1).Name
    Next
    
    ActiveSheet.Shapes.Range(shapeNames).Select
    Selection.Copy
    
    Range("A1").Select
    ActiveSheet.PasteSpecial _
        Format:="図 (PNG)", _
        Link:=False, _
        DisplayAsIcon:=False
    Selection.Cut
    
    SaveClipboardImage
End Sub

Private Sub SaveClipboardImage()
    Dim objWSH As Object
    Dim cmd As String
    
    ' 保存パスが未入力なら処理をしない
    If ActiveSheet.Range("A1").Value = "" Then Exit Sub
    
    Set objWSH = CreateObject("WScript.Shell")
    cmd = "PowerShell -NoLogo -ExecutionPolicy RemoteSigned -Command " & _
        """$Image = Get-Clipboard -Format Image; " & _
        "$Image.Save(\""" & ActiveSheet.Range("A1").Value & "\"")"""
    
    objWSH.Run cmd, 1, True
End Sub

2022/11/05 更新

 最近、ファイルに出力する他に「クリップボードに格納してくれれば良い」という使い方をするようになりました。プライベートプロシージャの SaveClipboardImage() の最初で、「保存パスが未入力なら処理をしない」という判定を入れ、クリップボードに格納しただけで処理を終了するよう、上記のソースを更新しました。

注意事項

 A1 セルに入力されたパスに、同じ名称のファイルが存在していたら上書きします。サポンテの用途としてはそれが便利だったためです。

 クリップボードを経由して PowerShell で保存しています。マクロ実行後はクリップボードが書き換わります。

 上記のマクロは、エラー制御などの基本的な処理が実装されていません。個人で使うものなので割愛しました。

 もし使用する場合は、ご自身の用途に合わせて以下のような処理を追加してください。

  • A1 セルが空欄ではないか確認する
  • 上書きしてよいか、ユーザに尋ねる
  • 書き込み先にアクセス権はあるか確認する
  • 途中のパスは存在しているか確認する
  • ワークシート上にー Shapes は存在しているのか確認する