カテゴリー
VBA 仕事

キャプチャ画像の自動保存

クリップボード内を監視し、キャプチャ画像をエクセルに貼り付ける。

Option Explicit

Private Declare Function OpenClipboard Lib "user32" (Optional ByVal hwnd As Long = 0) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long

Public Sub AutoCapture()
'クリップボードを監視し、画像が取得されたらエクセルファイルに貼り付けてクリップボードをクリアする
'A1セルに任意の文字列を入力されたらループ処理を終了する
'B1セルに入力された数値+2行の次行から画像を貼り付ける

    Dim CB      As Variant  'クリップボード
    Dim SKey    As String   'セル入力値取得用
    Dim iLoop   As Integer  'ループ用カウンタ
    Dim OffsetY As Integer  '画像貼り付け位置
    Dim iHeight As Integer  '画像の高さ(行数)
    
    iHeight = 50    '取得画像の高さを50行に設定
    
    '開始メッセージの表示
    MsgBox "キャプチャの取り込みを開始します。" & vbCrLf & "終了するにはA1セルに文字入力して下さい。", vbInformation
    
    '無限ループの開始
    Do While True
        '終了リクエストを確認
        If Trim(ActiveSheet.Cells(1, 1).Value) <> "" Then GoTo QUIT_CAPTURE

        'クリップボードの取得
        CB = Application.ClipboardFormats
        '値が格納されていれば取り込み処理を行う
        If CB(1) <> -1 Then
            For iLoop = 1 To UBound(CB)
                '貼り付け対象はスクリーンショットのみ
                If CB(iLoop) = xlClipboardFormatBitmap Then
                    'アクティブシートから貼り付け位置の取得
                    SKey = ActiveSheet.Cells(1, 2).Value
                    If IsNumeric(SKey) Then
                        OffsetY = Int(SKey)
                    Else
                        OffsetY = 0     '初期値
                    End If
                    'スクリーンショットをアクティブシートに貼り付け
                    ActiveSheet.Paste Destination:=Range("A3").Offset(OffsetY, 0)
                    '次の画像の貼り付け位置を計算
                    OffsetY = OffsetY + iHeight
                    '貼り付け位置をアクティブシートに書き戻す
                    ActiveSheet.Cells(1, 2).Value = OffsetY
                    
                    'クリップボードをクリア
                    OpenClipboard
                    EmptyClipboard
                    CloseClipboard
                End If
            Next iLoop
        End If
        DoEvents
    Loop

QUIT_CAPTURE:
    'ループを抜ける処理
    MsgBox "キャプチャの取り込みを停止しました。", vbInformation
    ActiveSheet.Cells(1, 1).ClearContents

End Sub