使用している Excel のバージョンに応じて、組み込みの Excel 機能を使用して必要なものを取得できます。ソリューション全体は、VBA のスキルのレベルによって異なります。
エクセル2003:
Advancedfilter
範囲のメソッド (ドキュメント) を使用して、一意の値を取得し、それらをターゲット領域にコピーできます。例:
With ActiveSheet
.Range("A1", .Range("A1").End(xlDown)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("B1"), Unique:=True
End With
B1
一意の値をコピーする列の最初のセルはどこですか。この方法の唯一の問題は、コピー元の列の最初の行 ("A1") がコピー先の範囲にコピーされることです。これは、AdvancedFilter メソッドが最初の行がヘッダーであると想定しているためです。
したがって、追加のコード行を追加すると、次のようになります。
With ActiveSheet
.Range("A1", .Range("A1").End(xlDown)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("B1"), Unique:=True
.Range("B1").Delete Shift:=xlShiftUp
End With
エクセル 2007 / 2010 :
上記と同じ方法を使用することも、RemoveDuplicates
方法 (ドキュメント) を使用することもできます。これは AdvancedFilter メソッドと似ていRemoveDuplicates
ますが、インプレースで動作する点が異なります。つまり、ソース列の複製を作成してからフィルタリングを実行する必要があります。次に例を示します。
With ActiveSheet
.Range("A1", .Range("A1").End(xlDown)).Copy Destination:=.Range("B1")
.Range("B1", .Range("B1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo
End With
最後のパラメーターHeader
は、ソース データの最初のセルがコピー先にコピーされるかどうかを制御します (true に設定されている場合、このメソッドは AdvancedFilter メソッドと同様です)。
「より純粋な」方法を求めている場合は、VBAを使用するCollection
かdictionary
、他の誰かがこれで解決策を提供すると確信しています。