Excel VBA 逆引き集 | 画面キャプチャ

Excel VBA
スポンサーリンク

ねらい:Excelで「画面キャプチャ」を安定して撮り、PNGに保存する

画面キャプチャは、報告画像の作成、エビデンス保存、手順書の作成などに直結します。VBAでは「範囲やグラフを画像としてコピー→PNGへExport」が最も安定です。Excel外(デスクトップ/アクティブウィンドウ)のキャプチャは、クリップボード経由で貼り付けてから保存するのが初心者にも扱いやすい流れです。ここでは、貼ってすぐ動くテンプレートを「範囲キャプチャ」「シート可視領域キャプチャ」「アクティブウィンドウ/画面キャプチャ」の順で示し、重要な注意点をかみ砕いて解説します。


範囲キャプチャ:選択や任意のRangeを画像としてPNG保存

使いどころと考え方

  • 対象がワークシートの範囲なら、Range.CopyPictureで画像化→Chart貼り付け→Chart.Exportが最短で堅牢。
  • 文字や罫線、条件付き書式も見た目のまま撮れます。単位や行列幅は“画面表示そのまま”になります。

例題:選択範囲を画像にして保存(PNG)

' ModCaptureRange.bas
Option Explicit

Public Sub SaveSelectionAsPng(ByVal outPath As String)
    Dim rng As Range: Set rng = Selection
    If rng Is Nothing Then MsgBox "範囲を選択してください。", vbExclamation: Exit Sub

    ' 画面見た目でコピー(xlScreen)、画像として(xlPicture)
    rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture

    ' 一時チャートへ貼り付けてPNGに出力
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim co As ChartObject
    Set co = ws.ChartObjects.Add(Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.Height)
    co.Chart.Paste
    co.Chart.Export Filename:=outPath, FilterName:="PNG"
    co.Delete

    MsgBox "保存しました: " & outPath, vbInformation
End Sub
VB

重要ポイントの深掘り

  • CopyPictureは「見た目」で撮るため、列幅やセルの結合、改行も忠実です。印刷見た目(xlPrinter)も選べますが、画面とズレやすいので通常はxlScreenを使います。
  • Chart.ExportはPNG/JPG/GIFに対応。PNGが文字・線に強く、報告用途に最適です。
  • 大きすぎる範囲は画像が粗く感じる場合があります。必要に応じて分割キャプチャやズーム調整も検討してください。

シート可視領域キャプチャ:表示中のスクリーンショットを取る

使いどころと考え方

  • シートの“見えている部分”を一発で撮りたい時は、ウィンドウの表示領域を図形化して保存します。
  • 完全な「画面」ではなく、Excelの表示領域中心。手元の見えている状態をそのまま残せます。

例題:現在表示中の領域を画像にして保存

' ModCaptureViewport.bas
Option Explicit

Public Sub SaveViewportAsPng(ByVal outPath As String)
    ' 画面強制更新(見えている内容を最新化)
    Application.ScreenUpdating = True

    ' シートの描画を画像化(Shapes.AddPictureではなく、CopyPictureでスクロール位置を反映させる)
    Dim rng As Range
    Set rng = ActiveWindow.VisibleRange ' 現在の表示範囲
    rng.CopyPicture xlScreen, xlPicture

    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim co As ChartObject
    Set co = ws.ChartObjects.Add(Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.Height)
    co.Chart.Paste
    co.Chart.Export Filename:=outPath, FilterName:="PNG"
    co.Delete

    MsgBox "保存しました: " & outPath, vbInformation
End Sub
VB

重要ポイントの深掘り

  • ActiveWindow.VisibleRangeは「今見えているセル範囲」を返します。シートのズームやスクロール位置も反映されます。
  • UIを固めないため、ScreenUpdatingをオフにしすぎないのがコツ。キャプチャ直前に更新を許可するとズレが減ります。

アクティブウィンドウ/画面全体キャプチャ:クリップボード経由でPNG保存

使いどころと考え方

  • Excel以外のウィンドウ(ブラウザや他アプリ)のスクリーンショットを撮る場合は、キーボードイベント(PrintScreen/Alt+PrintScreen)でクリップボードへ画像を入れ、Excelへ貼って保存します。
  • Win32 APIでキー送出→クリップボードからPaste→Chart.Exportの流れ。VBAだけで完結し、導入が容易です。

例題:アクティブウィンドウをキャプチャして保存(Alt+PrintScreen)

' ModCaptureActiveWindow.bas
Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
#Else
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Private Const VK_MENU As Byte = &H12   ' Alt
Private Const VK_SNAPSHOT As Byte = &H2C ' PrintScreen
Private Const KEYEVENTF_KEYUP As Long = &H2

Public Sub SaveActiveWindowAsPng(ByVal outPath As String)
    ' Alt+PrintScreen を送る(アクティブウィンドウのスクリーンショットがクリップボードへ)
    keybd_event VK_MENU, 0, 0, 0
    keybd_event VK_SNAPSHOT, 0, 0, 0
    keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0

    ' 少し待機(画像がクリップボードへ入るのを待つ)
    Application.Wait Now + TimeValue("0:00:01")

    ' クリップボードの画像をChartへ貼り付けてPNG出力
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim co As ChartObject
    Set co = ws.ChartObjects.Add(Left:=10, Top:=10, Width:=400, Height:=300)
    On Error Resume Next
    co.Chart.Paste
    On Error GoTo 0

    co.Chart.Export Filename:=outPath, FilterName:="PNG"
    co.Delete

    MsgBox "保存しました: " & outPath, vbInformation
End Sub
VB

例題:画面全体をキャプチャして保存(PrintScreen)

' ModCaptureDesktop.bas
Option Explicit

Public Sub SaveDesktopAsPng(ByVal outPath As String)
    ' PrintScreen(全画面)を送る
    keybd_event VK_SNAPSHOT, 0, 0, 0
    keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0

    Application.Wait Now + TimeValue("0:00:01")

    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim co As ChartObject
    Set co = ws.ChartObjects.Add(Left:=10, Top:=10, Width:=800, Height:=600)
    On Error Resume Next
    co.Chart.Paste
    On Error GoTo 0

    co.Chart.Export Filename:=outPath, FilterName:="PNG"
    co.Delete

    MsgBox "保存しました: " & outPath, vbInformation
End Sub
VB

重要ポイントの深掘り

  • クリップボードに画像が乗るまで“短い待機”が必要です。1秒前後が目安。PC負荷によっては少し延ばしてください。
  • Chart.Pasteは「クリップボードが画像」である前提。貼り付け失敗時はクリップボードの内容を確認(前段のキー送出やフォーカス)してください。
  • この方法は“見えているもの”を撮るため、非表示ウィンドウや背面のウィンドウは撮れません。撮りたいウィンドウを前面化してから実行します。

印刷見た目のキャプチャ:ページ単位でPDF画像を作る考え方

使いどころと考え方

  • 報告書や帳票の「印刷ページ見た目」を画像化したい場合、まずPDFにExportAsFixedFormat→PNGへ変換が精度高いです。
  • PNG変換はPowerShellや外部ツール(ImageMagickなど)に委譲するのが実務的。VBA単体でGDI+を使うより安定します。

例題:シートをPDF出力→後段でPNG化(外部へ委譲の設計)

' ModExportPdf.bas
Option Explicit

Public Sub ExportSheetToPdf(ByVal outPdf As String)
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=outPdf, OpenAfterPublish:=False
    MsgBox "PDF出力しました: " & outPdf
    ' ここからPowerShell等でPNGへ変換するのが実務向き
End Sub
VB

重要ポイントの深掘り

  • 印刷見た目は「ページレイアウト・余白・改ページ」に依存します。PageSetupを調整してからPDF→PNGにすると、最終見た目が安定します。
  • 画像化の精度は“印刷エンジン→PDF→画像化”が最も再現性が高いです。範囲→画像は画面ズームの影響を受けます。

共通枠と安定運用のコツ

開始・終了枠で“戻る安心”を確保する

' ModApp.bas
Option Explicit
Public Sub AppEnter(Optional ByVal status As String = "")
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    If Len(status) > 0 Then Application.StatusBar = status
End Sub
Public Sub AppLeave()
    Application.StatusBar = False
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
VB
  • キャプチャ直前はScreenUpdating=Trueに戻して画面を最新化する場面もあります。見た目優先なら“直前の更新→キャプチャ→終了枠”の順で。

重要ポイントの深掘り

  • 待機の入れ方が品質に直結します。クリップボード経由のキャプチャは「キー送出→短い待機→Paste→Export」が基本形。
  • 画像保存先は書き込み権限のあるローカルフォルダに。ネットワークドライブは遅延で失敗しやすいので、まずローカルに書いてから移動すると堅牢です。

例題の通し方と確認ポイント

手順

  • SaveSelectionAsPngで選択範囲の画像保存を試す(小さな範囲から)。
  • SaveViewportAsPngで見えている領域を保存。ズームやスクロールで結果が変わることを確認。
  • SaveActiveWindowAsPngで他アプリを前面に出して保存。失敗時は待機時間と前面化を調整。
  • ExportSheetToPdfで印刷見た目のPDFを作成。PageSetupを微調整して完成度を上げる。

確認ポイント

  • 文字潰れや線の太さ:PNGの方が綺麗。JPGは劣化しやすい。
  • 余白やサイズ:必要に応じてChartObjectのWidth/Heightを調整。出力画像のピクセルサイズに影響します。
  • 失敗時の復帰:エラーになってもExcelの操作性が戻る(開始・終了枠が効いている)ことを必ず確認。

落とし穴と対策(深掘り)

クリップボード競合

他アプリがクリップボードを占有することがあります。待機を少し伸ばす、キャプチャ前に不要なアプリを閉じると改善します。

画面ズームの影響

CopyPictureは“見た目”依存。ズームを100%にしてからキャプチャすると、文字のにじみが減ります。

大きな範囲での劣化

巨大範囲は1枚の画像にすると解像度不足になりがち。分割保存や、PDF経由での画像化に切り替えると綺麗に仕上がります。

アクティブウィンドウの特定

Alt+PrintScreenは“最前面のウィンドウ”のみ。撮りたいウィンドウを必ず前面にし、通知やダイアログが被らない環境で実行してください。


まとめ:範囲はCopyPicture→Export、画面はPrintScreen→Paste→Exportが王道

  • 範囲や表示領域:CopyPictureで画像化→Chart.ExportでPNG保存。速くて壊れにくい。
  • 他アプリや画面全体:PrintScreen(Altあり)→クリップボード→Chart.Paste→Exportで扱う。待機が鍵。
  • 印刷見た目:PDF出力→必要に応じて外部でPNG化。完成度が高い。

タイトルとURLをコピーしました