如何在 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)))}
备注:
- 以上是单元格 A2 中的值,使用 $B$1:$B$7 的查找范围。
- 注意 {}。这是一个数组公式(使用 Ctrl、Shift 和 Enter 输入)
- 可以修改或删除前导“return '-' if value is nothing”(视情况而定)
公式的作用:
- 前导
IF($A2="","-",
仅仅消除了空格检查(return 在这些情况下是破折号)
- 可以根据需要修改输出(例如
FALSE
)
- 如果选中的范围从来没有空白,这可以删除
ISNUMBER
用于判断后面的MATCH
return是否有效,没有错误,值
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 完全忘记了在检查是否存在逗号时该单元格中存在数字!我必须将单元格的数字格式明确更改为“文本”,然后重新输入值。
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)))}
备注:
- 以上是单元格 A2 中的值,使用 $B$1:$B$7 的查找范围。
- 注意 {}。这是一个数组公式(使用 Ctrl、Shift 和 Enter 输入)
- 可以修改或删除前导“return '-' if value is nothing”(视情况而定)
公式的作用:
- 前导
IF($A2="","-",
仅仅消除了空格检查(return 在这些情况下是破折号)- 可以根据需要修改输出(例如
FALSE
) - 如果选中的范围从来没有空白,这可以删除
- 可以根据需要修改输出(例如
ISNUMBER
用于判断后面的MATCH
return是否有效,没有错误,值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 完全忘记了在检查是否存在逗号时该单元格中存在数字!我必须将单元格的数字格式明确更改为“文本”,然后重新输入值。