VBA:构建没有重复的表的有效方法

时间:2012-02-24 11:47:19

标签: performance excel vba

我需要读取包含多个条目的文件,并构建一个包含文件摘要的表。在读取文件中,可能有一个值的多个条目,在摘要中只需要单个条目,并且必须对它们进行排序。

我实施了两种方法:

  1. 我使用了一个循环来检查输出表是否已经包含该值,如果没有添加它。循环遍历整个列表(未排序)

  2. “优化”1:每次插入新值后,表格都会被排序,当找到值时,循环就会中止。

  3. 这两种方法都可以完成它们的工作,但需要很长时间。有没有更有效的方法来做到这一点?

    修改

    为了更好地理解:我的文件看起来像这样

    a
    d
    b
    c
    a
    

    我的列表/表应如下所示:

    a
    b
    c
    d
    

3 个答案:

答案 0 :(得分:3)

如果您使用的是Excel 2010,则内置功能可以删除重复项。

我会从您的文件导入所有数据,然后删除重复项。

在用户界面中,选择您的数据,然后点击数据标签,然后点击删除重复项。出现提示时,选择所需的选项,然后单击“确定”。

VBA提供相同的功能。

Sub Remove_Duplicates()
   ActiveSheet.Range("$A$1:$B$500").RemoveDuplicates _
    Columns:=Array(1, 2), Header:=xlYes
End Sub

在Excel 2003及更早版本中,可以使用此VBA。它使用内置的高级过滤功能。

Sub Remove_Duplicates_2003()

    Range("A1:B500").AdvancedFilter Action:=xlFilterCopy, _
     CopyToRange:=Range("C1"), Unique:=True

    Columns("A:B").Delete Shift:=xlToLeft

End Sub

答案 1 :(得分:2)

这是一个使用词典的简单示例:

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

答案 2 :(得分:1)

您是否真的想要使用VBA?好吧,我认为这个想法可以录制成一个宏......

我会突出显示重复值的列,然后执行过滤器>高级过滤器>复制到另一个位置> [x]仅限唯一值

然后对得到的唯一值的结果表进行排序。