VBA:因前缀导致ISNUMBER函数返回空值的问题解决
解决带前缀编号的匹配问题
我懂你的困扰——原来的精确匹配要求A列员工编号和tStatus表里的编号完全一致,但现在A列偶尔会带1-2个字母前缀,直接匹配就失效了。咱们可以通过提取编号的纯数字核心部分来绕开前缀的干扰,不管有没有前缀,只要数字部分对应上就能匹配成功。
修改后的VBA代码
Sub PlaceFormula() Dim ws As Worksheet Dim lr As Long Dim lc As Long With Application .Calculation = xlCalculationManual .ScreenUpdating = False .EnableEvents = False End With Set ws = Sheets("Main") lr = ws.Cells(Rows.Count, 1).End(xlUp).Row lc = ws.Cells(1, Columns.Count).End(xlToLeft).Column ' 替换为提取数字部分的匹配公式 ws.Range("B2", ws.Cells(lr, lc)).FormulaArray = _ "=IF(SUMPRODUCT(--(TEXTJOIN("""",TRUE,IFERROR(MID(tStatus[Employee Number],ROW($1:$100),1)*1,""""))=TEXTJOIN("""",TRUE,IFERROR(MID($A2,ROW($1:$100),1)*1,"""")))*(tStatus[Wk Number]=B$1))>0,""Match"",""""" ' 把公式转成值,提升性能 ws.Range("B2", ws.Cells(lr, lc)).Value = ws.Range("B2", ws.Cells(lr, lc)).Value With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True .EnableEvents = True End With End Sub
公式工作原理
核心逻辑是剥离前缀、只保留纯数字进行匹配:
TEXTJOIN("",TRUE,IFERROR(MID(cell,ROW($1:$100),1)*1,"")):逐个检查单元格的每个字符,把数字字符保留并拼接成纯数字字符串,自动过滤掉所有字母前缀。SUMPRODUCT会统计同时满足两个条件的记录:- A列提取的纯数字编号和
tStatus表中员工编号的纯数字部分完全一致 - 周数(表头B$1)匹配
- A列提取的纯数字编号和
- 只要存在至少一条符合条件的记录,就返回"Match",否则返回空值。
这个方案不管A列或tStatus表中的编号有没有前缀,都能准确匹配到对应的员工和周数组合。
内容的提问来源于stack exchange,提问作者TurboCoder
相关产品推荐
相关产品推荐

