- ベストアンサー
エクセルで重複データを右の列に増やす方法
- エクセル2007で、表(1)のようなレコードをキー列で重複データをまとめ、右の列にデータを増やす方法を教えてください。
- キー列が2列の場合や、表(2)のように右の列にデータをどんどん増やす方法を知りたいです。
- 条件は、レコードは1000行以上、市idと社idは昇順に並んでいるため重複データは必ず上下に連続している、商品の種類は50以上あり、どれ位右に列が増えるか不明、などです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
一例です。 Sheet1のシートタブ上で右クリック→コードの表示→サンプルコード貼り付け→シート上でAlt+F8キー押下、sample実行 因みにデータは昇順でなくても問題ありません。(但し、集約はデータ発生順になります) Sub sample() Dim i As Long, db, wk, wk1 Set db = CreateObject("Scripting.Dictionary") For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row wk = Cells(i, "A") & " ," & Cells(i, "B") & _ "," & Cells(i, "C") & "," & Cells(i, "D") db(wk) = db(wk) & " " & Cells(i, "E") Next wk = db.keys With Sheets("sheet2") .Cells.ClearContents .Cells(1, 1).Resize(, 4) = Cells(1, 1).Resize(, 4).Value For i = 0 To UBound(wk) .Cells(i + 2, "A").Resize(, 4) = Split(wk(i), ",") wk1 = Split(Trim(db(wk(i))), " ") .Cells(i + 2, "E").Resize(, UBound(wk1) + 1) = wk1 Next wk1 = .Cells(1, 1).CurrentRegion.Columns.Count .Cells(1, "E").Resize(, wk1 - 4) = "商品" End With Set db = Nothing End Sub
その他の回答 (1)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 一例です。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Application.ScreenUpdating = False wS2.Cells.Clear With wS1 i = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A:A").Insert .Rows(1).Copy wS2.Cells(1, 1) With Range(wS1.Cells(2, 1), wS1.Cells(i, 1)) .Formula = "=C2&""_""&D2" .Value = .Value End With Range(.Cells(1, 1), .Cells(i, 1)).AdvancedFilter Action:=xlFilterInPlace, unique:=True .Range("A:A").Copy wS2.Cells(1, 1) .Range("A:A").AutoFilter .AutoFilterMode = False For i = 2 To wS2.Cells(Rows.Count, 1).End(xlUp).Row Set c = .Range("A:A").Find(what:=wS2.Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole) c.Offset(, 1).Resize(1, 4).Copy wS2.Cells(i, 2) Next i For i = 2 To wS2.Cells(Rows.Count, 1).End(xlUp).Row For k = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(k, 1) = wS2.Cells(i, 1) Then .Cells(k, 6).Copy wS2.Cells(i, Columns.Count).End(xlToLeft).Offset(, 1) End If Next k Next i .Range("A:A").Delete wS2.Range("A:A").Delete End With k = wS2.UsedRange.Columns.Count Range(wS2.Cells(1, 5), wS2.Cells(1, k)) = "商品" wS2.Cells(1, 1).CurrentRegion.Borders.LineStyle = xlContinuous Application.ScreenUpdating = True MsgBox "処理完了" End Sub 'この行まで こんなんではどうでしょうか?m(_ _)m
お礼
データは昇順でなくてもいいのが、勉強になりました。ありがとうございました。参考にさせていただきます。