2022年03月21日
キー押下でスクショ
会社で使うExcel。いつの間にかExcelのために仕事をさせられていませんか?
Excelを使い倒して、仕事を楽にするツールにしちゃいましょう
この記事は、テスト結果を残すためスクリーンショットが必要な際、
他のツールを動かして、画面を出し、
スクリーンショットボタンを押して、
Excelに貼り付けて、、、
を延々と繰り返すテスト作業のうち、Excel貼り付けの部分だけを楽しようとする
自動化ツールの紹介です
なお、既に同じ記事があり、参考にさせていただきましたので、勝手にご紹介させていただきます
VBA スクリーンショットを撮るたびに自動でシートに張り付けるマクロ(t-hom's diaryさん)
Excelにエビデンスを張り付けるのを自動化した話。(Qiita @snaruse0608さん)
先人の方々に感謝です、ありがとうございます
- 1. VBAで効率化したい作業
- 2. どんな効果?
- 3. マクロ
- 4. マクロの使い方
- 5. サンプル
スクリーンショットのエビデンスが必要
仕様検討、設計、テスト仕様が終わり、いよいよテストとなったとき、
テスト結果をスクリーンショットで貼り付けるような作業が待っていたりします
WindowsのGUIは非常に便利ですが、開発したものを第三者に説明する資料として残す作業の中で
スクリーンショットをペタペタ貼る作業は本当に大変です
一旦、スクリーンショットだけでも楽にしましょう
なお、リグレッションテストなどのためにも、可能ならpyautoguiなどで
テストは自動化しておきたいところですが、Python環境がインストールができなかったりと、
難易度が高かったりしますので、VBAで処置します
- ツール実施中にスクショ記録のために画面切り替え(★改善)
'---------------------------------------------------------------------------------------------------
'
' マクロ: Excel以外のスクリーンショットを貼り続けます
'
' 動作のオンオフ:
' 他のウインドウを選択すると自動保存を開始します
' 再度エクセルをアクティブにすると終了します
'---------------------------------------------------------------------------------------------------
Option Explicit
#If Win64 Then
Declare PtrSafe Function OpenClipboard Lib "user32" (Optional ByVal hwnd As Long = 0) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long
#Else
Declare Function OpenClipboard Lib "user32" (Optional ByVal hwnd As Long = 0) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function GetForegroundWindow Lib "user32" () As Long
#End If
Const STARTPOS As String = "A5" ' 貼り付けセル開始位置
Const RANGEPOS As Long = 10 ' 画像貼り付け間隔
Sub スクリーンショットをExcelに貼り付ける()
Dim cb As Variant
Dim isLoop As Boolean
Dim OffsetY As Long
Dim i As Long
Dim thisHwnd As Long
Dim wkHwnd As Long
Dim ws As Worksheet
Dim shp As Shape
isLoop = True
OffsetY = 0
Set ws = ThisWorkbook.ActiveSheet
clearClipboard
thisHwnd = GetForegroundWindow
'シートに画像があったら削除する
If ws.Shapes.Count <> 0 Then
If MsgBox("シート内の画像を削除してもいいですか?", vbYesNo) <> vbYes Then
MsgBox "処理を中断します"
Exit Sub
End If
'シート内画像を削除
For Each shp In ws.Shapes
If shp.Type = msoPicture Then shp.Delete
Next shp
End If
MsgBox "スクショ自動貼り付けを開始します"
'ウインドウ切り替えを待つ
Do
wkHwnd = GetForegroundWindow
If wkHwnd = 0 Then
wkHwnd = thisHwnd
End If
Application.StatusBar = "ウインドウ切り替え待ち中(1/3)"
DoEvents
Loop While thisHwnd = wkHwnd
'PrintScreenを押されたらエクセルに保存していく
Application.StatusBar = "自動貼り付け中(2/3)"
Do While isLoop
cb = Application.ClipboardFormats
If cb(1) <> -1 Then
For i = 1 To UBound(cb)
If cb(i) = xlClipboardFormatBitmap Then
ws.Paste Destination:=ws.Range(STARTPOS).Offset(OffsetY, 0)
OffsetY = OffsetY + RANGEPOS
clearClipboard
End If
Next i
End If
wkHwnd = GetForegroundWindow
If thisHwnd = wkHwnd Then
isLoop = False
Application.StatusBar = "自動貼り付け終了(3/3)"
End If
DoEvents
Loop
MsgBox "自動貼り付けを終了します"
Application.StatusBar = False
End Sub
Private Sub clearClipboard()
'クリップボードを空にする。
OpenClipboard
EmptyClipboard
CloseClipboard
End Sub
マクロをExcelに組み込んでください
[スクリーンショットをExcelに貼り付ける]マクロを実行してください
Excelから画面を変更した後、スクリーンショットを記録始めます
A5セルから10行間隔にスクショを貼ります
Excelをアクティブにしたら、マクロは終了します
スクショした回数だけ、Excelに画像が貼られているかと思います
想定している使い方です
@[スクリーンショットをExcelに貼り付ける]マクロを実行します
A別ウインドウに移動し、PrintScreenボタンでスクショします
BExcel画面に戻るとマクロを終了します
CExcelに画像が並んでいますので、後は加工してください
以上となります。
この記事へのトラックバックURL
https://fanblogs.jp/tb/11319274
※ブログオーナーが承認したトラックバックのみ表示されます。