【问题标题】:How to search for a number in a column with comma separated values in Excel如何在 Excel 中用逗号分隔值的列中搜索数字
【发布时间】:2021-12-26 05:59:42
【问题描述】:

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 

This UDF:

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 列中出现多次。

我在这里做错了什么?

【问题讨论】:

  • 绝对不需要 VBA。由于这些问题经常被问到,因此对 SO 进行良好搜索应该会产生结果。在我的手机上,但我相信有人可以找到重复的。提示,您需要对结果求和,不要溢出它们。并考虑误报,用逗号括起来值

标签: excel vba user-defined-functions


【解决方案1】:

如果您有权访问它(即 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")

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

【讨论】:

  • 我必须将单元格的数字格式明确更改为“文本”,然后重新输入值 - 或者您可以在其前面加上 '
  • @chrisneilsen ...我不敢相信我忘记了这一点。我会把它归咎于凌晨 1 点,然后注销 >_
【解决方案2】:

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

假设确实如此,以下函数应该可以解决问题:

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

注意事项:

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

公式的作用:

  1. 前导IF($A2="","-", 仅消除了对空格的检查(在这些情况下返回破折号)
    • 可以适当修改输出(例如更改为FALSE
    • 如果选中的范围从不包含空格,则可以将其删除
  2. ISNUMBER 用于确定后续的MATCH 是否返回一个有效的、非错误的值
  3. MATCH 与通配符 match_type = 0 完全匹配:
    • Lookup_Value 用通配符 * 和逗号括起来(例如 2 => *,2,*
    • 同样,查找(数组)值用逗号括起来(例如 1,102 => ,1,102,

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


假设有一组更复杂的条件并且需要 UDF,这是一种方法。
注意:这旨在作为您可能/可能不需要扩展/适应的基本代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多