2012-02-24 119 views
1

我需要读取包含多个条目的文件并构建一个包含文件摘要的表格。在读取的文件中,可能有多个条目中的一个值,总结中只需要单个条目,并且必须对它们进行排序。VBA:建立无重复表格的高效方法

我已经实现了两个方法:

  1. 我用一个循环来检查,如果输出表已经包含的值,如果不添加它。循环遍历整个列表(未排序)

  2. “优化”1:在每次插入一个新值之后,该表正在进行排序,并且在找到值时循环正在中止。

两种方法都做了他们的工作,但花了很长时间。有没有更有效的方法来做到这一点?

编辑

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

a 
d 
b 
c 
a 

和我的列表/表应该是这样的:

a 
b 
c 
d 
+0

您的问题有点含糊,但您可以使用集合或字典来测试是否已经找到一个值。 – assylias 2012-02-24 11:52:09

+0

与SELECT DISTINCT套装会http://support.microsoft.com/kb/257819? – Fionnuala 2012-02-24 11:56:05

+0

assylias:我增加了一个例子,我希望这会有助于理解。Remou:ADO解决方案看起来不错,但为了更好的兼容性,我只想在标准的excel vba中做到这一点。 – poeschlorn 2012-02-24 12:02:40

回答

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 
+0

另外,如果您将数据放在工作表中并循环遍历单元格,这可能是整体性能的重要因素,但您并未具体指出如何读取数据。 – assylias 2012-02-24 12:21:18

+0

我要弄清楚,如何使用数组而不是迭代通过单元格影响我的算法的效率 – poeschlorn 2012-02-27 08:46:17

1

您是否严格使用VBA?嗯,我认为这个想法可以记录到宏...

我要强调重复值的列,然后做一个滤镜>高级筛选>复制到另一个位置> [X],唯一值仅

然后对它给出的唯一值的结果表进行排序。

3

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

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

从UI,选择您的数据,然后点击数据标签,删除重复。出现提示时,选择所需的选项,然后单击确定。

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 
+0

嗨,我使用Excel 2003.您发布的代码段看起来不错,但在2003年不起作用。 “范围”没有这样的方法。有没有类似的有效解决方法? – poeschlorn 2012-02-27 09:35:40

+0

代码使用的功能仅在Excel 2010中存在。我添加了适用于Excel 2003及更早版本的代码。 – 2012-02-27 21:03:20