この関数について
Excelの標準機能で「重複の削除」を利用したことがある人は多いと思います。私は常々データの扱いはセル上では行わず、変数や配列を使うことをおすすめしています。そのためシートやセル上でできることはすべて配列上で実行できるようにする義務が私にはあると考えています。そのために作った関数のひとつです・・・が、ExcelVBA(マクロ)上で重複を取り除くような処理は書き方も難しくなく、他の処理と並列して、例えばFormatでデータの書式を変更しつつ重複を削除していくというようなことができるため、単一の機能しか持たないこの関数の私の使用率はゼロに近いです。さらにいうと、重複を削除するだけという処理はExcelの標準機能として実装されており、わざわざ自動化するほどでもありません。一見便利そうに見える関数ですが未だ日の目をみることがない関数です。
使い方 ①引数
■引数1:target_arr
重複を削除したい配列を渡します。MAX2次元まで
■引数2:duplicate_index
重複を削除するときのキーを指定します。整数もしくは整数を格納した1次元配列を渡します。引数1で2次元配列を渡した場合だけ有効です。ここで指定した整数をインデックスとして重複を判定しレコードを削除します。
例)Array(1,3) ・・・ 1列目と3列目の組み合わせが重複する場合、削除
例)2 ・・・ 2列目が重複する場合、削除
■引数3:var_type_code
vbString、vbVariantのいずれかを指定可能です。戻り値の配列の型を指定できます。指定がなかったり誤っている場合は、Variant型配列を返します。
■引数4:based_index
戻り値の配列の最小のインデックスを指定できます。デフォルトは1です。
使い方 ②戻り値
重複を削除した配列を返します。
使い方 ③サンプルコード
Public Sub Test_DeleteArrayDuplicate()
Dim ws As Worksheet
Dim arr() As Variant
Dim result As String
Dim i As Long, j As Long
ReDim arr(1 To 5, 1 To 3)
Set ws = ThisWorkbook.Worksheets(1)
arr(1, 1) = "AAA": arr(1, 2) = 111: arr(1, 3) = Date
arr(2, 1) = "AAA": arr(2, 2) = 222: arr(2, 3) = Date
arr(3, 1) = "BBB": arr(3, 2) = 222: arr(3, 3) = Date - 1
arr(4, 1) = "BBB": arr(4, 2) = 222: arr(4, 3) = Date - 1
arr(5, 1) = "DDD": arr(5, 2) = 111: arr(5, 3) = Date - 1
arr = DeleteArrayDuplicate(arr, Array(1, 3), vbVariant, 1)
For i = LBound(arr, 1) To UBound(arr, 1) Step 1
For j = LBound(arr, 2) To UBound(arr, 2) Step 1
result = result & """" & arr(i, j) & """" & ","
Next j
result = Mid(result, 1, Len(result) - 1)
result = result & vbCrLf
Next i
Call MsgBox(result)
End Sub
【結果】配列内の重複を削除することができました
サンプルコードを実行すると重複を削除した配列をcsv形式の文字列へ変換し、メッセージ出力します。
Comment