サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

Excel のスクリーンショット機能で Edge のウィンドウを選ぶと真っ黒になる 【VBA】【Windows】

はじめに

 この記事の内容は、Windows 専用です。macOSExcel を持っていないため、同様の不具合が発生しているのか、そもそも確認できていません。

問題

 Google 検索 で「excel スクリーンショット edge」と入力すると「真っ黒」というサジェストが出ます。そこそこ困っている人が多いようです。

 これはセキュリティのためですが、Edge の画面をスクリーンショットに撮って Excel に貼り付けるという要件は少なくありません。

 Excel にはスクリーンショットを簡単に挿入する機能がありますが、一部のアプリ、例えば Web ブラウザの Microsoft Edge などでは、その機能を使うと真っ黒のイメージが貼り付けられます。使えません。他の手段でスクリーンショットを撮ることはできるのですが、手順が多くて面倒です。

他の手段でスクリーンショットを撮る

 他の手段は、以下の通りです。

  1. Edge をアクティブにする
  2. Alt + PrintScreen キーを押す(スクリーンショットイメージがクリップボードに入る)
  3. Excel に戻る
  4. Ctrl + V キーを押す(ペースト)

VBA で解決

 以上の手順を、VBA で自動実行するようにします。

 「個人用マクロブック」に「標準モジュール」を追加して、以下のコードを貼り付けてください。

 部分的に赤字になるかもしれませんが、大丈夫、実行できます。

Optional Explicit

Private ws As Worksheet

#If Win64 Then
    ' 64bit 用
    Private Declare PrtSafe Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long _
            )
    Private Declare PrtSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    ' 32bit 用
    Private Declare Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long _
            )
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Public Sub アクティブ画面を撮って貼付ける()
    On Error GoTo ERR_EXIT
    Set ws = ActiveSheet
    Application.Visible = False
    Application.OnTime Now + TimeValue("00:00:01"), "PrintScreenActiveWindowAndPaste"
    ' 少し待っているのは、Excel を非表示にした瞬間に Tooltip などが残る可能性があるため。
ERR_EXIT:
    Application.Visible = True
End Sub

Private Sub PrintScreenActiveWindow()
    keybd_event &HA4, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
    keybd_event &HA4, 0&, &H1 Or &H2, 0&
End Sub

Private Sub PrintScreenActiveWindowAndPaste()
    PrintScreenActiveWindow
    DoEvents
    Sleep 75
    DoEvents
    Application.Visible = True
    ws.Activate
    Set ws = Nothing
    ActiveSheet.Paste
End Sub

リボンに登録する

 上記で作成したマクロをリボンに登録します。登録するマクロは「アクティブ画面を撮って貼付ける」です。

マクロの使い方

 設定は以上です。リボンに追加したボタンをクリックすると、マクロが実行されます。

 マクロは以下のように動作します。

  1. Excel を非表示にする
  2. Alt + PrintScreen キーを押す(のと同じことをマクロでやる)
  3. Excel に戻る
  4. 現在のシートにペーストする

 したがって、Excel が非表示になったときに Edge が最前面になっていれば、期待通りスクリーンショットが撮れます。

注意点

  • クリップボードを経由するため、内容を書き換えます
  • Excel が非表示になったときに Edge が最前面に来るように作業してください
  • Edge 以外でも使えます