我在列中有一个ID列表,我想将它们与分号分隔的字符串进行比较,并确定哪个ID是其中的一部分。
我有以下代码,部分有效:
Function SeparatedListContains(ByVal str As String, ByVal v As Range, _
Optional ByVal delimiter As String = ";") As String
Dim i As Long
Dim cell As Range
Dim splitStr() As String
splitStr = Split(str, delimiter)
SeparatedListContains = False
For i = LBound(splitStr) To UBound(splitStr)
For Each cell In v
If splitStr(i) = cell Then
SeparatedListContains = cell
End If
Next cell
Next i
End Function
代码仅比较分隔字符串中的第一项,如果第一项与ID不匹配,则不会转到分隔字符串中的下一项。
任何帮助将不胜感激。
答案 0 :(得分:1)
这是一个有趣的"咬我们每一个人的问题。
仔细查看您的数据:
分隔符不是;
,而是;WHITESPACE
。
通过拆分;
,您在第一个索引中获得的值如下所示:
A123
C123
C456
但下一个索引中的数据如下所示:
_C123
_A456
_D789
_
表示空格。 Debug.Print "C123" = " C123"
将打印False
。
因此,在比较它们之前,解决方案是Trim
值 - 然后只是拯救:
SeparatedListContains = vbNullString
For i = LBound(splitStr) To UBound(splitStr)
For Each cell In v
Dim value As Variant
value = cell.value
If Not IsError(value) Then
If Trim$(splitStr(i)) = Trim$(value) Then
SeparatedListContains = Trim$(value)
Exit Function
End If
End If
Next
Next
修剪value
可能看起来过分,但我的经验是,如果你现在不修剪它,你无论如何都要修剪它。
通过Exit Function
立即救助,可以避免不必要的迭代。
默认为vbNullString
而不是False
(实际为"False"
),当我们找到 nothing 时,我们会返回 nothing 。如果此函数用作UDF,我建议改为返回Variant
,并默认为实际错误值,例如: CVErr(xlNA)
- 这样就可以利用Excel自己的失败功能机制。
IsError
检查是因为如果给定的Range
包含#REF!
错误,您不想抛出运行时错误:作为生成Excel的UDF吞下错误并返回#VALUE!
- 但作为从VBA代码调用的VBA函数,这意味着爆炸运行时错误13"类型不匹配",当VBA尝试比较时一个错误值的字符串。
答案 1 :(得分:0)
而不是
SeparatedListContains = False
DO
SeparatedListContains = splitStr(LBound(splitStr))
答案 2 :(得分:0)
您也可以使用本机函数获得相同的结果。
=IF(ISNUMBER(FIND(" "&A2&";"," "&TRIM(C2)&";",1)),A2,FALSE)