クリップボードの画像を保存する方法!マクロで簡単実装!

クリップボードの画像を指定のフォルダへ保存したいときはないでしょうか。

けど、そんな中で悩むことは、

・クリップボードの画像を指定のフォルダへ保存したいが方法がよくわからない
・VBAでクリップボードの画像を保存したいが方法がよくわからない

ですよね。

今回はそんなお悩みを解決する

・VBAでクリップボードの画像を指定のフォルダへ保存する方法

についてまとめます!

VBAでクリップボードの画像を保存するイメージ

VBAでクリップボードの画像を保存するイメージについて説明をします。

画面キャプチャしてクリップボードに画像を一時保存します。

Excelに画面キャプチャの画像を保存したい場所、画像形式、ファイル名を指定します。

VBAを実行すると、クリップボードの画像がPNGやJpegなどの画像ファイルに変換され、指定の箇所に保存されます。

連続で画像を出力しても上書き保存されることなく、ファイル名がリネームされ画像ファイルが追加されていきます!

また画像形式を変えることもできます!

キャプチャ画像を瞬間にファイル化できるので便利ですね!

それでは早速試してみましょう。

VBAでクリップボードの画像を保存する

VBAでクリップボードの画像を保存する方法について説明をします。

設定値入力用のExcelシートを準備する

VBAでクリップボードの画像を保存するために必要な設定値を入力するExcelシートを用意しましょう。
B1セルに保存先となるパスを、B2に画像形式を、B3に出力ファイル名を指定していきます。

このリストにある画像形式に変換され、指定場所へ保存される形となります。

画像保存先フォルダを用意する

画像保存先となるフォルダを用意しましょう。

フォルダのパスは先ほどのExcelのB1シートへ入力します。

画像形式を指定する

画像形式を指定しましょう。以下の出力したい画像形式をB2セルへ入力します。

png
jpeg
gif

タカヒロ
タカヒロ
ここで設定する値はそのまま画像ファイルの拡張子にもなります。
例えば大文字「PNG」としたら、ファイル名は「〇〇〇.PNG」となります。

出力ファイル名を指定する

出力ファイル名を指定しましょう。重複する場合は頭に数字がファイル名の頭に自動入力されます。

〇〇〇.png
(1)〇〇〇.png
(2)〇〇〇.png

VBAコード

サンプルのVBAコードは以下の通りです。

Sub クリップボードの画像を保存する()
    
    Dim strSaveFilePath As String
    Dim strCommand As String
    Dim strImagePath As String
    Dim strFileName As String
    Dim strImageType As String
    Dim objWsh As Object
    Dim objClipboard As Variant
    Dim intEndrow As Integer
    Dim i As Integer
    
    'Wscript.Shellをオブジェクトにセットします。
    Set objWsh = CreateObject("WScript.Shell")

    'マクロ実装ブックの1シート目を対象にします。
    With ThisWorkbook.Worksheets(1)
        
        '保存先パスを取得します。
        strSaveFilePath = .Cells(1, 2)
        
        '画像タイプを取得します。
        strImageType = .Cells(2, 2)
        
        '画像ファイル名を取得します。
        strFileName = .Cells(3, 2)
        

        '画像ファイルのフルパスを作成します。ファイル名が重複していた場合は別のファイル名に変換されます。
        strImagePath = strSaveFilePath & "\" & fileNameDuplicateCheck(strSaveFilePath, strFileName & "." & strImageType)

        
        'PowerShellの画像生成コマンドを作成します。
        strCommand = "powershell "
        strCommand = strCommand + "Add-Type -AssemblyName System.Windows.Forms;$ImagePath = '" & strImagePath & "';  [Windows.Forms.Clipboard]::GetImage().Save($ImagePath, [System.Drawing.Imaging.ImageFormat]::" & strImageType & ")"

    End With
    
 
    objClipboard = Application.ClipboardFormats

    'クリップボードの内容を判定します。
    If objClipboard(1) = -1 Then
        MsgBox "クリップボードが空です。"
        
    'クリップボードの内容がビットマップ形式か判定します。
    ElseIf objClipboard(1) = xlClipboardFormatBitmap Then

        'コマンドを実行します。
        objWsh.Run Command:=strCommand, WindowStyle:=0, WaitOnReturn:=True
        
         MsgBox "キャプチャ画像の保存が完了しました。"
         
    Else
        
        MsgBox "クリップボードが画像以外であるため中断します。"
            
    End If


    'オブジェクトを開放します。
    Set objWsh = Nothing
    Set objClipboard = Nothing
    
End Sub


'ファイル名重複チェック関数です。重複していたら別のファイル名を返します。
Function fileNameDuplicateCheck(fncPath As String, fncFileName As String)
    
    Dim fnFullPath
    Dim j As Integer
    fncFullPath = fncPath & "\" & fncFileName
    fncFileNameNext = fncFileName
    
    'フルパスが存在しない場合のみファイルを書き出します。
    If Dir(fncPath & "\" & fncFileName) <> "" Then
        j = 1

        '重複していたら保存ファイル名の先頭に(**)をつけます。
        Do While Dir(fncPath & "\" & fncFileNameNext) <> ""
            fncFileNameNext = "(" & j & ")" & fncFileName
            j = j + 1
        Loop

    End If

    'ファイル名を返します。
    fileNameDuplicateCheck = fncFileNameNext

End Function

VBAを設定する

マクロ実装ブックの1シート目を対象にします。シート名を指定したい場合はシート番号「1」をシート名に変更してください。

With ThisWorkbook.Worksheets(1)

保存先パスを取得します。参照先のセルの位置を変える場合はこちらを変更してください。

strSaveFilePath = .Cells(1, 2)

画像タイプを取得します。参照先のセルの位置を変える場合はこちらを変更してください。

strImageType = .Cells(2, 2)

画像ファイル名を取得します。参照先のセルの位置を変える場合はこちらを変更してください。

strFileName = .Cells(3, 2)

VBAの実装

VBAの実装方法については
VBAの実装手順
をご参照ください。

VBAを実行する

[PrtSc]ボタンなどで画面キャプチャをした上、VBAを実行してみましょう。

画面キャプチャが画像に変換され、指定のパスに格納されていますね!

ファイル名重複時に別名になっているか確認

何度か繰り返してファイル名の重複がされていないか確認してみましょう。

ファイル名が重複されている場合は別の名前に置き換わっていることがわかりますね!

画像形式を変えて確認する

画像の形式をpngからjpeg形式に変更して、その形式になっているか確認をしてみましょう。

jpeg形式で変換されていますね!

gif形式も問題ありません!

GIF形式2個目もファイル名が変換され重複が回避できていますね。

VBAの説明

VBAについて説明をします。

画像ファイルのフルパスを作成します。ファイル名が重複していた場合は別のファイル名に変換されます。

strImagePath = strSaveFilePath & "\" & fileNameDuplicateCheck(strSaveFilePath, strFileName & "." & strImageType)

PowerShellの画像生成コマンドを作成します。

strCommand = "powershell "

PowerShellのコード本体となります。

Windows.Forms.Clipboardを対象にGetImageメソッドでイメージを取得し、Saveメソッドで指定形式で指定パスへ保存していきます。

strCommand = strCommand + "Add-Type -AssemblyName System.Windows.Forms; [Windows.Forms.Clipboard]::GetImage().Save('" & strImagePath & "', [System.Drawing.Imaging.ImageFormat]::" & strImageType & ")"

ファイル名重複チェック関数です。重複していたら別のファイル名を返します。

Function fileNameDuplicateCheck(fncPath As String, fncFileName As String)

Dir関数で存在確認し、フルパスが存在しない場合のみファイルを書き出します。

If Dir(fncPath & "\" & fncFileName) <> "" Then

重複していたら保存ファイル名の先頭に(**)をつけます。

Do While Dir(fncPath & "\" & fncFileNameNext) <> "" fncFileNameNext = "(" & j & ")" & fncFileName

ファイル名を返します。

fileNameDuplicateCheck = fncFileNameNext

VBAの実装手順

実装手順は以下の通りです。

Excel側にVBAを実装していきます。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。

さいごに

いかがでしょうか。

今回は、

・VBAでクリップボードの画像を指定のフォルダへ保存する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。





タカヒロ

ドラッカーの名言「強みを生かす」の自分の「強み」をツールでサクッと診断してみました。

結果は意外でした…

ストレングスファインダー診断結果公開!NGな点もまとめ!




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です