在Excel VBA项目中匹配类似但不精确的文本string

好吧,我一直在试图find一个解决scheme,我只是似乎不能。 我甚至不能正确地分解这个问题。 这是主意。

我有两张很多行(一个800,另一个300,000)。 每行包含一个名称列,然后包含几个包含有关此名称的信息的列。 每张纸都有不同的信息。

我想把这两张表合并成一个基于这个名称列的主表,他们都有,所以巩固function是完美的。 现在的问题是名称不完美匹配。

例如Sheet1包含

“BV公司”,“Info#1”
“公司总计”,“信息#2”
“Company Ltd”,“Info#3”

和表2包含

“公司和公司”,“Info#4”
“公司和公司”,“信息#5”

工作表1包含将要使用的所有名称(大约100,但是如上所述的不同forms),工作表2包含多行中的所有这100个以及不在100列表中的名称,因此我不关心。

我将如何做一个VBA代码项目,最终的结果是这样的事情,主表:

“公司”,“Info#1”,“Info#2”,“Info#3”,“Info#4”,“Info#5”

对于每一个“公司”(100名单)在那里?

我希望有这个解决scheme。 我对VBA项目相当陌生,但之前我已经做了一些简单的编码。

我会把macros放在你的PERSONAL部分,这样macros就可以在所有的工作表中使用。 通过录制一个虚拟macros并select将其存储在个人macros工作簿中执行此操作。 现在你可以在这个个人工作簿中手动添加新的macros和函数。

我只是试过这一个(不知道原始来源),它工作正常。

公式如下所示:= PERSONAL.XLSB!FuzzyFind(A1,B $ 1:B $ 20)

代码在这里:

 Function FuzzyFind(lookup_value As String, tbl_array As Range) As String Dim i As Integer, str As String, Value As String Dim a As Integer, b As Integer, cell As Variant For Each cell In tbl_array str = cell For i = 1 To Len(lookup_value) If InStr(cell, Mid(lookup_value, i, 1)) > 0 Then a = a + 1 cell = Mid(cell, 1, InStr(cell, Mid(lookup_value, i, 1)) - 1) & Mid(cell, InStr(cell, Mid(lookup_value, i, 1)) + 1, 9999) End If Next i a = a - Len(cell) If a > b Then b = a Value = str End If a = 0 Next cell FuzzyFind = Value End Function 

我使用罗伯特解决scheme,它对我来说工作正常。 我发布整个解决scheme的人谁是新的Excel,但知道编码:

虽然这个线程是旧的,但我从另一个线程采取了一些代码,并尝试,看起来像解决scheme是近似匹配。 在这里我试图匹配Sheet1的一列与Sheet2的一列:

  1. 在excel中添加命令button
  2. 把下面的代码,并点击/运行button和function给你的结果在选定的列
  Private Sub CommandButton21_Click() Dim ws As Worksheet Dim LRow As Long, i As Long, lval As String '~~> Change this to the relevant worsheet Set ws = ThisWorkbook.Sheets("Sheet1") With ws '~~> Find Last Row in Col G which has data LRow = .Range("D" & .Rows.Count).End(xlUp).Row If LRow = 1 Then MsgBox "No data in column D" Else For i = 2 To LRow lval = "D" .Range("G" & i).Value = FuzzyFind(lval & i, .Range("PWC")) Next i End If End With End Sub Function FuzzyFind(lookup_value As String, tbl_array As Range) As String Dim i As Integer, str As String, Value As String Dim a As Integer, b As Integer, cell As Variant For Each cell In tbl_array str = cell For i = 1 To Len(lookup_value) If InStr(cell, Mid(lookup_value, i, 1)) > 0 Then a = a + 1 cell = Mid(cell, 1, InStr(cell, Mid(lookup_value, i, 1)) - 1) & Mid (cell, InStr(cell, Mid(lookup_value, i, 1)) + 1, 9999) End If Next i a = a - Len(cell) If a > b Then b = a Value = str End If a = 0 Next cell If Value <> "" Then FuzzyFind = Value Else FuzzyFind = "None" End If End Function 

您可以使用Google Excel UDF模糊查找或Levensthein距离。 有一些UDF的浮动,微软也有一个模糊的查找/匹配附加(以及我使用它时,它是容易崩溃,不直观)。

看看这个DDoEpost的function。 您可以生成最长的常用序列string,并将长度与原始string进行比较。 喂它一些已知的比赛和一些密切的不匹配,看看你是否能看到他们之间清晰的分界线。

这些function用于差异化,不能find近似匹配,但它们可能适合您。