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)
我的逻辑是否有意义?我不知道如何编写评论部分.如果这不是最有效的方法,那么有人会提出更好的方法吗?非常感谢!
根据您使用的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 Collection
或dictionary
- 我相信其他人会提供此解决方案.