VBA - 从列中获取唯一值而不使用拆分字符串

时间:2016-10-04 12:00:09

标签: arrays excel 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是一个小于列中唯一条目实际数量的数字(我通过对唯一条目进行手动数据检查来了解这一点。)列中的数据不包含任何& #34; |&#34;字符,只有数字。

问题是什么?是否有另一种方法可以将唯一条目的数量输入数组并确定其长度?

1 个答案:

答案 0 :(得分:3)

这个检查可能是问题所在:

(InStr(tmp, cell) = 0)

如果是单元格为hello,后面的单元格为ello,因为ellohello的一部分,因此tmp字符串将不包括在内。

要使用您当前的方法,请将其更改为

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

并以初始tmp = "|"开头。

因此,如果当前tmp|foo|hello|bar|,则会搜索|ello|,并获得0。

更直接的方法是使用例如一个集合,检查每个新单元格是否已包含在集合中。

请参阅http://www.cpearson.com/Excel/CollectionsAndDictionaries.htm - &gt; KeyExistsInCollection