自分の仕事は主にSESなので案件によってはテストでExcelにスクショを貼り付けて提出するということを未だにやってるところに当たることがある。
できればそういう作業はやりたくないのでツール化すればよいのだけど(本当はもっと有効なテストをしてスクショ貼りなんてものは法律で禁止してもいいと思ってる)
現状、やらざるをえないところはまだ多いです。
スクショの対象となるツールがブラウザだったり、他のアプリケーションだったりと様々なので完全に一般化することは難しいけど、だいたいこのやり方でできるのではないかということをやってみました。
そして、Excelマクロにした理由は
送信データの管理などもやりやすいこともあり本来の使い方ではないけれどもExcelを自動スクショ撮りツールにしてみました。
流れは
エビデンスを貼り付けるExcelを作成する
実行するツールを起動
何かしらのパラメータを入力項目に設定する
実行ボタンを押す
結果が出たらスクショをする
結果の内容に応じてスクロールして全体を貼り付ける
エビデンスのExcelを保存して終了
エビデンス用Excelの作成
フォーマットが決まっていればテンプレートを作ってそこに貼り付けて名前を付けて保存する方法が良いと思います。
実行ツールの起動
Dim excel As Workbook
Application.ScreenUpdating = False
Set excel = WOrkbooks.Open("template.xlsx")
Application.DisplayAlerts = False
excel.SaveAs "テスト結果.xlsx"
Application.DisplayAlerts = True
excel.Close
Application.ScreenUpdating = True
テスト用ツールの起動
Dim rc As Long
rc = Shell(テストツール, vbMaximizeFocus) ’最大化して起動する。rcはツールにフォーカスする時にこの値を使う
’ この時点ではツールにフォーカスされている。
’ SendKeys "{TAB}" タブ移動
’ SendKeys "{ENTER}" エンターキー押下
’ SendKeysでツール上の操作をしたり、Ctrl+AとCtrl+Cでテキストのコピペができたりする
’ 当然、SendKeysで送るのはツールだけでなくエビデンスのExcelにも送るのでフォーカスはExcelとツールを何度も往復することになる
’ Excelへは上記のコードで定義したexcelでexcel.Worksheets("シート名").cells(2,3) = クリップボードの値
AppActivate rc
SendKeys "%{F4}"
スクショの貼り付け
ここを参照して作りました。
ExcelVBAでスクリーンショットを取る方法 - Qiita
keybd_eventはOSの環境で64ビットか32ビットどちらかを使います。
まずはスクショを撮るためのサブルーチンを定義する。画面を最大化してあるが、ツールバーが入ると嫌なのでAlt+PrtScでツールだけをスクショする。
SendKeysでも送れるようだけども実際にやってみるとうまく行かなかったのでこちらを使いました。
ライブラリの呼び出しについてはここでは書かないので
Private Declare PtrSafe Sub keybd_event Lib "user32" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long _
)
Public Sub アクティブ画面を撮る()
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
これを組み合わせることで大体のスクショはとれるはず