
列 A にさまざまな名前がさまざまな形式で入力されているワークシートがあります。
A1 John Smith、
A2 Jones、Mary 、
A3 Sally Gomez、
A4 The Gonzalez family
列 B には同様のデータがあります。
B1 The Smith Family Trust、
B2 Bob and Mary Jones、
B3 Blackwell、John、
B4 Luz Gonzalez
列 A と列 B に同じ姓が含まれているインスタンスを特定したいと思います。 上記の例では、数式を列 C に配置すると、次のようになります。
C1 TRUE (「Smith」が A1 と B1 の両方に含まれているため)
C2 TRUE (「Jones」が A2 と B2 の両方に含まれているため)
C3 FALSE (A3 と B3 に共通の単語がないため)
C4 TRUE (「Gonzalez」が A4 と B4 の両方に含まれているため)
これは可能でしょうか。
答え1
あなたのコメントと質問から判断すると、1 つのフレーズ内のいずれかの単語が隣接するフレーズ内の単語と一致する場合に TRUE を返したいようです。これを行う 1 つの方法は、ユーザー定義関数 (VBA) を使用することです。以下では、 内の単語をすべて除外します。arrExclude
これは、必要に応じて追加できます。また、文字、数字、スペース以外の文字、および 1 文字のみで構成される単語も除外されます。
これがうまくいくかどうか確認してください。
もう 1 つの選択肢としては、Excel バージョン 2007 以降向けに MS が提供している無料のあいまい検索アドインを確認することです。
このユーザー定義関数 (UDF) を入力するには、alt-F11
Visual Basic エディターを開きます。プロジェクトがプロジェクト エクスプローラー ウィンドウで強調表示されていることを確認します。次に、上部のメニューからInsert/Module
以下のコードを選択し、開いたウィンドウに貼り付けます。
このユーザー定義関数(UDF)を使用するには、次のような数式を入力します。
=WordMatch(A1,B1)
あるセルで。
編集2: Find Matches
Macでよりうまく動作するかを確認するためにセグメントを変更しました
Option Explicit
Option Base 0
Option Compare Text
Function WordMatch(S1 As String, S2 As String) As Boolean
Dim arrExclude() As Variant
Dim V1 As Variant, V2 As Variant
Dim I As Long, J As Long, S As String
Dim RE As Object
Dim sF As String, sS As String
'Will also exclude single letter words
arrExclude = Array("The", "And", "Trust", "Family", "II", "III", "Jr", "Sr", "Mr", "Mrs", "Ms")
'Remove all except letters, digits, and spaces
'remove extra spaces
'Consider whether to retain hyphens
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "[^A-Z0-9 ]+|\b\S\b|\b(?:" & Join(arrExclude, "|") & ")\b"
.Global = True
.ignorecase = True
End With
With WorksheetFunction
V1 = Split(.Trim(RE.Replace(S1, "")))
V2 = Split(.Trim(RE.Replace(S2, "")))
End With
'Find Matches
If UBound(V1) <= UBound(V2) Then
sS = " " & Join(V2) & " "
For I = 0 To UBound(V1)
sF = " " & V1(I) & " "
If InStr(sS, sF) > 0 Then
WordMatch = True
Exit Function
End If
Next I
Else
sS = " " & Join(V1) & " "
For I = 0 To UBound(V2)
sF = " " & V2(I) & " "
If InStr(sS, sF) > 0 Then
WordMatch = True
Exit Function
End If
Next I
End If
WordMatch = False
End Function
編集:以下は、元の例と、問題があると指摘した下のコメントで示した例の両方を使用した結果のスクリーンショットです。
答え2
この演習で最も難しいのは、列 A の何が姓を構成するかを判断することです。この例では、次のいずれかになります。
- 名前全体にカンマがある場合は最初の単語
- 2番目の単語
そのルールが真であれば、次のような式を実行できます。
=NOT(ISERROR(FIND(last_name, B1:B4)))
姓を実際に決定する式は、もう少し複雑です。基本的には、スペースがどの文字位置にあるかを把握し、その間の文字を引き出す必要があります。このスレッドにわかりやすい説明があります。
答え3
セルC1にこの数式を使用しますリンク
=IF(VLOOKUP(B1:B4,A:A,1)=B1,"",B1)
答え4
両方の列を強調表示 > 条件付き書式 (ホーム タブ) > セル ルールを強調表示 > 重複値。これにより、両方の列のすべての重複が強調表示されます。
セルではなく列を強調表示していることを確認してください。