クリップボードの画像を指定のフォルダへ保存したいときはないでしょうか。
けど、そんな中で悩むことは、
・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」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
さいごに
いかがでしょうか。
今回は、
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す