製品コラム
セイテクエンジニアのブログ 製品コラム 任意の設定仕様書の差分比較がしたい ─ SSD-assistance活用例
2025年12月12日配信
執筆者:セイ・テクノロジーズ エバンジェリスト
SSD-assistanceのWindows用差分比較リストデザインを使用すると、異なる2つの情報採取データを比較して、並列に並べて色付けで強調表示することができ、同じマシンの異なる時期に取得した採取データ間、別のマシンの採取データ間の設定の違いを簡単に把握できます。差分比較リストは、障害発生時の原因調査などに活用できます。しかし、ご利用中のユーザー様の声として、Windows以外でも差分を比較できないかという要望をいただきました。SSD-assistanceの生成する設定仕様書はExcelワークシート(.xlsx)です。ここでは、Excelアドインや、フリーソフト、PowerShellを使用した3つの比較方法を紹介します。いずれの方法も設定仕様書を比較して参照するWindows PCで、Excelアプリが利用可能であることが前提となります。
Excelで利用可能なCOMアドイン「Inquire」の「ファイルの比較」ツールを使用すると、現在開いている2つのExcelファイル(Excelブック)間の違いをセルごとに比較して表示できます。SSD-assistanceの設定仕様書のデザイン上では確認することはできませんが、差分が少ない場合にすばやく違いを見つけ出すことができます(画面1、画面2)。ExcelのInquireアドインは、すべてのExcelで利用できるわけではありませんが、Microsoft 365 Apps for EnterpriseおよびOffice Professional Plusでは利用できます。*1
*1 Inquire アドインをオンにする|サポート(Microsoft)

画面1 ExcelのInquireアドインの「ファイルの比較」ツールを使用して、現在開いている2つのExcelファイル間の違いを比較する

画面2 SSD-assistanceの設定仕様書のデザイン上で確認することはできないが、違いのあるセルをすばやく見つけることができる
ExcelでInquireアドインを有効にするには、「ファイル」メニューの「オプション」を選択し、「Excelのオプション」の「アドイン」タブに切り替え、管理「COMアドイン」を選択して「設定」をクリックし、使用できるアドインの一覧から「Inquire」を選択します(画面3)。その後、2つのExcelファイルを開いた状態で、「検査」リボンの「ファイルの比較」をクリックします。

画面3 ExcelでCOMアドイン「Inquire」を有効化する
なお、SSD-assistanceが生成した設定仕様書のZIP圧縮ファイルから解凍した.xlsxファイルをそのまま指定すると、「Error opening workbook. ストリームの末尾を超えて読み取ろうとしました。」というエラーが表示され、比較結果が得られない場合があります。その場合は、比較対象の2つのExcelファイルを上書き保存するか、別のファイル名で保存してから、「ファイルの比較」ツールを実行してください。

画面4 「ファイルの比較」ツール実行時にこのエラーが発生する場合は、開いている2つのファイルを上書き保存してから再実行することで回避できる
2つのExcelファイルを比較するツールとして、nmby氏が開発、公開しているフリーソフト「方眼Diff」を紹介します。方眼Diffを使用すると、Excelファイル(Excelブック)同士を比較して差分箇所を表示することができます。方眼Diffのダウンロード、使用条件、ライセンス、使用方法など詳しくは、以下のサイトで確認してください。
方眼Diff | Excelファイル比較ツール
(GitHub https://github.com/nmby/hogandiff4)
このツールはインストールなしで使用できるスタンドアロンツール(WindowsおよびmacOS対応)であり、比較対象のExcelファイルは事前に開いておく必要はありません。比較対象の2つのExcelファイルを指定し、「実行」をクリックするだけです(画面5)。比較が完了すると、差分のレポートを表示し、オリジナルのシート両方に挿入・削除された行や列は赤の、内容の異なるセルは黄色の加工を加えて、差分レポートとともにExcelで開いて表示します(画面6)。オリジナルのExcelファイルは変更されることなく、オリジナルのファイル名に【A】【B】のプレフィックスを付けた加工済みExcelファイルが、差分レポート(result.xlsx)とともに作業用フォルダーに保存されます。
差分レポートは、差分のすべてを一か所で確認するのに利用できます。そして、加工済みのExcelファイルは、差分確認用の設定仕様書として利用できます。シートに挿入された行やシートから削除された行も自動検出して比較してくれるので、精度の高い比較結果を期待できます(画面7)。
なお、SSD-assistanceが生成した設定仕様書のZIP圧縮ファイルから解凍した.xlsxファイルをそのまま指定すると、差分を差分として検出しないことがあります(おそらく方法1と同じストリーム末尾の問題)。その場合は、設定仕様書のExcelファイルを一度開いて上書き保存するか、別のファイル名で保存してから、ツールを使用して比較してください。また、設定仕様書のExcelファイルがパスワード保護されている場合、方眼Diffでファイルパスを指定する際に「パスワード指定」ダイアログボックスが表示されるので、適切なパスワードを入力してください。

画面5 方眼Diffを使用して、SSD-assistanceの同じデザインの2つの設定仕様書を比較する

画面6 差分レポートと、差分が色分けされて強調表示された加工済みExcelファイル

画面7 挿入/削除された行を自動検出して比較してくれる。この例では、Hyper-V用設定仕様書の削除された仮想マシンが赤色に塗りつぶされ、削除された仮想マシンの次の仮想マシンの差分を正しく検出している
最後に、Windows Powershell(powershell.exe)またはPowerShell(pwsh.exe)で、COMオブジェクトを介してExcelを操作し、2つのExcelファイル間の差分を出力する汎用的、簡易的な自作PowerShellスクリプト「exceldiff.ps1」を紹介します。
[exceldiff.ps1](プレーンテキスト《UTF-8 BOM付き》で表示)
param(
[Parameter(Mandatory)]
[ValidateScript({ Test-Path -LiteralPath $_ })]
[string]$SourceA,
[Parameter(Mandatory)]
[ValidateScript({ Test-Path -LiteralPath $_ })]
[string]$TargetB
)
$outputA = $SourceA -Replace ".xls", "_diff.xls"
$outputB = $targetB -Replace ".xls", "_diff.xls"
$ErrorActionPreference = 'Stop'
$yellow = 65535 #vbYellow
$red = 255 #vbRed
$cyan = 16776960 #vbCyan
if (Test-Path $outputA) {
Remove-Item $outputA -Force
}
if (Test-Path $outputB) {
Remove-Item $outputB -Force
}
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$wbA = $null
$wbB = $null
try {
$wbA = $excel.Workbooks.Open($sourceA)
$wbB = $excel.Workbooks.Open($targetB)
$mapA = @{}
foreach ($ws in $wbA.Worksheets) { $mapA[$ws.Name] = $ws }
$mapB = @{}
foreach ($ws in $wbB.Worksheets) { $mapB[$ws.Name] = $ws }
$commonNames = @($mapA.Keys | Where-Object { $mapB.ContainsKey($_) } | Sort-Object -Descending)
if ($commonNames.Count -eq 0) {
throw "同名のシートが見つかりませんでした。"
}
foreach ($name in $commonNames) {
$wsA = $mapA[$name]
$wsB = $mapB[$name]
Write-Host "比較中 - シート名: $($name)"
$endRow = [Math]::Max(
$wsA.UsedRange.Row + $wsA.UsedRange.Rows.Count - 1,
$wsB.UsedRange.Row + $wsB.UsedRange.Rows.Count - 1
)
$endCol = [Math]::Max(
$wsA.UsedRange.Column + $wsA.UsedRange.Columns.Count - 1,
$wsB.UsedRange.Column + $wsB.UsedRange.Columns.Count - 1
)
$hasDiff = $false
$hasDiffAll = $false
for ($r = 1; $r -le $endRow; $r++) {
for ($c = 1; $c -le $endCol; $c++) {
$v1 = $wsA.Cells.Item($r, $c).Value2
$v2 = $wsB.Cells.Item($r, $c).Value2
if (("$v1") -ne ("$v2")) {
$addr = $wsB.Cells.Item($r, $c).Address($false, $false)
Write-Host " 不一致セル $($addr): $($v1) != $($v2)"
$hasDiff = $true
$hasDiffAll = $true
$wsA.Cells.Item($r, $c).Interior.Color = $yellow
$wsB.Cells.Item($r, $c).Interior.Color = $yellow
}
}
}
if ($hasDiff) {
Write-Host " 差分あり"
$wsA.Tab.Color = $yellow
$wsB.Tab.Color = $yellow
} else {
Write-Host " 差分なし"
$wsA.Tab.Color = $cyan
$wsB.Tab.Color = $cyan
}
}
Write-Host "比較中 - シートの有無..."
foreach ($ws in $wbA.Worksheets) {
$wsA = $mapA[$ws.Name]
if (($wsA.Tab.Color -eq $yellow) -or ($wsA.Tab.Color -eq $cyan)) {
# 確認済みシート
} else {
# 未確認シート(Bに存在しない)
$hasDiffAll = $true
$wsA.Tab.Color = $red
Write-Host "'$(Split-Path -Path $SourceA -Leaf)' のシート名 '$($ws.Name)' は、'$(Split-Path -Path $TargetB -Leaf)' に存在しません。"
}
}
foreach ($ws in $wbB.Worksheets) {
$wsB = $mapB[$ws.Name]
if (($wsB.Tab.Color -eq $yellow) -or ($wsB.Tab.Color -eq $cyan)) {
# 確認済みシート
} else {
# 未確認シート(Aに存在しない)
$hasDiffAll = $true
$wsB.Tab.Color = $red
Write-Host "'$(Split-Path -Path $targetB -Leaf)' のシート名 '$($ws.Name)' は、'$(Split-Path -Path $SourceA -Leaf)' に存在しません。"
}
}
if ($hasDiffAll) {
$xlOpenXMLWorkbook = 51 # xlsx
$wbA.SaveAs($outputA, $xlOpenXMLWorkbook)
$wbB.SaveAs($outputB, $xlOpenXMLWorkbook)
}
}
finally {
if ($wbA) { $wbA.Close($false) | Out-Null }
if ($wbB) { $wbB.Close($false) | Out-Null }
if ($excel) { $excel.Quit() | Out-Null }
foreach ($o in @($wbA, $wbB, $excel)) {
if ($null -ne $o) { [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($o) }
}
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
}
if ($hasDiffAll) {
Write-Host ("差分を次のファイルに保存しました。 {0}" -f $outputA)
Write-Host ("差分を次のファイルに保存しました。 {0}" -f $outputB)
} else {
Write-Host "差分はありません。"
}
「exceldiff.ps1」は、パラメーターとして「-SourceA」と「-TargetB」を受け取ります。-SourceAには比較元のExcelファイルのパス、-TargetBには比較先のExcelファイルのパスを指定します。スクリプトを実行すると、比較元のExcelファイルに存在するシートと同じ見出し(シート名)について、シート内の値の存在するすべてのセルを突き合わせ、その値を比較します(画面8)。なお、設定仕様書のExcelファイルがパスワード保護されている場合、スクリプト実行中に本来非表示COMオブジェクトがExcelに表示され、「パスワード指定」ダイアログボックスが表示されます。適切なパスワードを入力するとスクリプトは続行しますが、スクリプトで作業中のExcelの画面には触れないでください。終了後、Excelファイルは自動的に閉じます。

画面8 PowerShellスクリプト「exceldiff.ps1」を使用して、2つの設定仕様書(.xlsx)の比較を行う
比較結果はコンソール出力することに加え、Excelファイルの値が異なるセルを黄色で塗りつぶし、異なるセルが1つでもあるシートの見出しの色も黄色に設定します。差分のないシートについては、見出しをシアン色に設定します。また、2つのExceファイルに含まれるすべてのシートを調べ、比較相手のExcelファイルに存在しないシートの見出しを赤色に設定します。最後に、セルや見出しの色を加工したExcelファイルのファイル名に「_diff」サフィックス(ファイル名_diff.xlsまたは.xlsx)を付けて保存します(画面9)。オリジナルのExcelファイルは変更しません。また、2つのExcelファイルに差分が存在しない場合は、加工済みファイルを保存せずに終了します。

画面9 PowerShellスクリプト「exceldiff.ps1」によって作成された、差分を強調表示したExcelファイル
「exceldiff.ps1」はSSD-assistanceで生成された任意の設定仕様書の、同一デザインのExcelファイル間の差分を比較することを想定した簡易的なスクリプトです。前述の方眼Diffと同様に任意のExcelファイルの比較に使用できますが、方眼Diffとは異なり行の挿入や削除までは考慮していません。「exceldiff.ps1」は固定的なデザインのシートの比較には有効ですが、行の挿入や削除、並べ替え順の変更など、設定項目のセットが追加されたり削除されたりするような変更はうまく評価できない可能性があります。例えば、「Hyper-Vホスト設定仕様書」デザインの「Hyper-V仮想マシン」シートに仮想マシンのリストの間に新しい仮想マシンが追加され、以前の仮想マシンの行が下にその分下がった場合、追加された仮想マシンより下のすべてのセルが変更扱いになります。