VBAでスクリーンキャプチャ(画面キャプチャ) keybd_event版

keybd_eventというAPIを利用。

ただOSからのイベントになるようなので、マクロが動いてる最中だとキーイベントが通らなくてキャプチャ失敗ということがよくある。

DoEventsやSleepでごまかしながらやってみる必要あり。

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
    ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_LMENU As Long = &HA4
Private Const KEYEVENTF_EXTENDEDKEY As Long = &H1
Private Const KEYEVENTF_KEYUP As Long = &H2
Private Const fKEYDOWN = KEYEVENTF_EXTENDEDKEY
Private Const fKEYUP = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP


' 現在のスクリーンキャプチャ画像を,特定のシートに貼り付けます。
Sub my_cap(sheet_name)
    ' シート内の全画像を削除
    Sheets(sheet_name).Activate
    For Each pic In ActiveSheet.Pictures
        pic.Delete
    Next

    ' キャプチャ実行
    keybd_event VK_LMENU, 0&, fKEYDOWN, 0& 'Altキーを押す
    keybd_event vbKeySnapshot, 0&, fKEYDOWN, 0&
    keybd_event vbKeySnapshot, 0&, fKEYUP, 0&
    keybd_event VK_LMENU, 0&, fKEYUP, 0& 'Altキーを離す
    
    '貼り付け処理
    Sheets(sheet_name).Activate
    Range("A1").Select
        'SendKeys "+(^V)", True
    ActiveSheet.Paste

End Sub

' PrintScreenの自動実行について
' http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9d342.html

ネタ元