web-dev-qa-db-ja.com

Excelで重複エントリを一意のデータと組み合わせる

Excelデータベースがあり、重複したデータを手動で結合しないようにしています。タグ列を除いて、基本的に同じリストがたくさんあります。私がしたいのは、これらの5つのリストを1つのリストに結合して、カテゴリーを単一のセル内のコンマ区切りリストにすることです。

これを回して

Data Example

これに

Desired result

これを達成する方法はありますか?私のドキュメントには数千のリストがあるため、手動での編集ルートを避けようとしているのは明らかです。私はExcelの初心者です。手持ちやチュートリアルで教えていただければ幸いです。

7
jbwharris

これは、数式を使用して行うこともできます。この例を機能させるには、データを最初の列でソートする必要があり、ヘッダー行が必要になります。

さらに2つの列(CおよびD)が必要になります。最初に、列Aのデータがその上の行と同じである場合は基本的に列Bのデータを連結することを示す数式を追加します。それ以外の場合は連結をリセットします。次の列には、後でソートできるように最終的な連結を識別するための式が含まれます。

これは、列AとBのリストとカテゴリを使用して行う方法です(ここでも、データは列Aでソートする必要があり、ヘッダー行が必要です)。 enter image description here

結果は次のとおりです。次に、範囲全体をコピーして、値を別のシートに貼り付けます。列Dのゼロの行は、使用したいものです。列Dで並べ替えると、上に移動します。 enter image description here

23
Dave Thornton

これにより、ソースシートから新しいシートが生成され、複製が連結されます。

次のコードを使用するには、VBAエディターの新しいモジュールに追加する必要があります

VBAエディターを開くショートカットはAlt+F11(Windowsの場合)およびAlt+Fn+F11 (Mac用)

エディターが開いたら、メインメニューバーの[挿入]メニューから選択して、新しいモジュールを追加します。コードを受け入れる準備ができているモジュールが自動的に開きます。そうでない場合は、プロジェクトエクスプローラーから選択する必要があります(「ModuleN」という名前になります。Nは次に使用可能な番号です)。

"Scripting.Dictionary"がosxで利用できるかどうかはわかりませんが、試してみるのに支障はありません。

Option Explicit

Sub Main()
Dim Source As Worksheet: Set Source = ThisWorkbook.Worksheets("Sheet1")
Dim Destination As Worksheet: Set Destination = ThisWorkbook.Worksheets("Sheet2")

Dim Records As Object: Set Records = CreateObject("Scripting.Dictionary")

Dim Data As Variant
Dim Index As Long
Dim Row As Integer: Row = 1

Data = Source.Range("A1", "B" & Source.Rows(Source.UsedRange.Rows.Count).Row).Value2

For Index = LBound(Data, 1) To UBound(Data, 1)
    If Records.Exists(Data(Index, 1)) Then
        Destination.Cells(Records(Data(Index, 1)), 2).Value2 = Destination.Cells(Records(Data(Index, 1)), 2).Value2 & ", " & Data(Index, 2)
    Else
        Records.Add Data(Index, 1), Row
        Destination.Cells(Row, 1).Value2 = Data(Index, 1)
        Destination.Cells(Row, 2).Value2 = Data(Index, 2)
        Row = Row + 1
    End If
Next Index

Set Records = Nothing

End Sub
1
NickSlash