【VBA】WinMergeでファイルを自動比較&HTMLレポート出力|AIより手軽
作成日:2025-11-07
更新日:2025-11-07

2つのファイルを
比較する
比較する

比較したいファイルが、たくさんある

WinMergeをVBAから呼び出そう
指定フォルダ内にあるファイルを自動比較&HTMLレポートを出力する
Option Explicit
Private Const 削除する末尾の文字数 As Long = 0
Private Const レポートの文頭 As String = "【Title】Diff★"
Private Const MAX_WAIT_SECONDS As Long = 30
Private Sub WinMergeでファイルの差分を出力する()
Dim exe As String: exe = ThisWorkbook.Path & "\" & "WinMergeU.exe"
Dim root As String
root = ThisWorkbook.Path
' 比較フォルダの設定
Dim folderSRC As String: folderSRC = root & "\" & "旧ファイル"
Dim folderDST As String: folderDST = root & "\" & "新ファイル"
' HTMLレポート出力フォルダ
Dim folderOutput As String: folderOutput = root
' --- 変数・オブジェクト ---
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
Dim fileDst As Object, fileSrc As Object
Dim fileFound As Boolean
Dim startTime As Double
Dim fileSizeAtStart As Long
' フォルダ存在チェック
If Not fso.FolderExists(folderSRC) Then
MsgBox "フォルダが見つかりません。パスを確認してください。" & vbCrLf & folderSRC, vbCritical
Set fso = Nothing: Exit Sub
End If
If Not fso.FolderExists(folderDST) Then
MsgBox "フォルダが見つかりません。パスを確認してください。" & vbCrLf & folderDST, vbCritical
Set fso = Nothing: Exit Sub
End If
' 出力フォルダがなければ作成
If Not fso.folderExists(folderOutput) Then fso.CreateFolder folderOutput
' dstフォルダ内のファイルを1つずつ処理
For Each fileDst In fso.GetFolder(folderDST).Files
fileFound = False
' 1) 比較キーを作成(例:末尾2文字削除 → "aaa.xlsx" -> "aaa")
Dim dstNameOnly As String, dstN As String
dstNameOnly = fso.GetBaseName(fileDst.Name)
dstN = dstNameOnly
If 削除する末尾の文字数 > 0 Then
dstN = Left(dstNameOnly, Len(dstNameOnly) - 削除する末尾の文字数)
End If
dstN = StrConv(dstN, vbNarrow)
dstN = StrConv(dstN, vbLowerCase)
' 2) src側の一致探索
For Each fileSrc In fso.GetFolder(folderSRC).Files
Dim srcNameOnly As String, srcN As String
srcNameOnly = fso.GetBaseName(fileSrc.Name)
srcN = srcNameOnly
If 削除する末尾の文字数 > 0 Then
srcN = Left(srcNameOnly, Len(srcNameOnly) - 削除する末尾の文字数)
End If
srcN = StrConv(srcN, vbNarrow)
srcN = StrConv(srcN, vbLowerCase)
If srcN = dstN Then
fileFound = True
Exit For
End If
Next fileSrc
If Not fileFound Then
Debug.Print fileDst.Name & " ・・・一致するファイルが src フォルダにない"
Else
' レポートパス
Dim reportPath As String
reportPath = folderOutput & "\" & レポートの文頭 & dstN & ".html"
' 既存ならスキップ
If Dir(reportPath) <> "" Then
Debug.Print "Skip: " & fileDst.Name & " ・・・すでにあり"
GoTo continue
End If
' WinMerge CLI を実行
Dim q As String, exeQ As String, dstQ As String, srcQ As String, repoQ As String
q = Chr(34)
exeQ = q & exe & q
dstQ = q & fileDst.Path & q
srcQ = q & fileSrc.Path & q
repoQ = q & reportPath & q
Dim cmd As String
cmd = exeQ & " /r /e /xq /ul /ur /minimize /or " & repoQ & " " & dstQ & " " & srcQ
Dim sh As Object: Set sh = CreateObject("WScript.Shell")
On Error Resume Next
sh.Run cmd, 0, False
If Err.Number <> 0 Then Debug.Print Err.Description
On Error GoTo 0
Set sh = Nothing
' --- 待機ループ(サイズ安定で完了判定) ---
startTime = Timer
fileSizeAtStart = 0
Do
If Dir(reportPath) <> "" Then
fileSizeAtStart = fso.GetFile(reportPath).Size
If fileSizeAtStart > 0 Then
Application.Wait Now + TimeValue("00:00:02")
If fso.GetFile(reportPath).Size = fileSizeAtStart Then
Debug.Print fileDst.Name & " ・レポート作成完了を確認。"
Exit Do
End If
End If
End If
If Timer - startTime >= MAX_WAIT_SECONDS Then
Debug.Print fileDst.Name & " ・レポート作成がタイムアウトしました。"
Exit Do
End If
DoEvents
Loop
End If
continue:
Next fileDst
Set fso = Nothing
MsgBox "WinMergeの比較処理が終了しました。", vbInformation
End Subやってること
- WinMergeU.exe のパス設定
同じフォルダにあるWinMergeU.exeを使うように設定。 - 比較元・比較先フォルダを指定
-旧ファイルフォルダ → 比較元(SRC)
-新ファイルフォルダ → 比較先(DST)
-ThisWorkbook.Path基準で相対パスを構築。 - フォルダ存在チェック
指定したフォルダが存在しなければメッセージを出して終了。 - 出力フォルダ(HTML保存先)を確認・なければ作成
folderOutputにHTML形式のレポートを保存する準備。 - DSTフォルダ内のファイルを1つずつ処理
「新ファイル」側にある全ファイルを順にチェック。 - ファイル名の比較キーを作成
- 拡張子を除いたベース名を取得。
- 末尾の特定文字数を削除(設定可能)。
- 全角→半角、小文字化して正確に比較。 - SRCフォルダ側に同名ファイルがあるか検索
同じキーのファイルを「旧ファイル」フォルダから探す。 - 一致するファイルがあればWinMergeをコマンドライン実行
WinMergeをサイレントモードで起動してHTMLレポートを生成。
(/r /e /xq /ul /ur /minimize /orオプション使用) - HTMLレポートの作成完了を監視
出力ファイルのサイズが安定するまで待機(最大30秒)。
サイズ変化が止まれば「完了」とみなす。 - 処理完了後にメッセージ表示
全ファイル比較が終わると「終了しました」と通知。
出力されるもの
folderOutput(このブックのフォルダ)に
→【Title】Diff★ファイル名.htmlのレポートが自動生成される。- 既に同名レポートがあればスキップ(再出力しない)。

「放置して全比較+HTMLレポート化」みたいなバッチ処理
AIでもできる?
- VBAが最適
- ルールが明確(同名/規則ベースで突き合わせ)
- バッチで黙々と回す(HTML出力だけ欲しい)
- オフライン/社内だけで完結したい(情報持ち出したくない)
- AIを足すとさらに良いこと
- 曖昧マッチ:ファイル名が揃ってない・似た書類の候補を自動提案したい
- 要約・要点抽出:HTMLレポートを「変更点サマリ(影響・重要度)」に自動変換したい
- ノイズ除去:日付・GUID・並び替えだけ等を自動で“無視変更”として扱いたい
- 優先度付け:影響が大きそうな差分から順にレビューしたい
やるならハイブリッド構成
- VBAでWinMerge HTMLを量産(今のまま)
- ポスト処理(ローカルPC推奨):
- HTML→テキスト抽出
- 変更種類を分類(追加/削除/並替/書式)
- AIで要約
- 「要点3つ・影響度(High/Med/Low)・レビュー観点」を生成
- ダッシュボード化
- “重要度順”に並べた一覧(リンクで元HTMLへ)
具体的にAIで何させる?
- 対応付け候補出し:名前が少し違う帳票も、見出し/数値分布で“たぶんコレ”を提案
- 差分の意味づけ:
「列が追加 → 集計影響ありの可能性」
「並べ替えのみ → 影響小」 - レビュー指示文:
「ここは数式→定数化。意図かミスか確認」みたいな“確認観点”を自動列挙
判断の目安(チェックリスト)
- ファイル命名が整ってる → VBAのみでOK
- 命名バラバラ → AIの曖昧マッチ追加
- レポートが多すぎて読むのつらい → AI要約+優先度付け追加
WinMerge v.s. Beyond Compare
Beyond Compare (bcompare)
WinMergeの上位互換。ただし有料。
ざっくり比較
| 項目 | WinMerge | Beyond Compare (bcompare) |
|---|---|---|
| 価格 | 無料 | 有料(試用30日) |
| 軽さ | 軽い | 少し重い(けど安定) |
| 精度 | 行単位(単純) | 単語・数値単位まで正確に差分検出 |
| 比較対象 | ファイル/フォルダ | ファイル/フォルダ/ZIP/FTP/S3/Gitなど |
| 自動レポート出力 | ○(HTML可) | ○(HTML・XML・CSVなど豊富) |
| CLI対応 | ○(WinMergeU.exe /r ...) | ○(bcompare.exe /closescript=...) |
| マージ機能 | あり | 超強力(3-way mergeも可) |
| カスタマイズ | 少なめ | 豊富(ルールや無視設定を細かく定義可能) |
使い道の比較
- VBAでバッチ比較 → WinMergeのままでOK(軽くて十分)
- PythonやPowerShellで自動レポート生成 → Beyond Compareが最強
→bcompare.exe /closescript=script.txtで完全自動比較も可
→ スクリプトで「レポートだけ出して閉じる」も可能
おすすめ構成
| 用途 | ツール | 理由 |
|---|---|---|
| 手軽にフォルダ比較・レポート化 | WinMerge + VBA | 軽くて充分 |
| 精密比較(列単位・文字単位) | Beyond Compare | 数値やスペースの違いも正確 |
| システム監査・納品検証 | Beyond Compare + CLIスクリプト | ログ出力・レポート自動保存が楽 |
もし今後「Excel内容のセル単位の違い」や「HTML中の一部タグだけ無視したい」とか出てきたら、
Beyond Compareが便利。
「差分を仕組み化」したいときにはBeyond Compare

PowerShellだけで書くと、より手軽
2025-11-07
編集後記:
この記事の内容がベストではないかもしれません。