その他関連のテクニック

画面をキャプチャする

(Excel 97/2000/2002/2003/2007)
Excel 2010には、画面をキャプチャする機能があります。
Excelだけでなく、PowerPointやWordにも共通して追加された機能です。
あまり使い勝手の良い機能とは感じませんが、デスクトップの画面や他アプリケーションの画面を、ワンタッチでワークシートに挿入できます。

同じことを手作業で行うには、PrintScrnキーを押して画面をキャプチャしてから、ワークシートに切り替えて貼り付けを実行します。
これだけの操作なら、マクロでも実現可能なのではないでしょうか。
試しに、同じような機能のマクロを作成してみましょう。

まず、PrintScrnキーを押す動作は、SendKeysメソッドを使ってみます。
SendKeysメソッドは、任意のキーが押されたことにする命令です。
しかし、ヘルプでSendKeysメソッドを調べると、PrintScrnキーに対応する指定の方法が記載されていません。
{PrintScrn}や{PrtScrn}など、いくつかの文字を試してみましたが、うまくいきません。
もしかすると、対応していないのかもしれませんね。

こんなときは、Windows APIのkeybd_eventを使います。
keybd_eventは、VBAのSendKeysメソッドと同じように任意のキーが押されたことにする命令ですが、APIですから、さらに高機能です。
SendKeysでは対象外のWindowsキーなども操作可能です。

Keybd_eventを使うには、次のように宣言します。

Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _
                     ByVal bScan As Byte, _
                     ByVal dwFlags As Long, _
                     ByVal dwExtraInfo As Long)
どのキーを操作するかは、16進の数値で指定しますが、 一般的には、次のように定数を宣言して使います。
Const VK_SNAPSHOT = &H2C
また、keybd_eventでは、キーを"押す"操作と、"放す"操作を別々に指定しなければなりません。 それぞれの操作も、次のように定数を宣言します。
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
マクロのコードは、次のようになります。
Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _
                     ByVal bScan As Byte, _
                     ByVal dwFlags As Long, _
                     ByVal dwExtraInfo As Long)

Const VK_SNAPSHOT = &H2C    ''[PrintScrn]キー

Const KEYEVENTF_EXTENDEDKEY = &H1    ''キーを押す
Const KEYEVENTF_KEYUP = &H2          ''キーを放す

Sub Sample1()
  ''[PrintScrn]キーを押す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
  ''[PrintScrn]キーを放す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End Sub   
試してみると、どうやら成功のようです。 あとは、クリップボードにキャプチャした画像を貼り付けるだけです。 プロシージャ部分を、次のように変更しましょう。
Sub Sample1()
    ''[PrintScrn]キーを押す
    keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
    ''[PrintScrn]キーを放す
    keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    ActiveSheet.Paste
End Sub
このマクロは、VBEから実行するのではなく、ワークシートを開いた状態で実行してください。 Alt+[F8]キーを押して[マクロ]ダイアログボックスを開き、プロシージャを選択してから実行するといいでしょう。 実行すると、ワークシートの画像がアクティブシートに挿入されます。 しかし、マクロを実行するとただちにキャプチャが行われますので少々使い勝手が悪いです。 マクロを実行してから、キャプチャしたい画面に切り替えるまでのタイムラグを指定しましょう。 ここでは、5秒後にキャプチャすることにします。
Sub Sample1()
  Application.Wait Now + TimeSerial(0, 0, 5)
  ''[PrintScrn]キーを押す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
  ''[PrintScrn]キーを放す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
  AppActivate Application.Caption
  ActiveSheet.Paste
End Sub   
ApplicationオブジェクトのWaitメソッドは、指定した時刻までマクロを停止します。 この間に、キャプチャしたいアプリケーションに切り替えてください。 ただし、このままでは失敗することがあります。 最後のActiveSheet.Pasteは、Excelがアクティブになっていないとエラーになることがあるからです。 そこで、次のように、キャプチャが終了したらExcelをアクティブにします。
Sub Sample1()
  Application.Wait Now + TimeSerial(0, 0, 5)
  ''[PrintScrn]キーを押す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
  ''[PrintScrn]キーを放す
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
  AppActivate Application.Caption
  ActiveSheet.Paste
End Sub   
Excel 2010で追加された新機能のように、任意の範囲だけをキャプチャすることはできませんが、それは貼り付けてからトリミングすればいいでしょう。 とりあえず作ってみましたが、画面をキャプチャするのでしたら、専用のフリーソフトを使った方が1024倍便利です。 私がいつも使っているオススメは、WinShotです。 インターネットで検索すれば簡単に見つかりますので、ぜひお試しください。