列表中的哪些单元格是字符串?

时间:2017-12-20 02:20:25

标签: vba excel-vba excel

我在列中有一个ID列表,我想将它们与分号分隔的字符串进行比较,并确定哪个ID是其中的一部分。

Data

我有以下代码,部分有效:

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不匹配,则不会转到分隔字符串中的下一项。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这是一个有趣的"咬我们每一个人的问题。

仔细查看您的数据:

OP's data

分隔符不是;,而是;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)