我在列中有一个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匹配,则不会转到分隔字符串中的下一项。
任何帮助都感激不尽。
这是一个“有趣”的问题,咬我们每一个人。
仔细查看您的数据:
分隔符不是;
,它是;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"
),当我们什么都没找到时,我们什么都不返回。如果此函数用作UDF,我建议改为返回Variant
,并默认为实际的错误值,例如: CVErr(xlNA)
- 这种方式可以利用Excel自己的失败功能机制。
IsError
检查是因为如果给定的Range
包含#REF!
错误,你不想抛出运行时错误:作为使Excel吞下错误并返回#VALUE!
的UDF - 但是作为从VBA代码调用的VBA函数,这意味着
爆炸
运行时错误13“类型不匹配”,当VBA尝试将字符串与错误值进行比较时。
代替
SeparatedListContains = False
做
SeparatedListContains = splitStr(LBound(splitStr))
您也可以使用本机函数获得相同的结果。
=IF(ISNUMBER(FIND(" "&A2&";"," "&TRIM(C2)&";",1)),A2,FALSE)