根据您使用的 Excel 版本,您可以使用一些内置的 Excel 功能来获得您想要的 - 整个解决方案取决于您对 VBA 的技能水平。
Excel 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
Excel 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 方法)。
如果您追求“更纯粹”的方法,那么您可以使用 VBACollection
或dictionary
- 我相信其他人会为此提供解决方案。