Excelスクショについての私見

# Excelスクショについての私見
**<font color="red">この文章はカビの生えた文章なので新規性はありません。</font>**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">琴葉姉妹のよくわからないIT用語講座～Excelスクショ <a href="https://t.co/8U8UFGmweh">https://t.co/8U8UFGmweh</a> <a href="https://twitter.com/hashtag/sm37006794?src=hash&amp;ref_src=twsrc%5Etfw">#sm37006794</a> <a href="https://twitter.com/hashtag/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BB?src=hash&amp;ref_src=twsrc%5Etfw">#ニコニコ動画</a></p>&mdash; mima_ita (@mima_ita) <a href="https://twitter.com/mima_ita/status/1270656119136894977?ref_src=twsrc%5Etfw">June 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Excelスクショとは
Excelスクショとはテストや運用時にGUIの操作中に表示された内容を画像としてExcelに張り付けて保管することです。
Excelにスクリーンショットを張り付ける。略してExcelスクショと呼ばれています。

Excelスクショはテスト仕様書または操作手順書に書かれた手順を遵守して操作したかを後から確認するために利用されます。
また、トラブルが発生した際に、その原因を探るときの材料としても利用されています。

## よくある議論
### 操作手順書が存在し、その操作どおり行われていることが担保できれば不要ではないか
たとえば、複数人で確認しながら操作した場合に、さらにスクリーンショットまで保存する必要があるかという議題です。

これについては、私は一定規模のプロジェクトにおいては必須という立場です。

仮に、その時、完全で完璧な操作をしたと確証できたとしても、後から問題が出た際に当時何をしたかを思い出すのは困難です。
（というより当時の人が存在しない）

おそらく、この辺りは規模が大きく寿命の長いシステムで開発や障害対応を行った人ほど、スクリーンショットのありがたみがよくわかっているはずです。
逆にその経験が少ない人は、スクリーンショットの価値を評価しないあるいは過小に見積もる傾向が強いです。

## Excelに張り付ける必要があるのか
たとえば、フォルダを適切に作成して、ファイルとして保存しておくだけでいいのではないでしょうか。

Excel貼り付け派の主要な意見としては以下の通りです。
 
 -  印刷用体裁を整えることができる。
 -  何を確認したかを、オートシェイプで注釈として記載することができる
(例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/35dc0abe-583f-b4e1-d9b7-8c10be279f8c.png)


ファイルのみ派の意見としては以下の通りです。

 - ファイルに保存しただけの方が作業負荷を軽くすることができる。
 - オートシェープに書いた文字は検索で引っかからないから費用対効果が悪い
 - 作業中にExcelを常時起動していていいのか。
  - テスト対象に関係のないアプリケーションを起動していいのか。
  - テスト対象がExcelのCOMを使用している場合、Excelを起動していることでテスト結果が変わる可能性はないのか。


私の意見としては、ファイルに保存しておいて、必要に応じてExcelに出力すればいいだけと考えています。
簡単なものならば、VBSとPowerShellだけで実装できます。

![excelss1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/b9382080-3337-fc2f-f0e2-44ad6c26808f.gif)
https://github.com/mima3/excel_ss/tree/master/image_to_xls

### 動画で保存してはどうか
たとえば[ScreenToGif](https://www.screentogif.com/)等を利用して操作を動画として記録してはどうかという議論です。

動画としてエビデンスを残す場合は以下のハードルを越える必要があるでしょう。

 - 撮影の負荷がテストや運用に影響しないか
    - 通常にテストする場合よりメモリやディスクを多く使用しているが、それがテストや運用に悪影響を与えないか検討する必要がある
 - ファイルサイズの問題。
    - 静止画よりファイルサイズが増えるが証跡を保存するサーバーの容量に問題はないか。
 - 特定のタイミングの指定方法の問題
    - 特定のタイミングのスクリーンショットを指し示す場合、静止画の場合はファイル名で済んだが、動画になると、どのタイミングであるか指定する必要がある。
 - 画像に注釈をいれる必要がでたときにどうするか

なお、Windows10ではWin+Gキーで指定のウィンドウの操作をキャプチャして動画として保存できますが、ポップアップなどの指定したウィンドウ以外の情報が取れないようなので使いどころは少ないと思われます。

### スクリーンを監視して自動で画像を取得できないか？
スクリーンを監視して変化があったら画面の表示内容を保存することは外部ツールを使用できれば可能です。

**SikuliXによるスクリーンショット(苦行)の効率化について**
https://qiita.com/mima_ita/items/3801b0a7e4bfde34a6fa


なお、単純な時間指定で定期的にスクリーンショットを撮り続ける方法は、重要な画像を取り損ねる可能性が高いためお勧めできません。

### マウスカーソルの表示はどうするか？
スクリーンショットにマウスカーソルを含めるか否かも議論になるでしょう。
証跡的にはマウスカーソルを表示した方が望ましいです。

ただし、簡単に実行可能なWindows標準のスクリーンショットではマウスカーソルを含くみません。
マウスカーソルを含めたスクリーンショットを撮る場合は、[WinShot](#WinShot)などの外部ツールを利用する必要が生じます。

### スクリーンショットの範囲はどうするか
多くの場合、以下の３つのいずれかになります。

 - デスクトップ全体
 - アクティブウィンドウ
 - 矩形選択した範囲

デスクトップ全体の場合、もっとも多くの情報が記録されます。同時に余計なものを記録する可能性があります。

**例：映ってはいけないものが映りこんだスクリーンショットの例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/4bc48c51-1f1e-41e2-831c-d448275851ea.png)


アクティブウィンドウの場合、操作対象のウィンドウだけのスクリーンショットになります。多くの場合は有効です。ただし、テストケースに「デスクトップの左上にポップアップを表示すること」とかウィンドウの表示位置に関するテストを行う場合は別の選択肢を選ぶ必要があります。

矩形選択は、スクリーンショットを撮る際に、スクリーンショットの範囲を選択してからスクリーンショットを撮ります。操作がひと手間増えるため、常時利用すると作業負荷が増えます。

### ページ全体のスクリーンショットの取り方をどうするか？
ウェブアプリケーションの場合によく遭遇する話です。
縦に長いページに対する証跡の取り方をどう撮るかについても色々あります。

**スクロールバーを少しづつ動かして全体をとる**
スクロールバーを少しづつ動かして記録する方法です。
※ページダウン、ページアップキーを使った方がマウスで動かすより作業ミスは少ないです。

容易ではありますが、大量のスクロールが必要な場合、操作ミスを生み必要な箇所が取れていない場合もあります。

**ツールを使う**
拡張機能や開発者ツールを使うことでページ全体のスクリーンショットが取得できます。
ただし、ページ内の情報しか撮影されないので、スクロールバーの位置やブラウザ外の情報は記録されません。

Chromeの場合、開発者ツールでToggle Device Tool Bar(CTRL+SHIFT+M)を実行した後に、「Capture full size screenshot」を実行することでページ全体のスクリーンショットが取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/2870c442-6c71-b876-6133-c7b06312e4c9.png)


また拡張機能としては以下のような物があります。

**Full Page Screen Capture**
https://chrome.google.com/webstore/detail/full-page-screen-capture/fdpohaocaechififmbbbbbknoalclacl

### どの程度とればいいのか？
操作前と操作後はスクリーンショットを撮るようにしましょう。
撮りすぎと撮らなすぎでは前者の方が遥かにマシです。
撮りすぎた場合は後で間引けますが、足りない場合はテストをし直しになります。

### 自動操作して証跡つくればいいのでは？
その話は長くなるので、今回はパスします。

**自称IT企業があまりにITを使わずに嫌になって野に下った俺が紹介するWindowsの自動化の方法**
https://qiita.com/mima_ita/items/453bb6c313e459c44689


## スクリーンショットの取り方
### Windows10の標準機能
Windows10ではスクリーン全体、アクティブウィンドウ、矩形を対象にスクリーンショットを取得する機能が備わっています。
なお、マウスカーソルは表示されません。

|ショートカットキー|撮影対象|保存先|
|:-------|:-----|:-----|
|PrintScreen|全体|クリップボード|
|Win+PrintScreen|全体|ファイル(C:\Users\ユーザ\Pictures\Screenshots)|
|ALT+PrintScreen|アクティブなウィンドウ|クリップボード|
|Win+ALT+PrintScreen|アクティブなウィンドウ|ファイルC:\Users\ユーザ\Videos\Captures|
|Shift+Win+s|矩形選択|クリップボード|

### ステップ記録ツールの利用
Vista以降はステップ記録ツールが利用できます。
画像ファイルがMHTMLドキュメントがZIP形式で圧縮・保存される。

https://forest.watch.impress.co.jp/docs/shseri/win10minor/1137558.html


### Excel
最近のエクセルにはアクティブウィンドウのスクリーンショットを挿入する機能が存在します。
挿入タブでスクリーンショットを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/e8807837-7026-399f-377c-c4b7e74011dc.png)

なお、マウスカーソルは表示されません。

### WinShot
https://forest.watch.impress.co.jp/library/software/winshot/

昔から使われている定番のスクリーンショットツールです。
デスクトップ全体、アクティブウィンドウ、矩形選択を対象としてクリップボードとファイルに保存可能です。
マウスカーソルの表示・非表示もオプションで切り替えかのうになっており、その他、オプション項目が豊富です。

多くの現場で利用されていますが、実は最終更新日が2007年でWindows Vista以降は正式には対応していなかったりします。

#### 外部アプリケーションを使ったExcelに張り付け例
WinShotは外部アプリケーションと連携して実行することができます。
これを利用することで、スクリーンショットを指定のワークブックに張り付けることが可能になります。

(1)以下のVBSを「insert_img.vbs」として任意のフォルダに保存します。

```vb:insert_img.vbs
Option Explicit
const MARGIN_NEXT_ROW = 5

' 画像オブジェクトから次に張り付ける位置を取得する
Private Function GetNextRow(ByVal sht, ByVal row, ByVal p)
    Dim pos
    pos = p.Top + p.Height + MARGIN_NEXT_ROW
    While sht.Cells(row, 1).Top < pos
        row = row + 1
    Wend
    GetNextRow = row
End Function


Private Sub Main()
    Dim args
    Set args = WScript.Arguments
    If args.Count <> 2 Then
        WScript.Echo "ファイルパスと対象ブック名（部分一致）が指定されていません。"
        Call WScript.Quit()
    End If

    Dim imagePath
    Dim targetName

    imagePath = args(0)
    targetName = args(1)

    Dim app
    Dim bookTmp
    Dim book
    Set book = Nothing
    Dim targetRow
    Dim targetCol

On Error Resume Next
    Set app = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        WScript.Echo "貼り付け先のExcelを起動してください。※「" & targetName & "」を含むブックを開いてください。"
        Call WScript.Quit()
    End If
On Error GoTo 0
    For Each bookTmp In app.WorkBooks
        If InStr(bookTmp.Name, targetName) > 0 Then
            Set book = bookTmp
        End If
    Next
    If book is Nothing Then
        WScript.Echo "貼り付け先のExcelを起動してください。※「" & targetName & "」を含むブックを開いてください。"
        Call WScript.Quit()
    End If
    
    targetRow = app.ActiveCell.Row
    targetCol = app.ActiveCell.Column

    Dim pictObj
    Set pictObj = app.ActiveSheet.Pictures.Insert(imagePath)
    targetRow = GetNextRow(app.ActiveSheet, targetRow, pictObj)
    app.ActiveSheet.Cells(targetRow, targetCol).Activate
End Sub


Call Main()

```

(2)WinShotの環境設定を使用して、プレビュー機能を外部アプリに代替させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/1de28a08-1f8c-7048-fe4d-e5a624f7cedb.png)

外部アプリの設定内容は以下のようになります。
この例では「認証」というワークブックのアクティブセルにWinShotで取得した画像を貼り付けます。

```
C:\Windows\System32\WScript.exe C:\dev\excel_ss\image_to_xls\insert_img.vbs "%1" "証跡"
```

(3)スクリーンショットのプレビューを実行するたび、Excelに対してスクリーンショットが張り付けるようになります。
以下はアクティブウィンドウをプレビューしつづけた結果になります。(CTRL+Shift+F3)
![excelss2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/aa75add6-2c4d-7f07-5447-c1e7fc37f572.gif)


### Greenshot
https://getgreenshot.org/
https://github.com/greenshot/greenshot/

オープンソースのスクリーンショットツールです。最近Mac版もリリースされています。
日本語対応もしています。
撮影後の操作としては以下のようなものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/b3d23445-c269-602a-beeb-8ad1435c3b69.png)

外部アプリの実行や、マウスカーソルの表示等、WinShotと同様の機能があります。

## まとめ
今回はExcelスクショの方法について考えてみました。
また、多少の作業効率を上げる方法についても記述しました。

この作業は、軽視する人が多いですが、規模と歴史の長いシステムでは大きな資産になる場合があります。