我有一個工作表,其中包含約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我添加了另一個功能,你可能想嘗試(應該更快,但我無法確定)...顯然你會得到一個範圍,它可以保留一些你可能想要使用的好處:) –