Excel を使う理由
サポンテは Excel で簡単な図を書くことがあります。
なぜ Excel を使うか?普及率が群を抜いて高いためです。サポンテは色々な会社で仕事しましたが、いまのところ 100% の会社でインストールされています。アプリのインストールを制限されている環境でも、これだけは確実にインストールされています。Visio などのドローソフトを導入する費用がなかったり、自分で勝手にソフトをインストールできない環境に置かれても、Excel が導入されていない企業はありませんでした。
Excel で描いた図をイメージファイルとして出力したい
書いた図を、PNG などに出力したいことが、しばしば発生します。
ネットで調べると、方法はいろいろあります。
【Excel】表や図形を画像化して再利用したい! エクセルファイルから画像を取り出す時短テク - いまさら聞けないExcelの使い方講座 - 窓の杜
サポンテは以前は「Web として保存し、<ファイル名.files> の中から png を探して抜き出す」という方法を採っていました。
ただ、頻繁になるとめんどくさい。ワンクリックでやりたい。マクロでやりたい。
これもまあ、ネットで調べると方法はありました。
【Excel/VBA】VBAでオブジェクトを画像として保存する方法 | サシミスタジオ
満足できませんでした。結局、自分で作りました。後ほどソースを示します。
使い方
- A1 セルに、画像を出力したいパスを入力します。
- 同じワークシートに図形を描画します。
- マクロ「現在のワークシートの全ての図を画像ファイルとして保存()」を実行します。
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 は存在しているのか確認する