Office 365中如何判断列内字符串是否以指定数组任意元素开头
解决方案
纯公式方案(优先推荐,适配Office 365 2109版本)
基础前缀匹配
直接输入以下公式即可自动溢出生成符合要求的布尔数组,无需下拉填充:
=BYROW(待校验列范围, LAMBDA(x, OR(STARTSWITH(x, 前缀数组))))
示例(B2:B1000为待校验层级编号列,D1:D20为存储待匹配前缀的区域):=BYROW(B2:B1000, LAMBDA(x, OR(STARTSWITH(x, D1:D20))))
如果前缀为固定常量数组,可直接写为:=BYROW(B2:B1000, LAMBDA(x, OR(STARTSWITH(x, {"1.1","1.2","2.3"}))))
层级匹配优化(适配你的层级编号场景)
为避免前缀1.1误匹配到1.11这类非子级编号,可在匹配时统一补全层级分隔符:=BYROW(B2:B1000, LAMBDA(x, OR(STARTSWITH(x&".", D1:D20&"."))))
兼容性替代方案
若当前版本暂不支持STARTSWITH函数,可替换为LEFT函数实现同等逻辑:=BYROW(B2:B1000, LAMBDA(x, OR(LEFT(x, LEN(D1:D20))=D1:D20)))
VBA自定义函数方案(适合百万级以上超大量数据场景)
- 按
Alt+F11打开VBA编辑器,右键点击当前工作簿→插入→模块,粘贴以下代码:
Function MatchPrefix(checkRng As Range, prefixRng As Range) As Variant Dim arrCheck, arrPrefix, resArr() As Boolean Dim i As Long, j As Long, prefixCnt As Long arrCheck = checkRng.Value arrPrefix = prefixRng.Value prefixCnt = UBound(arrPrefix, 1) ReDim resArr(1 To UBound(arrCheck, 1), 1 To 1) For i = 1 To UBound(arrCheck, 1) resArr(i, 1) = False For j = 1 To prefixCnt If Left(arrCheck(i, 1), Len(arrPrefix(j, 1))) = arrPrefix(j, 1) Then resArr(i, 1) = True Exit For End If Next j Next i MatchPrefix = resArr End Function
- 回到工作表,输入公式即可直接获取结果数组:
=MatchPrefix(B2:B1000, D1:D20)
注意事项
- 待校验列范围可替换为
FILTER(B:B, B:B<>"")自动匹配B列所有非空单元格,无需手动调整行数 - 若层级编号为数值格式,建议先将其转为文本格式避免匹配误差
内容的提问来源于stack exchange,提问作者Dan Hartas
相关产品推荐
相关产品推荐

