0

我不擅长高级 Excel 公式,需要帮助在 excel 中清理数据以进行迁移。这是我的场景:

Column A                                             Column B 

DocName                                              EmployeeName 
ACCT6789_John_Smith_ACCOUNT_DOC_25_JAN_2007          John_Smith
ACCT1122_Jane_Doe_ACCOUNT_DOC_EID00022_21_DEC_2009   Jane_Doe
ACCT1462_Phil_Morris_ACCOUNT_DOC_EID0252             Phil_Moris

我需要 ColumnA 的字符串来找到与 ColumnB 的完全匹配。如果匹配,则从 ColumnA 中删除匹配的字符串。如果没有完全匹配,则不会有任何操作,脚本将继续检查下一行。我知道双下划线会有问题,我希望任何两个单词之间只有一个下划线。

例如上面的期望结果将是:

ACCT6789_ACCOUNT_DOC_25_JAN_2007              John_Smith 
ACCT1122_ACCOUNT_DOC_EID00022_21_DEC_2009     Jane_Doe
ACCT1462_Phil_Morris_ACCOUNT_DOC_EID0252      Phil_Moris
4

2 回答 2

2

仅使用电子表格中的公式,您可以执行以下操作:

假设 C 列可用(如果不可用,则找到一个空列)。在第 1 行中输入此公式(如果第 1 行中有标题,请在第一个可用行中输入并调整1行号):

=FIND(B1, A1)

这将发现B1("John Doe") 在A1 ("ACCT6789_John_Smith_ACCOUNT_DOC_25_JAN_2007")

在下一列中,您键入

=LEFT(A1, C1-1) & RIGHT(A1, LEN(a1) - C1 - LEN(B1))

这需要“我们找到的字符串之前的 A1 位”加上“我们找到的东西之后的位”。

现在一直复制这个公式(选择C1和D1,然后双击右下角的小框是一直向下拖动的快捷方式......)。D 列现在有您想要的结果。

最后,要将它们复制回 A 列,选择所有 D 列,点击复制,然后在 A 列中粘贴特殊值。最后,删除 C 列和 D 列。

顺便说一句 - 此方法假定您找到的名称的两侧都有下划线,并且实际上会删除尾随的下划线。如果您不能确定,您应该将 D 列中的公式更改为

=LEFT(A1, C1-1) & RIGHT(A1, LEN(a1) - C1 - LEN(B1) + 1)

然后再做一轮以删除双下划线并用单下划线替换它们......不过,在我看来你不需要那个。

于 2013-02-07T03:58:24.900 回答
0

虽然这个线程很旧,但我从另一个线程中获取了一些代码并尝试过,看起来解决方案给出了近似匹配。在这里,我试图将 sheet1 的一列与 sheet2 的一列匹配:

  1. 在excel中添加命令按钮
  2. 输入以下代码并单击/运行按钮和函数为您提供选定列的结果
 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
于 2015-11-24T12:13:54.587 回答