如何在 Excel 中用逗号分隔值搜索列中的数字

How to search for a number in a column with comma separated values in Excel

Column A Column B
1
2 1
3 1
4
5 1,4
etc

正在尝试找出如何搜索 A 列中的数字是否存在于 B 列中的任何位置。

到目前为止我已经尝试过:

=IF(ISNUMBER(SEARCH(A2,B:B)),"YES","NO") which returns #spill 

:

Function CheckOne(rng As Range, chkValue As Long) As Boolean
    Dim n
    For Each n In Split(rng.Value, ",")
        If CLng(n) = chkValue Then
            CheckOne = True
            Exit For
        End If
    Next n
End Function

Another UDF:

Function CommaSeparatedListContains(ByVal csv As String, ByVal v As String, _
        Optional ByVal delimiter As String = ",") As Boolean
    Dim i As Long
    Dim splitCsv() As String
    splitCsv = Split(csv, delimiter)
    CommaSeparatedListContains = False
    For i = LBound(splitCsv) To UBound(splitCsv)
        If splitCsv(i) = v Then
            CommaSeparatedListContains = True
            Exit Function
        End If
    Next i
End Function

这也没有用,因为我得到了#VALUE!错误

我怀疑是因为我要查找的值在 B 列中出现了不止一次。

我做错了什么?

您的示例表很少,我不确定它是否涵盖了整个范围。

假设是这样,下面的函数应该可以解决问题:

{=IF($A2="","-",ISNUMBER(MATCH("*,"&$A2&",*",","&$B:$B&",",0)))}

备注:

  1. 以上是单元格 A2 中的值,使用 $B$1:$B$7 的查找范围。
  2. 注意 {}。这是一个数组公式(使用 Ctrl、Shift 和 Enter 输入)
  3. 可以修改或删除前导“return '-' if value is nothing”(视情况而定)

公式的作用:

  1. 前导 IF($A2="","-", 仅仅消除了空格检查(return 在这些情况下是破折号)
    • 可以根据需要修改输出(例如 FALSE
    • 如果选中的范围从来没有空白,这可以删除
  2. ISNUMBER用于判断后面的MATCHreturn是否有效,没有错误,值
  3. MATCH 是带通配符的完全匹配 match_type = 0
    • Lookup_Value 包含在通配符 * 和逗号中(例如 2 => *,2,*
    • 同样,查找(数组)值用逗号括起来(例如 1,102 => ,1,102,

因此,唯一有效的匹配将是在逗号分隔的子字符串中完全匹配的值。


假设有一组更复杂的条件并且需要 UDF,这是一种方法。
注意:这是您 may/may 不需要 expand/adapt 的基本代码。

Public Function CheckOne(rgValue As Range, rgLookup As Range) As Boolean

    Dim in1, vnSplit, rgC As Range
    
''' Compare to each cell in check range
    For Each rgC In rgLookup.Cells
    
    ''' Skip empty cells
        If rgC <> "" Then
        
        ''' Split based on comma separation (if any)
            vnSplit = Split(rgC.Value, ",")
            
        ''' No comma separation: Just compare to the value
            If UBound(vnSplit) = 0 Then
                If rgValue = rgC Then CheckOne = True: Exit Function
            
        ''' Has comma seperation: Compare to each sub-value
            Else
                For in1 = 0 To UBound(vnSplit)
                    If rgValue = Val(vnSplit(in1)) Then CheckOne = True: Exit Function
                Next in1
            End If
        End If
    
    Next rgC

End Function

如果您有权访问它(即 Office-365 或 Office 2019),那么我建议先使用 TEXTJOIN 来“展平”这些值。这还可以让您消除示例中值 2 和 3 的误报,方法是要求分隔符(在本例中为逗号)位于值之前和之后:

=IF(ISNUMBER(SEARCH(","&A2&",", ","&TEXTJOIN(",",True,B:B)&",")),"YES","NO")

您还可以使用 SUBSTITUTE 来消除可能已放入的任何空格,这样“1, 2, 3”将被视为与“1,2,3”相同):

=IF(ISNUMBER(SEARCH(","&A2&",", SUBSTITUTE(","&TEXTJOIN(",",True,B:B)&","," ",""))),"YES","NO")

然而,我在测试时确实发现了一个烦人的问题:值“100,101,102”被Excel视为数字 一亿、一百零一千、一百零二(即 100101102),并用逗号分隔千位——因此 Excel 完全忘记了在检查是否存在逗号时该单元格中存在数字!我必须将单元格的数字格式明确更改为“文本”,然后重新输入值。