VBA 如何实现忽略#后缀的字符串相等匹配
实现方案
核心逻辑不需要改动原有匹配的判断规则,只需要对参与匹配的字符串做统一预处理——将字符串中#及之后的所有内容截断,用截断后的有效文本做匹配,就能实现leve mur#1和leve mur判定为相等的效果。
第一步:封装通用预处理函数
直接在你的VBA工程里插入这个函数,专门处理带#的字符串:
Function TrimAfterHash(ByVal rawStr As String) As String Dim hashIndex As Long ' 定位字符串中第一个#的位置 hashIndex = InStr(1, rawStr, "#", vbBinaryCompare) ' 找到#就截取前面的部分,找不到就返回原字符串 If hashIndex > 0 Then TrimAfterHash = Left(rawStr, hashIndex - 1) Else TrimAfterHash = rawStr End If End Function
这个函数已经把
InStr查找#位置的逻辑完全封装在内部,你不需要手动计算字符位置,只需要调用函数拿到处理好的纯文本,就可以直接做匹配判定。
- 处理效果示例:
- 输入
leve mur#1,输出leve mur - 输入
测试无井号的内容,输出测试无井号的内容 - 输入
带#号在开头#xxx,输出空字符串
- 输入
第二步:适配你现有的Match代码
根据#实际出现的位置,对应调整代码即可:
场景1:#只出现在你要查找的输入值LookingHead.Value上
仅需要对查找值做预处理,再传入原有Match逻辑,改动量最小:
Dim oHead As Long Dim lookupTarget As String ' 预处理查找值,去掉#后的内容 lookupTarget = TrimAfterHash(LookingHead.Value) oHead = wF.Match(lookupTarget, _ Range("A1", Cells(1, Range("A1").SpecialCells(xlCellTypeLastCell).Column)), False)
场景2:#可能同时出现在查找值、第一行表头单元格的内容里
工作表原生的Match函数无法直接跳过单元格里的#内容,需要先把表头区域的所有值做统一预处理,存在临时数组里再做匹配:
Dim oHead As Long Dim headerRng As Range Dim processedArr As Variant Dim cell As Range Dim idx As Long ' 定位第一行实际有内容的表头范围 Set headerRng = Range("A1", Cells(1, Range("A1").SpecialCells(xlCellTypeLastCell).Column)) ' 初始化数组存放预处理后的表头值 ReDim processedArr(1 To headerRng.Cells.Count) idx = 0 For Each cell In headerRng idx = idx + 1 ' 对每个表头单元格同样做#截断处理 processedArr(idx) = TrimAfterHash(cell.Value) Next ' 对查找值预处理后,在数组中匹配位置 oHead = wF.Match(TrimAfterHash(LookingHead.Value), processedArr, False)
补充调整说明
如果匹配时需要完全忽略字符串首尾的多余空格,可以在预处理函数的返回值外层加Trim(),避免无意义的空格差异导致匹配失败。
内容的提问来源于stack exchange,提问作者Chayma B's
相关产品推荐
相关产品推荐

