【发布时间】:2021-12-09 22:34:50
【问题描述】:
我有一个专栏,其中列出了特殊的基因组。还有另一列基因组,其中一些细胞有多个条目,以逗号分隔。我想要检查第二列的每个单元格是否是第一列中的任何条目。如果第二列中的单元格只有一个元素,我可以使用=NOT(ISERROR(MATCH(B2,$A$2:$A$120,0))) 来完成,但由于某些查询单元格有多个元素,这对那些元素不起作用。有什么建议吗?
【问题讨论】:
我有一个专栏,其中列出了特殊的基因组。还有另一列基因组,其中一些细胞有多个条目,以逗号分隔。我想要检查第二列的每个单元格是否是第一列中的任何条目。如果第二列中的单元格只有一个元素,我可以使用=NOT(ISERROR(MATCH(B2,$A$2:$A$120,0))) 来完成,但由于某些查询单元格有多个元素,这对那些元素不起作用。有什么建议吗?
【问题讨论】:
试试SUMPRODUCT 和SEARCH:
=IF(SUMPRODUCT(--ISNUMBER(SEARCH(","&$A$2:$A$5&",",","&B2&","))),"Y","N")
说明:
我将在示例中解释单元格C2 的逻辑。
在第一步中,公式从范围和结果中获取值:
=IF(SUMPRODUCT(--ISNUMBER(SEARCH({",AA,",",CC,",",EE,",",Gg,"},",AA,BB,"))),"Y","N")
SEARCH 函数返回找到的字符串的位置数组,如果没有找到则返回错误:
=IF(SUMPRODUCT(--ISNUMBER({1,#VALUE,#VALUE,#VALUE})),"Y","N")
ISNUMBER 返回布尔数组:
=IF(SUMPRODUCT(--{TRUE,FALSE,FALSE,FALSE}),"Y","N")
-- 将布尔值转换为整数:
=IF(SUMPRODUCT({1,0,0,0}),"Y","N")
SUMPRODUCT 总结一下:
=IF(1,"Y","N")
IF 如果第一个参数是非零值,则返回 TRUE 部分。
【讨论】:
如果您需要保留基因组列中的行,则将基因组列分为 3 列,并在 3 个新列 B、C 和 D 中进行 MATCH。
=NOT(ISERROR(MATCH(A2,$B$2:$D$120,0)))
编辑:或者您可以尝试使用 VB 宏和正则表达式:
Public Function RegexExecute(str As String, reg As String, _
Optional matchIndex As Long, _
Optional subMatchIndex As Long) As String
On Error GoTo ErrHandl
Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = reg
regex.Global = Not (matchIndex = 0 And subMatchIndex = 0) 'For efficiency
If regex.test(str) Then
Set matches = regex.Execute(str)
RegexExecute = matches(matchIndex).SubMatches(subMatchIndex)
Exit Function
End If
ErrHandl:
RegexExecute = CVErr(xlErrValue)
End Function
【讨论】: