VBAでスクショ自動貼り付け！SI現場のエビデンス作成を時短・一部自動化する方法（SESエンジニア向け）

# 前書き
SIの現場において、動作確認はブラウザのキャプチャを取得して、それをExcelに貼り付けを行っていくのが主流だと思います。
キャプチャの貼り付けを自動化するためにいくつかQiita等で探しましたが、クリップボードから貼り付けを自動化する等、Ctrl+Vの短縮をするようなものばかりでしたので、今回は自作しました。

以下のような方は少し参考になるかと思います。
1. SIのテスター
2. 限られた時間の中でキャプチャを取得する人
3. E2Eテストの自動化で外部ツールの導入ができない人
4. Github等のコードをコピペできない人

前提の環境は以下です。
1. 画像をローカルにダウンロードできるツールを使用（GoFullPage等）
2. VBAを使用できること
3. Shell Scriptを利用できること

今回はGithubを見ながら手打ちできる程度のコード量になっているはずですので、お試しください。
では本編。
# VBAでキャプチャエビデンスと整形を自動化する

## 想定するユースケースと背景

SIの現場やテスト工程において、「画面の動作確認結果をキャプチャしてエビデンスとして残す」という作業は日常茶飯事です。特にウォーターフォール型のプロジェクトや外部委託テストでは、**「誰でも同じように再現可能な証跡」**を求められることが多く、そのためには画像付きでの記録が非常に有効です。

私の現場でも、以下のような運用が多く見られます。

1. テスト実施者が**GoFullPage（Chrome拡張）**などで画面全体のスクリーンショットを取得
2. ファイル名に番号や画面名を付けて保存（例：001_login.png）
3. それをExcelに1枚ずつ貼り付け、サイズを調整し、手順番号や操作内容をコメントで記載
4. 完成したExcelを「エビデンス」として関係者に提出

ただ、この作業は非常に反復的かつ時間がかかるものです。貼り付け→リサイズ→位置調整→コメント挿入……と、毎回同じ作業の繰り返しになります。

さらに、ツールの制限やセキュリティルールでSeleniumやAutoHotKeyなどの自動化ツールが使えない環境も多く、**「ExcelとVBAだけで何とかしたい」** というニーズもあるのではないでしょうか。

そこで、今回はVBA + Shell Scriptで業務効率化するコードを紹介します。

---

## 前提環境

- GoFullPage などのスクリーンショットツールを使って画像をローカル保存できる
- Excel上でVBAが使用できる
- Bash（Shell Script）を実行できる環境（Mac/Linux・GitBash ForWindows）想定）

---

## VBAスクリプトの概要

以下の処理を自動で行います：

1. 指定したフォルダ内の `.png` や `.jpg` ファイルを1枚ずつExcelに貼り付け
2. 幅を指定してリサイズ（縦横比維持）
3. 縦または横に整列して自動配置

---

## 基本の使い方

1. Excelを開き「開発」タブを表示（必要に応じて有効化）
2. Alt + F11 でVBAエディタを開く（もしくはリボンバーのVisualBasicをクリック）
3. 「挿入」→「標準モジュール」でモジュール追加
4. 下記のコードを貼り付け
5. `folderPath` に画像フォルダのパスを指定
6. マクロとして `InsertPicturesWithDirection` を実行

---

## VBAコード

```vba
Sub InsertPicturesWithDirection()
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim picturePath As String
    Dim folderPath As String
    Dim pic As Shape
    Dim topPosition As Single
    Dim leftPosition As Single
    Dim pictureWidthCm As Single
    Dim gapPt As Single
    Dim layoutDirection As String  ' "vertical" or "horizontal"

    ' ==== 設定 ====
    folderPath = "C:\画像"        ' 対象フォルダに変更
    pictureWidthCm = 15           ' 画像の横幅（cm）
    gapPt = 5                     ' 画像間の隙間（pt）
    topPosition = 20              ' 初期Y位置
    leftPosition = 30             ' 初期X位置
    layoutDirection = "vertical"  ' ★ここを"horizontal"にすると横並びにできる！

    ' ==== 初期化 ====
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    ' ==== ファイルをループ処理 ====
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "jpg" Or LCase(fso.GetExtensionName(file.Name)) = "png" Then
            picturePath = file.Path

            ' 画像を挿入
            Set pic = ActiveSheet.Shapes.AddPicture( _
                Filename:=picturePath, _
                LinkToFile:=msoFalse, _
                SaveWithDocument:=msoCTrue, _
                Left:=leftPosition, _
                Top:=topPosition, _
                Width:=-1, _
                Height:=-1 _
            )

            ' 縦横比固定＋リサイズ
            With pic
                .LockAspectRatio = msoTrue
                .Width = pictureWidthCm * 28.35

                ' 並べ方に応じて位置を調整
                If layoutDirection = "vertical" Then
                    topPosition = .Top + .Height + gapPt
                ElseIf layoutDirection = "horizontal" Then
                    leftPosition = .Left + .Width + gapPt
                End If
            End With
        End If
    Next file

    ' ==== 終了処理 ====
    Set folder = Nothing
    Set fso = Nothing
End Sub
```

---

## カスタマイズポイント

| 設定名 | 説明 | 例 |
|--------|------|----|
| `pictureWidthCm` | 画像の幅（cm） | 10（小さく）、18（大きく） |
| `layoutDirection` | 並び方向 | `"vertical"` or `"horizontal"` |
| `topPosition`, `leftPosition` | 貼り付け開始位置（pt） | `100` にすると余白が大きめ |
| `gapPt` | 画像間の隙間 | 0 〜 20くらいが目安 |
| 拡張子の追加 | `.gif`なども対象に | `Or LCase(...) = "gif"` を追加 |

---

## ファイル名に連番を付けるShell Script（Mac版）

以下のShell Scriptで、画像の更新日時順に連番をつけてリネームできます。

```bash
#!/bin/bash

target_dir="/Users/gotohshiryuu/Program/Shell Script/aba"  # 対象のディレクトリ（適宜変更）
caseName="テストケース名"

cd "$target_dir" || exit

# 一時ファイル作成：更新日時とパスをタブ区切りで保存
tmpfile=$(mktemp)
for file in *.png *.jpg; do
  [ -f "$file" ] || continue  # ファイルが存在しない場合はスキップ
  # Linuxの場合は、stat -c "%Y" を使用します。
  # MacOSの場合は、stat -f "%m" を使用します。
  mtime=$(stat -f "%m" "$file")  # 更新日時（mtime）
  echo -e "$mtime\t$file" >> "$tmpfile"
done

# ソートして1行ずつ連番でリネーム
count=1
sort -n "$tmpfile" | while IFS=$'\t' read -r _ filepath; do
  ext="${filepath##*.}"
  newname=$(printf "%03d%s.%s" "$count" "$caseName" "$ext")
  mv "$filepath" "$newname"
  count=$((count + 1))
done

# 後片付け
rm "$tmpfile"
```

---

## おわりに

私の環境では、上記のようなコードを使い作業効率を少し上昇させることができました。
画像にコメント挿入等も自動化できればよかったのですが、画像認識等をVBAで行うのは現実的ではないため、小手先の業務効率化ではこの程度が限界かと思います。
改善点等あればコメント等いただければ幸いです。
業務効率化に勤しみましょう。

---

## 参考リンク

- [GoFullPage（Chrome拡張）](https://chrome.google.com/webstore/detail/gofullpage-full-page-scre/fdpohaocaechififmbbbbbknoalclacl)
- [VBA公式ドキュメント（Microsoft Learn）](https://learn.microsoft.com/ja-jp/office/vba/api/overview/excel)