我有一个工作表,其中包含约8000行已被过滤。我试图从工作表列中删除重复项来获取值的集合。通过阅读这篇文章,有两种方法可以做到这一点。如果该值不在新集合中,则循环收集并复制到新集合。
或者将列中的数据复制到临时电子表格中,过滤并将数据复制到另一列,然后将其添加到集合中。Excel VBA删除重复vs筛选器
当处理大量数据时,复制过滤器具有最佳性能,但由于必须创建新工作表,因此该过滤器非常笨重。
我还没有看到它,但是有没有办法在内存中做复制过滤器,而不是创建一个工作表来做到这一点?
重述:
Sub GetColumnValues(Ws As Worksheet, Column As Long, CollValues As Collection)
Dim RowIndex As Long
For RowIndex = 1 To GetLastRow(Ws)
If CollValues.Count = 0 Then
CollValues.Add (Ws.Cells(RowIndex, Column).Value)
Else
If IsInCollection(CollValues, Ws.Cells(RowIndex, Column).Value) = False Then
CollValues.Add (Ws.Cells(RowIndex, Column).Value)
End If
End If
Next RowIndex
End Sub
过滤器和复制:
Sub GetColumnValues(Ws As Worksheet, Column As Long, CollValues As Collection)
Dim rowLast As Long
Dim c As Range
Dim tmpWS As Worksheet
Dim tmpWsName As String
tmpWsName = "TempWS"
Call DeleteWs(TsWb, tmpWsName)
Set tmpWS = TsWb.Sheets.Add()
tmpWS.Name = tmpWsName
rowLast = GetLastRow(Ws)
Ws.Range(Ws.Cells(1, Column), Ws.Cells(rowLast, Column)).Copy
tmpWS.Range("A1").PasteSpecial
rowLast = GetLastRow(tmpWS)
tmpWS.Range(tmpWS.Cells(1, 1), tmpWS.Cells(rowLast, 1)).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=tmpWS.Range("B1"), _
Unique:=True
rowLast = GetLastRow(tmpWS)
For Each c In tmpWS.Range(tmpWS.Cells(1, 2), tmpWS.Cells(rowLast, 2))
If Len(c.value) > 0 Then
CollValues.Add (c.value)
End If
Next c
Call DeleteWs(TsWb, tmpWsName)
End Sub
收集的唯一原因是我从outputVal中删除重复项后删除了其他数据。使用集合而不是重新创建新数组更容易。我能想到的唯一方法是创建一个需要删除的单独索引数组,然后执行redim并一次复制到新数组。 虽然你已经给了我一些想法,但谢谢。 – SteveP65
我仍在调查此问题。我发现的一个问题是,如果一个Variant数组中有一个字符串长于255个字符,则Application.Match会失败,并显示类型不匹配错误。如果我将输出数组更改为字符串数组,则可以处理整个数据范围。 – SteveP65
@ SteveP65我添加了另一个功能,你可能想尝试(应该更快,但我无法确定)...显然你会得到一个范围,它可以保留一些你可能想要使用的好处:) –