【问题标题】:Excel determine if two cells match based on consecutive matching characters [closed]Excel根据连续匹配字符确定两个单元格是否匹配[关闭]
【发布时间】:2018-11-16 20:00:25
【问题描述】:

如何在两个单元格之间进行部分字符串匹配,其中部分字符串可以位于单元格中的任何位置。

示例:单元 1 可能有 AXG58934x0,单元 2 可能有 05893400 或者单元 1 可能有 5893400A,单元 2 可能有 X1000000589340000y 单元格应与“58934”部分匹配。

希望 Excel 查看单元格 1 和单元格 2,如果找到一个字符匹配,则查看下一个字符,如果匹配则查看下一个字符,如果 5 个连续字符匹配,则返回单词“匹配” ”。

【问题讨论】:

  • 这可能需要 VBA
  • 我已经尝试了我能想到的所有可能的公式,所以我认为你是对的,VBA 将是唯一的方法。你会碰巧知道一些可行的方法吗?
  • 看看“模糊查找”有很多插件。
  • 已经试过并下载了插件。它不起作用。它被击中或错过。有时它说有部分匹配,有时它说不匹配,当我看到有时。
  • 你说有很多插件?我只找到了MS的那个。如果你能指出我正确的方向来添加一个可以工作的插件,我将不胜感激!

标签: excel string character match partial


【解决方案1】:

[VBA 解决方案] 实施:

  1. 点击 Alt + F11 打开 Visual Basic
  2. VBAProject 查看器中找到您正在编写的图书
  3. 右键单击并选择Insert Module
  4. 将以下代码粘贴到代码空间中
  5. 回到excel,你可以像调用任何函数一样调用函数=CSTMATCH()

如下图所示,该函数需要 2 个输入(第一个字符串和第二个字符串)


Option Explicit

Public Function CSTMatch(Target1 As Range, Target2 As Range) As Boolean

CSTMatch = False
Dim String1 As String, String2 As String, i As Long

'The goal here is to assign the larger String to the variable String1
If Len(Target1) >= Len(Target2) Then
    String1 = Target1
    String2 = Target2
Else
    String1 = Target2
    String2 = Target1
End If

For i = 1 To Len(String1) - 4
    If Mid(String1, i, 5) <> "00000" Then
        If InStr(String2, Mid(String1, i, 5)) Then
            CSTMatch = True
            Exit Function
        End If
    End If
Next i

End Function

UDF 的输入/输出示例如下

【讨论】:

  • 你太棒了!!!那完全奏效了!非常感谢!我希望我很久以前就问过这个问题!
  • 绒毛是狡猾的野兽。请注意,test1test1 也将返回为 FALSE。也就是说,这个解决方案具有足够的简单性和足够少的误报(或真负)值得支持
  • 如果连续匹配全为零(00000),可以对模块进行一次修改以显示 FALSE 吗?
  • 只要字母或数字的任意 5 个组合对我有效。如果我只需要匹配数字,我确实看到了尝试 IsNumeric 的解决方案。我现在看到的唯一问题是,当其余字符不同时,五个连续的零被视为匹配。
  • 对不起.. 实际上我还有另一个问题。除了希望模块忽略五个连续的零之外,它还可以忽略分号吗?我在两个值之间有一个分号分隔符,发现它说它是匹配的,因为另一个值的最后两位和前两位与中间的分号匹配,使它们看起来像匹配字符串。
【解决方案2】:

灵感来自@urdearboy

这将为您提供最短字符串中连续字符与最长字符串中连续字符的比率

Option Explicit

Public Function CSTMatch2(Target1 As Range, Target2 As Range) As Double

CSTMatch2 = 0

Dim String1 As String, String2 As String, i As Long, j As Long, noChar As Long

noChar = 0

'The goal here is to assign the larger String to the variable String1
If Target1 = Target2 Then
    CSTMatch2 = 1
    Exit Function
End If

If Len(Target1) >= Len(Target2) Then
    String1 = Target1
    String2 = Target2
Else
    String1 = Target2
    String2 = Target1
End If

For j = 1 To Len(String2)
    For i = 1 To Len(String1) - j
        If InStr(String2, Mid(String1, i, j)) Then
            noChar = noChar + 1
            Exit For
        End If
    Next i
Next j

Debug.Print noChar, Len(String1), Len(String2)
CSTMatch2 = (noChar) / (Len(String1))


End Function

示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多