2016-10-04 20 views
0

我使用以下代碼將字符串列中的所有唯一值保存到數組中,然後通過計算長度來獲取唯一值的數量的陣列。VBA - 從列中獲取唯一值而不使用拆分字符串

Dim tmp As String 
Dim prNumbers() As String 
Dim arrLen As Integer 
Dim lastRow As Integer 
Dim txt As String 

lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 

Dim rngPR As Range 
Set rngPR = Range("B2:B" & lastRow) 

If Not rngPR Is Nothing Then 
    For Each cell In rngPR 
     If (cell <> "") And (InStr(tmp, cell) = 0) Then 
      tmp = tmp & cell & "|" 
     End If 
    Next cell 
End If 

If Len(tmp) > 0 Then tmp = Left(tmp, Len(tmp) - 1) 

prNumbers = Split(tmp, "|") 

'Find the array length 
arrLen = UBound(prNumbers) + 1 

然而,當運行此代碼,arrLen比唯一條目的該列中的實際量小的數目(I通過執行用於獨特條目的手動數據檢查知道這一點。)數據在列不不包含任何「|」字符,只有數字。

問題是什麼?是否有一種方法可以將唯一條目數量併入數組並確定其長度?

+1

http://www.get-digital-help.com/2010/10/22/excel-udf-count-unique-distinct-values-in-a-large -dataset/ – Slai

回答

3

這可能檢查的問題是:

(InStr(tmp, cell) = 0) 

如果如一個單元格爲hello,後面的單元格爲ello,因此ellohello的一部分,因此tmp字符串將不包括在內。

去與你當前的方法,將其更改爲

(InStr(tmp, "|" & cell & "|") = 0) 

,並與初始tmp = "|"開始。

因此,如果當前tmp|foo|hello|bar|,你搜索它|ello|,並獲得了0.1


一個更簡單的方法是使用如一個集合,檢查每個新單元是否已經包含在集合中。

http://www.cpearson.com/Excel/CollectionsAndDictionaries.htm - >KeyExistsInCollection

+0

非常感謝。我現在在我的數組中獲得了更多的條目,但仍然不是所有獨特的條目。我真的不知道這是可能的! (我有722個唯一的條目,並獲得長度爲698的數組)。另外,我應該刪除「|」在分裂之前再次開始? –

+0

嗯,有趣。您能否將顯示問題的示例工作簿上載到文件主機?是的,開始的'「|」''應該在分割之前被移除,以避免一個空的數組元素。 – Andre

+0

@CornelVerster也許你有單元具有相同的值,但數字格式不同?你可以嘗試'cell.Text'而不是'cell' – Slai

相關問題