Excelで重複するデータの中から重複のないデータリストを作成します。
Office 365では「UNIQUE関数」をが実装され、これによって簡単に重複データから重複のないデータリストができるようなりました。
しかしながら、古いバージョンのExcelでは実装されていないため関数での対応はできません。そこで、今回は関数を自作しましたので紹介します。
ただし、自作関数を適用する場合には拡張子を.xlsmに変更する必要があるので注意してください。
自作関数の作成
今回作成した関数は2種類あります。
重複データ範囲のみを指定し、重複のないデータリストを出力する関数
こちらは、引数として重複データ範囲のみを指定するタイプです。
結果は、複数のセル範囲に配列として出力します。
Function duplication(rng As Variant)
Dim dt() As Variant
Dim cnt As Long: cnt = 1
ReDim dt(1 To 1)
For i = 1 To rng.Count + 1
If i = 1 Then
dt(cnt) = rng(i)
cnt = cnt + 1
Else
For ii = 1 To cnt - 1
If rng(i) = dt(ii) Then GoTo nextRng
Next
If rng(i) = "" Then GoTo nextRng
ReDim Preserve dt(1 To cnt)
dt(cnt) = rng(i)
cnt = cnt + 1
End If
nextRng:
Next
duplication = Application.WorksheetFunction.Transpose(dt)
End Function
使い方は、以下のフローの通りです。
- 出力する範囲を指定する
- 関数を入力する。「=duplication(データ範囲)」
- Shift、Ctrl、Enterを同時に押す
これで結果が配列として出力されます。Office365で実行すると、自動でスピルされます。
なお、出力されるデータ数よりも出力範囲の方が多い場合はエラー値が出力されます。
重複データ範囲と出力するデータのインデックス番号を指定する関数
こちらは、重複データ範囲のほかに、インデックス番号を指定することで出力データを一つだけ選んで出力します。
この関数では、引数が増えている代わりに、他の関数との組み合わせて使用するのに適しています。
Function duplication_2nd(rng As Variant, num As Long)
Dim dt() As Variant
Dim cnt As Long: cnt = 1
ReDim dt(1 To 1)
For i = 1 To rng.Count + 1
If i = 1 Then
dt(cnt) = rng(i)
cnt = cnt + 1
Else
For ii = 1 To cnt - 1
If rng(i) = dt(ii) Then GoTo nextRng
Next
If rng(i) = "" Then GoTo nextRng
ReDim Preserve dt(1 To cnt)
dt(cnt) = rng(i)
cnt = cnt + 1
End If
nextRng:
Next
cnt = cnt - 1
'エラー値の出力を回避する。
'抽出されたリストの数よりも第二引数の数値が多い場合は空白を返す
If num > cnt Then
duplication_2nd = ""
Else
duplication_2nd = dt(num)
End If
End Function
こちらも基本的には先ほどと同様です。
- 関数を入力する。「=duplication_2nd()」
- 第一引数にデータ範囲を指定し、カンマ(,)を入力
- 続けて第二引数として、インデックス番号を指定します。
- 出力先の範囲に関数をコピーします。
注意:第一引数を選択する際に「F4」キーを押して、範囲を固定してください。
まとめ
「UNIQUE関数」が使用できない環境で、重複データから重複のないデータリストを作成するための関数を自作しました。
ファイルの拡張子を変更する必要がありますが、作業の手間を減らせると思います。試してみてください。
なお、コードの張り付け方がわからない場合は、下記の記事を参考にしてください。
コメント