2016年9月3日土曜日

自動的にデータを比較する

自動的にデータを比較するプログラムを作りました。VBAで書いてます。エクセル用のプログラムです。

Option Explicit

Dim FirstRow As Long
Dim FirstCol As Long
Dim LastRow As Long
Dim LastCol As Long

Sub ComparisonData()

Application.ScreenUpdating = False

Dim rc As Integer
'rc = MsgBox("Choose the items to compare.")

FirstRow = Selection.row
FirstCol = Selection.Column

'Cells(FirstRow, FirstCol).Value = "First"
'Debug.Print (FirstCellStr)

LastRow = Selection(Selection.Count).row
LastCol = Selection(Selection.Count).Column

'Cells(LastRow, LastCol).Value = "Last"
'Debug.Print (LastCellStr)

Dim colc As Collection
Dim colc2 As Collection

Set colc = MakeCollection(FirstRow, FirstCol, LastRow, LastCol)
Set colc2 = MakeCollection(FirstRow, FirstCol + 1, LastRow, LastCol + 1)

Call DoComparison(colc, colc2, FirstRow, FirstCol)

Application.ScreenUpdating = True

End Sub

Function MakeCollection(FirstRow As Long, FirstCol As Long, LastRow As Long, LastCol As Long) As Collection

Dim colfunc As New Collection

Dim i As Long
Dim j As Long
For i = FirstRow To LastRow

    For j = FirstCol To LastCol

        colfunc.Add Item:=ActiveSheet.Cells(i, j).Value, Key:=i & ", " & j

    Next

Next

Set MakeCollection = colfunc

End Function

Sub DoComparison(colcfunc1 As Collection, colcfunc2 As Collection, FirstRow As Long, FirstCol As Long)

Dim i As Long
Dim j As Long
Dim row As Long

Selection.Interior.Color = 65535

For i = 1 To colcfunc1.Count
    For j = 1 To colcfunc2.Count
        row = FirstRow + i - 1
     
        If StrComp(Trim(colcfunc1(i)), Trim(colcfunc2(j)), 1) = 0 Then
         
            With ActiveSheet.Cells(row, Selection.Column).Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
        End If
     
        If row = LastRow Then
            row = FirstRow + i - 1
        End If

    Next

Next

End Sub

使い方

使い方は簡単です。エクセルのVBAに上記のコードをまるごと入れます。
下の画面の出し方がわからない人は「エクセルの開発タブの出し方」とかでぐぐってみてください。簡単に説明すると、ファイル→オプション→リボンのユーザー設定で開発というリボンにチェックを入れることで下の画面に行けるようになります。

そしたら上のマクロが使えるようになります。例えば、以下のように比較したいデータ群1とデータ群2があるとします。このとき、比較するデータ群は下の画像みたいに必ず隣接するようにしてください。


そしたら下のように、一番下+1つ下の行まで選択します。

選択した状態で、開発タブのマクロってところを押します。押すと下の画像のような画面がでるので、このなかの「Sheet1.ConparisonData」っていうマクロを実行します。ちなみに「Sheet1」の部分はシートの名前によって変化するので、必ずしもこの通りの名前だとは限りません。シートの名前によっては「Sheet3.ComparisonData」かもしれないし、「俺のシート.ComparisonData」かもしれません。


そうすると下のように「データ群1にだけしかないデータ」がハイライトされます。「データ群1にはあるけどデータ群2にはないデータがハイライトされる」と言い換えてもいいでしょう。

さらにデータを入れ替えて実行すれば。。。

今度は「データ群2にはあるけどデータ群1にはないデータ」がハイライトされます。
このように、2つのデータを比較し、どこの項目が違うのかを瞬時に教えてくれます。比較結果を見ると、「s, x」は2つのデータ群が両方とも持っているけど、「a, b, c, d」はデータ群2しか持ってなくて、「z, w」はデータ群1しか持ってないみたいですね。

まあこの例みたいに高々10個程度の要素を持つ2つのデータの集合同士を比較するとかなら人力で地道に数えてもいいんだけど、500個とか1000個のデータを比較するとかだと人力じゃとても終わらないからね。。。なので自動的にやってくれるプログラムを作ってみました。