さて、私はこれに対する解決策を見つけようとしてきましたが、私はそれができないようです。問題をきちんと分解することすらできません。これがアイデアです。
行数の多い2枚のシートがあります(1枚は800枚、もう1枚は300,000枚)。各行には名前列が含まれ、次にこの名前に関する情報を含むいくつかの列が含まれます。各シートには異なる種類の情報があります。
この2つのシートを、両方の[名前]列に基づいてマスターシートに統合したいので、統合機能はこれに最適です。問題は、名前が完全に一致しないことです。
たとえば、Sheet1には
「CompanyB.V。」、「Info#1」
"会社合計"、 "情報#2"
"Company Ltd"、 "Info#3"
シート2には
「CompanyandCo。」、「Info#4」
"Company and Co"、 "Info#5"
シート1には、使用されるすべての名前が含まれ(100前後ですが、上記のように異なる形式で)、シート2には、これらすべての100が複数の行に含まれ、さらに100リストにない名前が含まれているため、私はしません。気に。
最終結果が次のようなVBAコードプロジェクトを作成するにはどうすればよいですか、マスターシート:
「会社」、「情報#1」、「情報#2」、「情報#3」、「情報#4」、「情報#5」
そこにあるすべての「会社」(100リスト)に対して??
私はこれに対する解決策があることを願っています。私はVBAプロジェクトにかなり慣れていませんが、以前に最小限のコーディングを行ったことがあります。
マクロをPERSONALセクションに配置します。これにより、すべてのワークシートでマクロを使用できるようになります。これを行うには、ダミーマクロを記録し、それをパーソナルマクロブックに保存することを選択します。これで、この個人用ワークブックに新しいマクロと関数を手動で追加できます。
私はこれを試しましたが(元のソースはわかりません)、正常に動作します。
式は次のようになります。= 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
私はRobertソリューションを使用しましたが、それは私にとっては問題なく機能します。私はExcelを初めて使用するが、コーディングを知っている人々のためにソリューション全体を投稿しています。
このスレッドは古いですが、私は別のスレッドからいくつかのコードを取得して試しましたが、解決策はほぼ一致しているようです。ここでは、sheet1の1列をsheet2の1列と一致させようとしています。
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 ExcelUDFファジールックアップまたはレーベンシュタイン距離を使用できます。いくつかのUDFが浮かんでいて、Microsoftにはファジールックアップ/マッチアドオンもあります(私がそれを使用したとき、それはクラッシュしやすく、直感的ではありませんでした)。
正確には正確ではありませんが類似しており、myの問題を扱っている人はthis検索時のページ。
タスク:住所を含む、自動車事故にあった患者のリスト。同じ住所に基づいて関連するアカウントを検索します。リストは最大でおそらく120レコードになりますpartial手動レビューは現実的です。
問題:番地は類似していますが同一ではありません。例: 123 JONESLANEおよび123JONES LN、または72 MAIN STREET#32および72 MAIN STREET#32。
Partの解決策は、番地のみを比較することです。そのサイズのリストでは、同じ番地を持つ2つの異なる住所(たとえば、123 JONESLANEと123MAIN STREET)があるのは珍しいことです。
注意: VAL()を使用して番地を取得することはできません。 167 E 13STでお試しください。 VBAはそれを167 ^ 13と見なし、Street_Num AsIntegerに出力するとクラッシュします。したがって、ループを使用して数字を新しい文字列にプルし、最初の数字以外の文字で停止する必要があります。
このDDoE投稿 の関数を見てください。最長共通シーケンス文字列を生成し、その長さを元の文字列と比較できます。いくつかの既知の一致といくつかの近い不一致をフィードし、それらの間に明確な境界線が表示されるかどうかを確認します。
これらの関数は、差分をとるために使用され、近い一致を見つけることはありませんが、機能する場合があります。