- ベストアンサー
重複するidをデータごとにまとめるvbaのコード
- Excel VBAを使用して、重複するidをデータごとにまとめるコードの作成方法を教えてください。
- 1000件以上のデータがあるExcelシートで、同じidを持つ行を3行ずつ横に表示する方法を教えてください。
- 同じidを持つ行が3行に満たない場合は改行し、3行以上ある場合は3行ごとに改行するコードを教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
(1)Alt+F11でVBEを開き、挿入→標準モジュール (2)作成された標準モジュールへ以下のVBAコードを貼付 (3)コード内の以下の箇所を該当のシート名に合わせて修正 '対象のシートを設定 Set mySt(0) = Worksheets("Sheet1") ←元データのシート Set mySt(1) = Worksheets("Sheet2") ←表示先のシート (4)Alt+F11でVBEを閉じ、Alt+F8で「sample」マクロを実行 ※補足 処理中で使用している区切り文字列について 元データのA列(ID)に「;」「,」を含む場合は正常に動作しません。 含む可能性がある場合は、コード内の以下の箇所をそれぞれ元データで使用していない 文字列に変更してください。(key(0)とkey(1)は別の文字列としてください) key(0) = ";": key(1) = "," ■VBAコード Sub sample() '変数を宣言 Dim mySt(1) As Worksheet, key(1) As String Dim bsData() As Variant, myData() As Variant Dim i As Long, j As Long, cnt As Long Dim names() As String, buf As Variant Dim tar As Range, flag As Boolean '対象のシートを設定 Set mySt(0) = Worksheets("Sheet1") Set mySt(1) = Worksheets("Sheet2") '区切り文字(必要であれば変更) key(0) = ";": key(1) = "," '配列にデータを格納 With mySt(0) bsData = .Range(.Cells(1, "A"), .Cells(Rows.Count, "C").End(xlUp)) End With '重複しない名前の配列を作成 For i = 1 To UBound(bsData, 1) flag = True If Sgn(names) <> 0 Then For j = 0 To UBound(names, 2) If names(0, j) = bsData(i, 1) Then flag = False Exit For End If Next j End If If flag Then If Sgn(names) = 0 Then ReDim names(1, 1) Else ReDim Preserve names(1, UBound(names, 2) + 1) End If names(0, UBound(names, 2)) = bsData(i, 1) End If Next i '名前配列へ同名のデータを集約 For i = 1 To UBound(names, 2) For j = 1 To UBound(bsData, 1) If bsData(j, 1) = names(0, i) Then names(1, i) = names(1, i) & bsData(j, 2) & key(1) & bsData(j, 3) & key(0) End If Next j Next i 'シートへ書き出し Application.ScreenUpdating = False With mySt(1) .Cells.ClearContents For i = 1 To UBound(names, 2) buf = Split(names(1, i), key(0)) For j = 0 To UBound(buf) - 1 If j Mod 3 = 0 Then cnt = cnt + 1 Set tar = .Cells(cnt, "A") tar = names(0, i) End If tar.Offset(0, (j Mod 3) * 2 + 1) = Left(buf(j), InStr(1, buf(j), key(1)) - 1) tar.Offset(0, (j Mod 3) * 2 + 2) = Right(buf(j), Len(buf(j)) - InStr(1, buf(j), key(1))) Next j Next i End With Application.ScreenUpdating = True '終了 MsgBox "終了" End Sub
お礼
完璧です! 本当にありがとうございました!!