ご挨拶はさておき、今日の本題へ。
ExcelでDiffしたい
我々SIerの仕事は、1にExcel、2にExcel。3、4がWordで5にPowerPointであるから、Excelで行う作業を如何に効率化するかが、さて、我々SIerは「2つのデータのDiffをExcelで見たい」というシチュエーションによく遭遇する。 Excelのブック同士のDiffを取るのであれば、WinMerge+xdocdiff プラグインとかを使えばよいのだが、当記事は、同一シート内の2つの列でDiffを取り、それを見やすく整形することをテーマとしている。
例えば下図Figure.1のような状況。
Figure.1 A列とC列を比較したい |
Figure.2 こういう風に同じデータが同一行に揃うと嬉しいよね |
インストール(?)
PERSONAL.XLSBの標準モジュールに下記ソースを貼り付けるだけ。使い方
- 比較したい2つのデータを、ExcelシートのA列とC列に貼り付ける。(B列を空けたのは、作業スペースとして使えるように。)
- Alt+F8から"PERSONAL.XLSB!ExcelDiff"を呼び出す。
動作条件など
- 比較前のデータには空行がないほうがいいと思う。空行があるとバグる可能性あり。
- 比較前のデータは予めソートされている方がよいと思う。A列とC列とでデータの並び順が違うと、期待するような結果が得られないと思う。(これは他のdiffツールでも同じ)
ソース
糞コードなので、自由にリファクタリングしたり改造して使ってください。こんなもんに著作権も何もないので。' Excel de Diff VBA Ver.1.00 ' 2013.12.13 dsp74118 Option Explicit ' description: ' 選択中のシートの A 列と C 列を比較し、 ' 同じデータが同一行に並ぶように整形する。 Sub ExcelDiff() Dim i As Long, j As Long Dim lastRow As Long lastRow = Rows.Count i = 1 Do While i <= Cells(lastRow, 1).End(xlUp).Row If Cells(i, 1).Value <> "" Then ' A列と同じデータがC列のどこにあるか探す j = c(i, 1, 3) If j = 0 Then ' A列にあってC列にない場合、C列を下にシフトする Cells(i, 3).Insert Shift:=xlDown ElseIf j > i Then ' C列のほうが下にある場合、A列を同じ行になるよう下にシフト Range(Cells(i, 1), Cells(j - 1, 1)).Insert Shift:=xlDown ElseIf j < i Then ' A列のほうが下にある場合、C列を同じ行になるよう下にシフト Range(Cells(j, 3), Cells(i - 1, 3)).Insert Shift:=xlDown End If End If i = i + 1 Loop ' 空行削除 For i = Cells(lastRow, 1).End(xlUp).Row To 1 Step -1 If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete End If Next i End Sub ' Findによる存在チェック ' セル範囲から検索値が見つかったらその行番号を,見つからなかったら0を返す ' 検索値が空だった場合も0を返す ' 検索値:lookupRow行、lookupCol列 のセルの値 ' 範囲:targetCol列 Private Function c(lookupRow As Long, lookupCol As Long, targetCol As Long) As Long Dim vlk As Object c = 0 If Cells(lookupRow, lookupCol).Value = "" Then Exit Function End If On Error Resume Next Set vlk = Columns(targetCol).Cells.Find(Cells(lookupRow, lookupCol).Value, Lookat:=xlWhole) If Not vlk Is Nothing Then c = vlk.Row End If On Error GoTo 0 End Function
0 件のコメント:
コメントを投稿