VBA:有效的方法来build立一个没有重复的表

我需要读取包含多个条目的文件,并build立一个包含文件摘要的表格。 在读文件中,可能有多个条目的值,在总结中只需要单个条目,并且它们必须被sorting。

我已经实现了两种方法:

  1. 我用一个循环来检查输出表是否已经包含了这个值,如果不加上的话。 循环遍历整个列表(未sorting)

  2. “优化”为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。