銀河鉄道

【VBA】WinMergeでファイルを自動比較&HTMLレポート出力|AIより手軽

サムネイル
[VBA]Auto DiffHTML Output
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

やってること

  1. WinMergeU.exe のパス設定
     同じフォルダにある WinMergeU.exe を使うように設定。
  2. 比較元・比較先フォルダを指定
     - 旧ファイル フォルダ → 比較元(SRC)
     - 新ファイル フォルダ → 比較先(DST)
     - ThisWorkbook.Path 基準で相対パスを構築。
  3. フォルダ存在チェック
     指定したフォルダが存在しなければメッセージを出して終了。
  4. 出力フォルダ(HTML保存先)を確認・なければ作成
     folderOutput にHTML形式のレポートを保存する準備。
  5. DSTフォルダ内のファイルを1つずつ処理
     「新ファイル」側にある全ファイルを順にチェック。
  6. ファイル名の比較キーを作成
     - 拡張子を除いたベース名を取得。
     - 末尾の特定文字数を削除(設定可能)。
     - 全角→半角、小文字化して正確に比較。
  7. SRCフォルダ側に同名ファイルがあるか検索
     同じキーのファイルを「旧ファイル」フォルダから探す。
  8. 一致するファイルがあればWinMergeをコマンドライン実行
     WinMergeをサイレントモードで起動してHTMLレポートを生成。
     (/r /e /xq /ul /ur /minimize /or オプション使用)
  9. HTMLレポートの作成完了を監視
     出力ファイルのサイズが安定するまで待機(最大30秒)。
     サイズ変化が止まれば「完了」とみなす。
  10. 処理完了後にメッセージ表示
     全ファイル比較が終わると「終了しました」と通知。

出力されるもの

  • folderOutput(このブックのフォルダ)に
     → 【Title】Diff★ファイル名.html のレポートが自動生成される。
  • 既に同名レポートがあればスキップ(再出力しない)。

「放置して全比較+HTMLレポート化」みたいなバッチ処理


AIでもできる?

  • VBAが最適
    • ルールが明確(同名/規則ベースで突き合わせ)
    • バッチで黙々と回す(HTML出力だけ欲しい)
    • オフライン/社内だけで完結したい(情報持ち出したくない)
  • AIを足すとさらに良いこと
    1. 曖昧マッチ:ファイル名が揃ってない・似た書類の候補を自動提案したい
    2. 要約・要点抽出:HTMLレポートを「変更点サマリ(影響・重要度)」に自動変換したい
    3. ノイズ除去:日付・GUID・並び替えだけ等を自動で“無視変更”として扱いたい
    4. 優先度付け:影響が大きそうな差分から順にレビューしたい

やるならハイブリッド構成

  1. VBAでWinMerge HTMLを量産(今のまま)
  2. ポスト処理(ローカルPC推奨):
    • HTML→テキスト抽出
    • 変更種類を分類(追加/削除/並替/書式)
  3. AIで要約
    • 「要点3つ・影響度(High/Med/Low)・レビュー観点」を生成
  4. ダッシュボード化
    • “重要度順”に並べた一覧(リンクで元HTMLへ)

具体的にAIで何させる?

  • 対応付け候補出し:名前が少し違う帳票も、見出し/数値分布で“たぶんコレ”を提案
  • 差分の意味づけ
    「列が追加 → 集計影響ありの可能性」
    「並べ替えのみ → 影響小」
  • レビュー指示文
    「ここは数式→定数化。意図かミスか確認」みたいな“確認観点”を自動列挙

判断の目安(チェックリスト)

  • ファイル命名が整ってる → VBAのみでOK
  • 命名バラバラ → AIの曖昧マッチ追加
  • レポートが多すぎて読むのつらい → AI要約+優先度付け追加

WinMerge v.s. Beyond Compare

Beyond Compare (bcompare)

WinMergeの上位互換。ただし有料。

ざっくり比較

項目WinMergeBeyond 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だけで書くと、より手軽

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧