创建一个没有重复VBA的新列?

sre*_*sht 1 excel vba excel-vba

我有一列单元格,其值如下所示:

a
a
b
b
c
c
c
c
d
e
f
f
Run Code Online (Sandbox Code Playgroud)

等等

我希望获取非重复值并将它们粘贴到新列中.我的伪代码如下:

ActiveSheet.Range("a1").End(xlDown).Select
aend = Selection.Row
for acol= 1 to aend
    ActiveSheet.Range("b1").End(xlDown).Select
    bend = Selection.Row
        'if Cells(1,acol).Value <> any of the values in the range Cells(2,1).Value
        'to Cells(2,bend).Value, then add the value of Cells(1,acol) to the end of 
        'column b.
Run Code Online (Sandbox Code Playgroud)

我的逻辑是否有意义?我不知道如何编写评论部分.如果这不是最有效的方法,那么有人会提出更好的方法吗?非常感谢!

i_s*_*nes 9

根据您使用的Excel版本,您可以使用一些内置的Excel功能来获得您想要的 - 整个解决方案取决于您使用VBA的技能水平.

Excel 2003:

您可以使用范围的Advancedfilter方法(文档)来获取唯一值并将它们复制到目标区域.例:

With ActiveSheet
    .Range("A1", .Range("A1").End(xlDown)).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("B1"), Unique:=True
End With
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

最后一个参数Header控制是否将源数据的第一个单元格复制到目标(如果它设置为true,则该方法与AdvancedFilter方法类似).

如果您使用的是"更纯粹"的方法,那么您可以使用VBA Collectiondictionary- 我相信其他人会提供此解决方案.