我需要读取包含多个条目的文件,并构建一个包含文件摘要的表。在读取文件中,可能有一个值的多个条目,在摘要中只需要单个条目,并且必须对它们进行排序。
我实施了两种方法:
我使用了一个循环来检查输出表是否已经包含该值,如果没有添加它。循环遍历整个列表(未排序)
“优化”1:每次插入新值后,表格都会被排序,当找到值时,循环就会中止。
这两种方法都可以完成它们的工作,但需要很长时间。有没有更有效的方法来做到这一点?
修改
为了更好地理解:我的文件看起来像这样
a
d
b
c
a
我的列表/表应如下所示:
a
b
c
d
答案 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]仅限唯一值。
然后对得到的唯一值的结果表进行排序。