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

Arrays VBA-不使用拆分字符串从列中获取唯一值,arrays,excel,vba,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

我使用以下代码将字符串列中的所有唯一值保存到一个数组中,然后通过计算数组的长度得到唯一值的数量

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
Dim tmp作为字符串
Dim prNumbers()作为字符串
作为整数的Dim arrLen
将最后一行设置为整数
以字符串形式显示文本
lastRow=ActiveSheet.Cells(Rows.Count,1).End(xlUp).Row
Dim rngPR As范围
设置rngPR=范围(“B2:B”和最后一行)
如果不是,那么rngPR什么都不是
对于rngPR中的每个单元
如果(单元格“”)和(仪表(tmp,单元格)=0),则
tmp=tmp&单元&“|”
如果结束
下一个细胞
如果结束
如果Len(tmp)>0,则tmp=Left(tmp,Len(tmp)-1)
prNumbers=Split(tmp,“|”)
'查找数组长度
arrLen=UBound(PRnumber)+1
但是,当我运行此代码时,arrLen是一个小于列中唯一项的实际数量的数字(我通过对唯一项进行手动数据检查来了解这一点)。列中的数据不包含任何“|”字符,仅包含数字


有什么问题吗?是否有其他方法可以获取数组中唯一项的数量并确定其长度?

此检查可能就是问题所在:

(InStr(tmp, cell) = 0)
例如,如果一个单元格是
hello
,而后面的一个单元格是
ello
,则不包括它,因为
ello
hello
的一部分,因此是
tmp
字符串

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

(InStr(tmp, "|" & cell & "|") = 0)
并以首字母
tmp=“|”
开头

因此,如果当前的
tmp
|foo | hello | bar |
,则搜索
| ello |
,并得到一个0


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


请参阅-->
KeyExistsInCollection

此检查可能就是问题所在:

(InStr(tmp, cell) = 0)
例如,如果一个单元格是
hello
,而后面的一个单元格是
ello
,则不包括它,因为
ello
hello
的一部分,因此是
tmp
字符串

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

(InStr(tmp, "|" & cell & "|") = 0)
并以首字母
tmp=“|”
开头

因此,如果当前的
tmp
|foo | hello | bar |
,则搜索
| ello |
,并得到一个0


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


请参阅-->
KeyExistsInCollection

谢谢您的帮助。我现在在数组中获得了更多的条目,但仍然不是所有唯一的条目。我真的不明白这怎么可能!(我有722个唯一条目,得到的数组长度仅为698)。另外,我是否应该在拆分之前再次删除开头的“|”?嗯,很有趣。能否将显示问题的示例工作簿上载到文件宿主?是的,拆分前应删除起始的
“|”
,以避免数组元素为空。@CornelVerster可能有值相同但数字格式不同的单元格?你可以试试
cell.Text
而不是
cell
@Andre:这就是我要看的范围。谢谢你。我现在在数组中获得了更多的条目,但仍然不是所有唯一的条目。我真的不明白这怎么可能!(我有722个唯一条目,得到的数组长度仅为698)。另外,我是否应该在拆分之前再次删除开头的“|”?嗯,很有趣。能否将显示问题的示例工作簿上载到文件宿主?是的,拆分前应删除起始的
“|”
,以避免数组元素为空。@CornelVerster可能有值相同但数字格式不同的单元格?你可以试试
cell.Text
而不是
cell
@Andre:这就是我要看的范围。