セル範囲を画像ファイルとして保存

セル範囲をPNG画像として保存する方法です

'選択範囲をクリップボードにコピー
Selection.CopyPicture

Dim グラフ範囲 As ChartObject, ファイルサイズ As Long
'空白のグラフ範囲を新規作成する、サイズは選択範囲と同じサイズにする
Set グラフ範囲 = ActiveSheet.ChartObjects.Add(0, 0, Selection.Width, Selection.Height)
'空白のグラフ範囲を画像ファイルとして保存
グラフ範囲.chart.Export ThisWorkbook.Path & "\セル範囲画像.png"
'そのファイルのサイズを整数変数に取得
ファイルサイズ = FileLen(ThisWorkbook.Path & "\セル範囲画像.png")
'空白のファイルサイズを超えるまでループする
Do Until FileLen(ThisWorkbook.Path & "\セル範囲画像.png") > ファイルサイズ
'クリップボードにコピーしたセル範囲画像を貼り付け
グラフ範囲.chart.Paste
'貼り付けしたグラフ範囲を画像ファイルとして保存
グラフ範囲.chart.Export ThisWorkbook.Path & "\セル範囲画像.png"
'CPUの解放
DoEvents
Loop
'作成が完了したらグラフ範囲は削除して解放
グラフ範囲.Delete
Set グラフ範囲 = Nothing

Excelのワークシート上で綺麗に仕上げたセル範囲が完成しました
整然と並んだデータ群と、目に優しい柔らかな配色
見やすさを考え抜いた文字種とサイズ
生データのままではなく、見やすく入力しやすくした表示形式

はい、画像として保存しておきたいですよね?
ただのコピペじゃ、貼り付けられない表現力を遺憾無く見せつけられるのが画像化です

画像保存したいExcelの表範囲
生成前のセル範囲

コードを使用してデータのある範囲を画像として保存してみます

実際に画像として保存されたセル範囲画像
コードで生成された画像

この画像はスクショではありません、コードを実行して保存した画像です
指定範囲を切り取り作業無しで保存できます
このピッタリのセル範囲画像の気持ちよさは、思わず職場のPCのデスクトップ背景に設定してしまうのではないでしょうか

そうですね、言いたいことは分かります
最初にあれだけ書式設定をがんばって作ったとか言ってたのに、例画像がまったく頑張ってへん!というのは心にしまっておいてください

コード解説

程よく脱線というか、そもそも入線すらしてなかったところで、コード解説です

先に大まかな処理の流れを解説します

まず、セル範囲を画像として保存するにはその範囲をスクショ的なことをします
ただ、それを画像ファイルにする事は直接出来ないため、それが可能なグラフ範囲を使用します
このグラフ範囲にスクショ的なやつを貼りつけて、それを画像として保存します

'選択範囲をクリップボードにコピー
Selection.CopyPicture

まずは、セル範囲をスクショ的なやつします
それが、このCopyPictureメソッドです

このメソッドは、セル範囲をクリップボードに画像として取得します
なので、このまま他の場所にペーストすれば画像を貼り付けられます

今回はファイル保存なので、後に続きます

Dim グラフ範囲 As ChartObject, ファイルサイズ As Long

ここで使用する変数の宣言です
この処理で使用する変数は2つです

1つ目はグラフ範囲を取得するObject型の変数です
固有の型指定としてChartObject型を指定します
これはグラフ範囲のObjectです、この中に実際のグラフ範囲やタイトル範囲などのObjectがあります
その一部にコピーした画像を貼り付けます

と、いうのもクリップボードにコピーした画像をファイルとして保存するメソッドはありません
これをどこかに貼り付けてファイル保存する必要があり、それが可能なのがグラフ範囲になります

なので、作成後もいろいろ操作をするので変数に取得させておくほうが便利です

2つ目の変数はファイルサイズの整数値を取得させる変数です
この利用理由は後述します

'空白のグラフ範囲を新規作成する、サイズは選択範囲と同じサイズにする
Set グラフ範囲 = ActiveSheet.ChartObjects.Add(0, 0, Selection.Width, Selection.Height)

グラフ範囲を作成します
ここで作成されるグラフは何もない真っ白なグラフ範囲になります

グラフの作成にはChartObjects.Addメソッドを使用します
引数は、作成する位置と大きさのサイズになります

最初の2つが位置設定になりますが、この処理では位置はどこになっていても関係ないので「0」を指定します

後半の2つの設定が、サイズ設定になります
ここでは選択範囲と同じサイズにする必要がありますので、Selectionに対する高さと横幅を指定するようにします

これで、選択範囲と同じサイズのグラフ範囲が完成します
完成と同時に、その作成されたグラフを変数に代入します
これ以降は、この変数名でグラフを操作します

'空白のグラフ範囲を画像ファイルとして保存
グラフ範囲.chart.Export ThisWorkbook.Path & "\セル範囲画像.png"

まずは、クリップボードの画像を貼り付けする前に空白のグラフを画像として保存します

chart.Exportメソッドを使用することで、グラフ範囲を画像として保存することができます
引数には保存パスを絶対パスで指定します、この時にファイルの拡張子まで指定しますが他の画像拡張子も利用可能ですが、その場合は2つ目に省略された引数FilterNameを対応するものに変更します
ここでは、省略していますが省略した場合はPNGが指定されます

これは、後で必要になる手順の準備です

'そのファイルのサイズを整数変数に取得
ファイルサイズ = FileLen(ThisWorkbook.Path & "\セル範囲画像.png")

上で作成した空白の画像ファイルのサイズを整数値で取得します
ファイルサイズの取得にはFileLen関数を使用します
引数に指定されたファイルのサイズが整数値で返されますので、それを変数に取得します

これは、この処理自体の問題点に起因します
この処理では選択範囲をクリップボードに貼り付ける際、クリップボードの処理がVBAでは行っていないため、VBAで後述の貼り付け操作をする際にクリップボードが更新されておらず、真っ白なまま画像として保存されてしまいます

時間での待ちでも構わないのですが、貼り付けたいセル範囲が大きな場合その時間が不足する場合があります
そこで、空白のファイルサイズを取得しておき画像を貼り付けたファイルサイズと比較することでしっかり貼り付けられたことを認識することができます

空白の画像ファイルは小さいし、画像が貼り付けられれば間違いなくこの空白の画像よりサイズが大きくなります
逆になることは確実にあり得ませんし、画像が貼り付けられても同じサイズということもあり得ません

この方法なら、小さい画像であれば無駄な待ち時間も発生しないのもいいね

'空白のファイルサイズを超えるまでループする
Do Until FileLen(ThisWorkbook.Path & "\セル範囲画像.png") > ファイルサイズ
・・・
Loop

上記でくどくど説明した、ファイルサイズを比較している部分です
このDoループは空白のファイルサイズと改めて保存された画像ファイルのサイズを比較して、新たに保存された画像ファイルの方がファイルサイズが大きければ処理を終了します

間違いなく最初に1回は実行されます

'クリップボードにコピーしたセル範囲画像を貼り付け
グラフ範囲.chart.Paste

ファイルサイズが超えていなければ、クリップボードのデータを貼り付けします
この時点でグラフ範囲にセル範囲画像が貼り付けられます

上記にもあるように、クリップボードの処理が追い付いていない場合はこの時点でも空白のグラフ範囲になる場合があります

'貼り付けしたグラフ範囲を画像ファイルとして保存
グラフ範囲.chart.Export ThisWorkbook.Path & "\セル範囲画像.png"

グラフ範囲を改めてここで保存しなおします
同名のファイルがあった場合は自動的に上書きされるので、メッセージの抑止は不要です

というか、その点は無条件上書きなので注意が必要です

'CPUの解放
DoEvents

貼り付けがうまくいかない時は、クリップボードの処理が追い付いてない時になりますので、それを処理してもらうためにここでDoEvents関数でCPUを解放しています

'作成が完了したらグラフ範囲は削除して解放
グラフ範囲.Delete
Set グラフ範囲 = Nothing

ループを抜けたということは、しっかり画像が貼り付けられた画像ファイルが生成されたことを意味します
なので、不要になったグラフ範囲を削除します
変数の参照も解放しておきましょう

では、記事コードで本気の書式設定セル範囲を画像保存してくださいね!