1

2 つの異なるシートにデータがあります。Sheet1.A には英数字エントリ「ABC123」が含まれ、Sheet2.A には同様のエントリ「ABC123 some text」または「some text ABC123」が含まれます。

さらに、シート 1 は常にシート 2 よりもエントリが少ないため、不一致が発生します。

Sheet3 では、Sheet1.A のすべてのエントリを Sheet2.A からの対応する一致とともに表示できるようにしたいと考えています。次に、一致しないすべてのエントリをリストの一番下に表示したいと考えています。

理想的な出力の例:

Sheet3.A  Sheet3.B
ABC123    ABC123
ABC222    ABC222
ABC333    ABC333
          ABC444
          ABC555
          ABC666

現在、Sheet3.B のインデックス マッチ (LEFT 関数を使用) 式を使用していますが、理想的な出力が得られません。

Sheet3.A  Sheet3.B
ABC123    ABC123
ABC222    ABC222
ABC333    ABC333
          ABC444
          ABC444
          ABC444

また、LEFT 関数を使用しており、Sheet2.A のデータが Sheet1.A と同様に配置されていない可能性があるため、一部のエントリが見つからず、#N/A が生成されます。

また、Sheet2.A には 256 文字を超える文字が含まれている可能性があり、インデックス マッチ機能で問題が発生する可能性があることも付け加えておきます。この問題は最優先事項ではありませんが、解決できれば素晴らしいことです。

編集:

質問と受け入れられた回答が互いに適切に反映されるようになりました

4

1 に答える 1

1

おそらく.Find、部分一致を検索するメソッドを使用できます。

Sub FindPartialString()

Dim wsList As Worksheet
Dim wsSearch As Worksheet
Dim wsOutput As Worksheet
Dim lastRow As Long
Dim rngList As Range
Dim rngMatch As Range
Dim cl As Range
Dim arrNonMatches() As Variant
Dim nonMatchCount As Long


Set wsList = Sheets(1) '## Modify as needed
Set wsSearch = Sheets(2) '## Modify as needed
Set wsOutput = Sheets(3) '## Modify as needed
Set rngList = wsList.Range("A2:A5") '## Modify as needed

For Each cl In rngList
    Set rngMatch = Nothing 'clear the container before each query
    'look for a partial match:
    Set rngMatch = wsSearch.Cells.Find(What:=cl.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)

    'Store the matches and non matches in separate arrays:
    If Not rngMatch Is Nothing Then
        lastRow = 1 + Application.WorksheetFunction.CountA(wsOutput.Range("A:A"))
        'put the searched value in column A:
        wsOutput.Cells(lastRow, 1) = cl.Value
        'Put the found value in column B:
        wsOutput.Cells(lastRow, 2) = rngMatch.Value
    Else:
        'store non-matches in an array
        ReDim Preserve arrNonMatches(nonMatchCount)
        arrNonMatches(nonMatchCount) = cl.Value
        nonMatchCount = nonMatchCount + 1
    End If
Next

'Print out the non-matches
lastRow = lastRow + 1
wsOutput.Cells(lastRow, 1).Resize(UBound(arrNonMatches) + 1, 1).Value = Application.Transpose(arrNonMatches)
End Sub
于 2013-05-21T14:24:44.367 に答える