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

ColumnBと完全に一致するものを見つけるには、ColumnAの文字列が必要です。一致した場合は、その一致した文字列をColumnAから削除します。完全に一致するものがない場合、アクションは実行されず、スクリプトは次の行のチェックを続行します。二重アンダースコアで問題が発生することはわかっています。2つの単語の間にアンダースコアを1つだけ入れたいと思います。

上記のような望ましい結果は次のようになります。

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 に Paste-Special-Values を実行します。最後に、列 C と D を削除します。

ところで、このメソッドは、見つけた名前の両側にアンダースコアがあることを前提としており、実際には末尾のものを削除します。確信が持てない場合は、列 D の数式を次のように変更する必要があります。

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

そして、別のラウンドを実行して、二重のアンダースコアを削除し、単一のアンダースコアに置き換えます...ただし、それは必要ないように思えます。

于 2013-02-07T03:58:24.900 に答える
0

このスレッドは古いですが、別のスレッドからいくつかのコードを取得して試してみたところ、解決策がほぼ一致しているように見えます。ここでは、sheet1 の 1 つの列を sheet2 の 1 つの列と一致させようとしています。

  1. エクセルにコマンドボタンを追加
  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 に答える