• ベストアンサー

【エクセル】複数行に渡ったデータを、一行にまとめたい!

エクセルで複数行に渡ったデータを1行にしたいです。 いろんな人に聞いてみましたが、分からなくて・・・。 VBAマクロなどで一度に出来る方法が有りましたらどうか教えて下さい。よろしくお願い致します。 データはこんな感じです。 ┌─┬─┬─┐ │ID│FN│VA│ ├─┼─┼─┤ │01│HA│33│ ├─┼─┼─┤ │01│KI│45│ ├─┼─┼─┤ │01│JI│22│ ├─┼─┼─┤ │01│CA│56│ ├─┼─┼─┤ │02│HA│67│ ├─┼─┼─┤ │02│KI│99│ ├─┼─┼─┤ │02│JI│43│ ├─┼─┼─┤ この様に並び替えたいのです。 ┌─┬─┬─┬─┬─┐ │ID│HA│KI│JI│CA│ ├─┼─┼─┼─┼─┤ │01│33│45│22│56│ ├─┼─┼─┼─┼─┤ │02│67│99│43│ │ ├─┼─┼─┼─┼─┤ よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

「データ」「ピボットテーブル...」を選択して、最初の表を選択して完了 新たなシートにピボットテーブルの設定されるのでリストボックスから IDを行に、FNを列に、VAをデータにセットしてみてください。 数式で移動する場合だと ┌─┬─┬──┬─┐ │ID│FN│KEY │VA│ ├─┼─┼──┼─┤ │01│HA│01HA│33│ ├─┼─┼──┼─┤ │01│KI│01KI│45│ ├─┼─┼──┼─┤ │01│JI│01JI│22│ ├─┼─┼──┼─┤ │01│CA│01CA│56│ ├─┼─┼──┼─┤ │02│HA│02HA│67│ ├─┼─┼──┼─┤ │02│KI│02KI│99│ ├─┼─┼──┼─┤ │02│JI│02JI│43│ ├─┼─┼──┼─┤ と3列目に C2=A1&B1 という数式でIDとFNを結合したデータを作成 B2=IF(COUNTIF(Sheet1!$C$2:$C$8,$A2&B$1),VLOOKUP($A2&B$1,Sheet1!$C$2:$D$8,2,FALSE),"") として表の範囲にコピーしてください。

tama0x0
質問者

お礼

ありがとうございましたm(_ _)m 問題解決しました!! ピポットテーブルではなく、 数式で移動の方でやってみました!

すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#52504
noname#52504
回答No.3

4項目ずつ順に並んでいるわけですよね。 でしたら素朴にこんな方法でも。 元の表がSheet1のA1セルから入っているとして、 並べ替え先の表もA1セルから表示するとすると、 B2セル  =INDEX(Sheet1!$C$2:$C$999,(ROW()-2)*4+COLUMN()-1) として右方・下方にフィル。 必要に応じてコピー⇒値貼り付けで確定 元の表の位置が異なる場合は、VA列の位置に応じて  Sheet1!$C$2:$C$999 の部分を変更してください。 並べ替え先の位置が異なる場合は、 ROW()-2 の部分と COLUMN()-1 の部分で引く値を加減してください。 例えば「ID」と入っている部分がC4セルであれば、それぞれ ROW()-5 COLUMN()-3 となります。

tama0x0
質問者

お礼

ありがとうございましたm(_ _)m 問題解決しました!!

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

VBAで、標準モジュールに Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d = sh1.Range("A65536").End(xlUp).Row '-- k = 2 m = 2 b = sh1.Cells(2, "A") sh2.Cells(k, "A") = Format(sh1.Cells(2, "A"), "00") For i = 2 To 100 For j = 3 To 3 If sh1.Cells(i, j) <> "" Then If sh1.Cells(i, "A") = b Then sh2.Cells(k, m) = sh1.Cells(i, j) m = m + 1 Else k = k + 1 m = 2 b = sh1.Cells(i, "A") sh2.Cells(k, "A") = sh1.Cells(i, j) sh2.Cells(k, m) = sh1.Cells(i, j) m = m + 1 Exit For End If Else k = k + 1 m = 2 Exit For End If Next j sh2.Cells(k, "A") = Format(sh1.Cells(i, "A"), "00") b = sh1.Cells(i, "A") If i > d Then Exit Sub Next i End Sub ーー 例データ Sheet1に A1:C11 ID FN VA 1 HA 33 1 KI 45 1 JI 22 1 CA 56 2 HA 67 2 KI 99 2 JI 43 2 JA 12 3 PU 43 3 SW 55 実行結果 Sheet2に 01 33 45 22 56 02 67 99 43 12 03 43 55 前もってSheet2のA列の書式を文字列にして置いてください。 少数データでのテストしかやっていないので、ひょっとしてボロが出るかもしれないがよろしく。 こういうのは、経験してないと、なかなかロジックをコードにするのが難しい課題と思う。

tama0x0
質問者

お礼

ありがとうございましたm(_ _)m 問題解決しました!! VBAでやってみましたが、 ちょっとずれてしまって・・・ 自分で修正しなおす知識がなく、挫折してしまいました。 ごめんなさい。

すると、全ての回答が全文表示されます。

関連するQ&A