複数の文字列を比較し差分を色分けした上その差分をリストで抽出したいときはないでしょうか。
例えば同じフォーマットの表が2つあり、更新した表と元の表の文字列で異なる箇所を確認したいときなどです。
けど、そんな中で悩むことは、
・比較する時関数を使うと条件式が複雑になり設定も面倒なので避けたい。
・VBAでExcelの表の文字列の比較、差分抽出と差分箇所の色付けを一括で処理したいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
・文字列が違う箇所のセルに色付けをする方法
・文字列が違う箇所のセルに差分内容を挿入する方法
についてまとめます!
もくじ
VBAでExcel の表の文字列の差分を抽出するイメージ
VBAでExcel の表の文字列の差分を抽出するイメージについて説明をします。
Excelでは文字列間の差分を抽出する方法はいくつかあります。
例えば2つのセルの値を比較するIF文をセルに入れて判定したり、条件付き書式で重複する値があったら背景色を変えたりという方法です。
けれどそれらの方法を行おうとした場合は各セルに関数を入れたり、条件付き書式の設定をしなければならず少々面倒ですね。
そこでVBAの登場です。
VBAに
・差分がある値のセルの色付け
・差分内容の一覧をテキストで出力
の機能を実装し、ワンクリックで一気に処理していきます。
具体的には、
比較対象となる2つの表を用意します。
比較元表
比較先表
VBAを実行すると・・・
比較元シートの表に色付けがされ、また差分箇所の詳細が出力されます!
そしてさらに、
色付けの背景色も好みの色に変更できます!
さらに、さらに、
差分内容を差分箇所のセルにメモ挿入することなんてもできてしまいます!!
どこのセルに差分があり、その値が何であるか一目でわかりますね!
それでは早速VBAを使ってみましょう!
比較したい表の文字列を用意する
まずは、比較したい表の文字列を用意しましょう。
シートを2つ作成し、それぞれの表に文字列を入力していきます。
文字列の内容はなんでもよいですが、表の行と列の数は同じにするようにしてください。
サンプルは以下のようにしました。
比較元表
比較先表
参照元のF列に差分詳細のリストが出力されますので、開けてあります。
表の文字列の差分を抽出するVBA
表の文字列の差分を抽出するVBAを準備します。
サンプルコードは以下の通りです。
Sub 表の文字列の差分を抽出()
Dim arrHikakuMotoHani As Variant
Dim arrHikakuSakiHani As Variant
Dim strHikakuMotoSheet As String
Dim strHikakuSakiSheet As String
Dim strHikakuRange As String
Dim strExpCol As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
'設定ここから-----------
'比較元シート名を指定します。
strHikakuMotoSheet = "比較元"
'比較先シート名を指定します。
strHikakuSakiSheet = "比較先"
'比較する表の範囲を指定します。
strHikakuRange = "A2:C7"
'差分詳細を出力する列を指定します。
strExpCol = "F"
'差分詳細を出力する開始セルの行番号を指定します。例えばF2セルの場合2を指定します。
k = 2
'設定ここまで-----------
l = 0
'比較元の表の文字列を配列に格納します。
arrHikakuMotoHani = Sheets(strHikakuMotoSheet).Range(strHikakuRange)
'比較先の表の文字列を配列に格納します。
arrHikakuSakiHani = Sheets(strHikakuSakiSheet).Range(strHikakuRange)
'背景色を削除します。
Sheets(strHikakuMotoSheet).Range(strHikakuRange).Interior.Pattern = xlNone
'差分抽出詳細一覧の値を削除します。
Sheets(strHikakuMotoSheet).Range(strExpCol & k & ":" & strExpCol & "100000").ClearContents
'配列に格納された値すべてを対象に処理します。
For i = LBound(arrHikakuMotoHani, 1) To UBound(arrHikakuMotoHani, 1)
For j = LBound(arrHikakuMotoHani, 2) To UBound(arrHikakuMotoHani, 2)
If Not arrHikakuMotoHani(i, j) = arrHikakuSakiHani(i, j) Then
'比較元表のセルへ背景色を追加します。
Sheets(strHikakuMotoSheet).Cells(k + i - 1, j).Interior.Color = 65535 '黄色
'差分詳細を出力します。
Sheets(strHikakuMotoSheet).Range(strExpCol & (k + l)).Value = Cells(i, j).Address & "が一致しません!" & strHikakuMotoSheet & "シートの値" & arrHikakuMotoHani(i, j) & "に対して" & strHikakuSakiSheet & "シートの値は" & arrHikakuSakiHani(i, j) & "です!"
l = l + 1
End If
Next
Next
End Sub
VBAの設定をする
表の文字列の差分を抽出するVBAに先ほど作成した表の文字列の場所を設定しましょう。
設定箇所は以下の通りです。
比較元シート名を指定します。
比較先シート名を指定します。
比較する表の範囲を指定します。
差分詳細を出力する列を指定します。
差分詳細を出力する開始セルの行番号を指定します。例えばF2セルの場合2を指定します。
VBAを実装し実行する
VBAを実装し実行してみましょう。
実装方法は「VBAの実装手順」をご覧ください。
実装できたらマクロから「表の文字列の差分を抽出」を見つけ実行します。
はい、差分抽出の内容が出力され、差分があるセルの背景も黄色に変わっていますね!
VBAの説明
表の文字列の差分を抽出するVBAについて説明をします。
比較元の表の文字列を配列に格納します。
比較先の表の文字列を配列に格納します。
背景色を削除します。
差分抽出詳細一覧の値を削除します。
配列に格納された値すべてを対象に処理します。
For j = LBound(arrHikakuMotoHani, 2) To UBound(arrHikakuMotoHani, 2)
一致していない場合、詳細出力します。
比較元表のセルへ背景色を追加します。
差分詳細を出力します。
差分があるセルに色付けされる色を変更する
次に差分があるセルに色付けされる色を変更してみましょう。
サンプルでは黄色でしたが、こちらを落ち着いた緑色にしてみます。
↓ へ変更します。
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).Interior.Color = 5287936 ‘緑
はい、緑色に変更されましたね。
その他のカラーコードは以下になります。
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).Interior.Color = 5287936 ‘緑
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).Interior.Color = 255 ‘赤
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).Interior.Color = 10498160 ‘紫
差分があるセルにメモで差分内容を挿入する
現在表の欄外で一覧出力される差分内容について、差分があるセルにメモで挿入してみましょう。
追加するコードはこちらになります。
Sheets(strHikakuMotoSheet).Range(strHikakuRange).ClearComments
‘各セルへメモを追加します。
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).AddComment
Sheets(strHikakuMotoSheet).Cells(k + i – 1, j).Comment.Text Text:=strHikakuSakiSheet & “シートの値は” & arrHikakuSakiHani(i, j) & “です!”
コード全体はこちらになります。
Sub 表の文字列の差分を抽出_メモ追加版()
Dim arrHikakuMotoHani As Variant
Dim arrHikakuSakiHani As Variant
Dim strHikakuMotoSheet As String
Dim strHikakuSakiSheet As String
Dim strHikakuRange As String
Dim strExpCol As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
'設定ここから-----------
'比較元シート名を指定します。
strHikakuMotoSheet = "比較元"
'比較先シート名を指定します。
strHikakuSakiSheet = "比較先"
'比較する表の範囲を指定します。
strHikakuRange = "A2:C7"
'差分詳細を出力する列を指定します。
strExpCol = "F"
'差分詳細を出力する開始セルの行番号を指定します。例えばF2セルの場合2を指定します。
k = 2
'設定ここまで-----------
l = 0
'比較元の表の文字列を配列に格納します。
arrHikakuMotoHani = Sheets(strHikakuMotoSheet).Range(strHikakuRange)
'比較先の表の文字列を配列に格納します。
arrHikakuSakiHani = Sheets(strHikakuSakiSheet).Range(strHikakuRange)
'背景色を削除します。
Sheets(strHikakuMotoSheet).Range(strHikakuRange).Interior.Pattern = xlNone
'差分抽出詳細一覧の値を削除します。
Sheets(strHikakuMotoSheet).Range(strExpCol & k & ":" & strExpCol & "100000").ClearContents
'コメントを削除します。
Sheets(strHikakuMotoSheet).Range(strHikakuRange).ClearComments
'配列に格納された値すべてを対象に処理します。
For i = LBound(arrHikakuMotoHani, 1) To UBound(arrHikakuMotoHani, 1)
For j = LBound(arrHikakuMotoHani, 2) To UBound(arrHikakuMotoHani, 2)
If Not arrHikakuMotoHani(i, j) = arrHikakuSakiHani(i, j) Then
'比較元表のセルへ背景色を追加します。
Sheets(strHikakuMotoSheet).Cells(k + i - 1, j).Interior.Color = 65535 '黄色
'各セルへメモを追加します。
Sheets(strHikakuMotoSheet).Cells(k + i - 1, j).AddComment
Sheets(strHikakuMotoSheet).Cells(k + i - 1, j).Comment.Text Text:=strHikakuSakiSheet & "シートの値は" & arrHikakuSakiHani(i, j) & "です!"
'差分詳細を出力します。
Sheets(strHikakuMotoSheet).Range(strExpCol & (k + l)).Value = Cells(i, j).Address & "が一致しません!" & strHikakuMotoSheet & "シートの値" & arrHikakuMotoHani(i, j) & "に対して" & strHikakuSakiSheet & "シートの値は" & arrHikakuSakiHani(i, j) & "です!"
l = l + 1
End If
Next
Next
End Sub
実行してみましょう。
はい、各セルのメモが追加され差分の詳細が入力されていますね!
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
さいごに
いかがでしょうか。
今回は、
・文字列が違う箇所のセルに色付けをする方法
・文字列が違う箇所のセルに差分内容を挿入する方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す