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

问题描述 投票:1回答:3

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

任何帮助都感激不尽。

vba excel-vba excel
3个回答
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"),当我们什么都没找到时,我们什么都不返回。如果此函数用作UDF,我建议改为返回Variant,并默认为实际的错误值,例如: CVErr(xlNA) - 这种方式可以利用Excel自己的失败功能机制。

IsError检查是因为如果给定的Range包含#REF!错误,你不想抛出运行时错误:作为使Excel吞下错误并返回#VALUE!的UDF - 但是作为从VBA代码调用的VBA函数,这意味着 爆炸 运行时错误13“类型不匹配”,当VBA尝试将字符串与错误值进行比较时。


0
投票

代替

SeparatedListContains = False

SeparatedListContains = splitStr(LBound(splitStr))

0
投票

您也可以使用本机函数获得相同的结果。

=IF(ISNUMBER(FIND(" "&A2&";"," "&TRIM(C2)&";",1)),A2,FALSE)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.