VBA:有效的方法来build立一个没有重复的表
我需要读取包含多个条目的文件,并build立一个包含文件摘要的表格。 在读文件中,可能有多个条目的值,在总结中只需要单个条目,并且它们必须被sorting。
我已经实现了两种方法:
-
我用一个循环来检查输出表是否已经包含了这个值,如果不加上的话。 循环遍历整个列表(未sorting)
-
“优化”为1:在每次插入一个新值之后,表格被sorting,并且当find一个值时循环被中止。
两种方法都做了他们的工作,但花了很长时间。 有没有更有效的方法来做到这一点?
编辑
为了更好的理解:我的文件看起来像这样
a d b c a
和我的列表/表应该是这样的:
a b c d
这是一个简单的例子,使用一个词典:
Sub test() Dim a As Variant Dim dict As Variant Dim i As Long Set dict = CreateObject("Scripting.Dictionary") ReDim a(1 To 4) As Variant a(1) = "a" a(2) = "b" a(3) = "c" a(4) = "a" For i = 1 To 4 If Not dict.exists(a(i)) Then dict.Add a(i), i Next i MsgBox "array size = " & UBound(a, 1) & " and dict size = " & dict.Count 'respectively 4 and 3 End Sub
如果您使用的是Excel 2010,则内置了删除重复项的function。
我会从您的文件中导入所有数据,然后删除重复项。
在用户界面中select您的数据,然后点击“ 数据”选项卡和“ 删除重复项” 。 出现提示时,select所需的选项,然后单击确定。
VBA提供了相同的function。
Sub Remove_Duplicates() ActiveSheet.Range("$A$1:$B$500").RemoveDuplicates _ Columns:=Array(1, 2), Header:=xlYes End Sub
在Excel 2003和更早版本中,可以使用此VBA。 它使用内置的高级filterfunction。
Sub Remove_Duplicates_2003() Range("A1:B500").AdvancedFilter Action:=xlFilterCopy, _ CopyToRange:=Range("C1"), Unique:=True Columns("A:B").Delete Shift:=xlToLeft End Sub
您是否严格使用VBA? 那么,我想这个想法可以logging成一个macros…
我会突出显示重复值的列,然后执行filter>高级filter>复制到其他位置> [x]仅限于唯一值 。
然后对产生的唯一值表格进行sorting。