• ベストアンサー

EXCELの表を並べ替えたい

  A  B  C 1 A社 住所 商品1 2 A社 住所 商品2 3 B社 住所 商品3 4 C社 住所 商品4 5 C社 住所 商品5 6 C社 住所 商品6  上の図のようなEXCELの表があります。A列1行に A社が入力 されていると いう意味で書いています。 1つの会社につき商品は 1~10商品 あります。 これを A社 住所 商品1 商品2 B社 住所 商品3 C社 住所 商品4 商品5 商品6  というように 会社ごとに 横に商品名を並べたいと思います。 関数でできないでしょうか? よろしく お願いします。

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.5

初めにA列で並べ替えなどをして同じ会社名同士が並ぶようにします。ご質問のようにします。 シート1はお示しの表で1行目には項目名があり、2行目からデータがあるとします。D列を作業列としてD2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",IF(AND(COUNTIF(A$2:A2,A2)=1,ROW(A2)=2),"1/"&A2&"1",IF(COUNTIF(A$2:A2,A2)=1,(LEFT(D1,FIND("/",D1)-1)+1)&"/"&A2&"1",IF(COUNTIF(A$2:A2,A2)<>1,LEFT(D1,FIND("/",D1))&A2&COUNTIF(A$2:A2,A2),"")))) そこで答えとなる表をシート2に表示させるとしてA2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(COUNTIF(Sheet1!$D:$D,ROW(A1)&"/*")=0,"",IF(COLUMN(A1)<=2,INDEX(Sheet1!$A:$C,MATCH(ROW(A1)&"/*",Sheet1!$D:$D,0),COLUMN(A1)),IF(AND(COLUMN(A1)>2,COUNTIF(Sheet1!$D:$D,ROW(A1)&"/"&$A2&COLUMN(A1)-2)=0),"",INDEX(Sheet1!$C:$C,MATCH(ROW(A1)&"/"&$A2&COLUMN(A1)-2,Sheet1!$D:$D,0))))) これでエラー表示もなくすべての会社についてお望みの表が出来上がります。

erimomo
質問者

お礼

確かに 完璧に表ができました。 このまま 使わせていただきたいと思います。 ありがとうございました。

その他の回答 (6)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

こんばんは! すでに回答は色々出ていますので 参考程度で目を通してみてください。 他の方法の一例です。 ↓の画像で説明させていただきます。 作業用の列をA列に使わせてもらっています。 A2セルに =IF(COUNTIF($B$2:B2,B2)=1,ROW(A1),"") としてオートフィルで下へコピーします (別表の数式が1000行まで対応できるようにしていますので、1000行くらいまでコピーしても構いません) 会社名のF2セルに =IF(COUNT($A$2:$A$1000)<ROW(A1),"",INDEX($B$2:$B$1000,SMALL($A$2:$A$1000,ROW(A1)))) 住所のG2セルに =IF(F2="","",VLOOKUP(F2,$B$2:$C$1000,2,0)) 商品のH2セルに =IF($F2="","",IF(COUNTIF($B$2:$B$1000,$F2)<COLUMN(A1),"",INDEX($D$2:$D$1000,SMALL(IF($B$2:$B$1000=$F2,ROW($A$1:$A$999)),COLUMN(A1))))) H2セルは配列数式になってしまいますので、 この画面からコピー&ペーストしただけではエラーになると思います。 数式をセルに貼り付け後、F2キーを押すか、数式バー内で一度クリックします。 編集可能になりますので Shift+Ctrl+Enterキーで確定すると、数式の前後に{ }マークが入り配列数式になります。 H2セルのフィルハンドルで横へ適当にコピーします。(1社で商品数が多い場合は表示されるまでコピーしても構いません。 画像ではL列までコピーしています) 最後にF2~L2(↓の画像の場合です)を範囲指定し、 L2セルのフィルハンドルで下へコピーすると画像のような感じになります。 以上、参考になれば幸いですが、 他に良い方法があれば読み流してくださいね。 どうも長々と失礼しました。m(__)m

erimomo
質問者

お礼

画像まで添付していただき わかりやすかったです。 Shift+Ctrl+Enterキー 勉強になりました。 希望通りの表ができました。 ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

#1のお礼に関して ピボット表が下記のように出来る。Sheet5とする。 データの個数 / 商品 商品 会社 商品1 商品2 商品3 商品4 商品5 商品6 総計 A社 1 1 2 B社 1 1 C社 1 1 1 3 総計 1 1 1 1 1 1 6 ーーー VBAで標準モジュールに Sub test01() Set sh1 = Worksheets("Sheet5") Set sh2 = Worksheets("Sheet4") d = sh1.Range("A65536").End(xlUp).Row MsgBox d For i = 5 To d - 1 sh2.Cells(i, 1) = sh1.Cells(i, 1) k = 2 For j = 2 To 7 If sh1.Cells(i, j) <> "" Then sh2.Cells(i, k) = sh1.Cells(4, j) k = k + 1 Else End If Next j Next i End Sub ーーー 結果 Sheet4に A社 商品1 商品2 B社 商品3 C社 商品4 商品5 商品6 ===== ピボット表を作ったあと、VBAなら簡単なプログラムで、上記のようなことが出来るという例を参考に。

erimomo
質問者

お礼

何度もありがとうございました。 VBAを勉強します。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

#3です。#3の補足。 シートをコピーしてそちらでやってください。 $100の部分は100行程度を仮定してますが、データ最下行+アルファで決めてください。 関数式を消して「値」化は、その後にソートなどする場合は、気をつけて、値化しておかないと、可笑しな結果になってしまう。 方法はデータ範囲全体をコピーし、形式を選択して貼り付けー値 ーーー 式の中で COLUMN()-4と4を引いているのは、E列から商品データが始まり そこで1になるように、Eは第5列なので4を引いて1になるよう修正している。 ーーー #N/Aを消すのは 編集ー置換 検索する文字列 #N/A 置換後の文字列  なし で置換すると、空白になる。 ーーー 並べ替えは 全体データ範囲指定 データー並べかえー第1 E列 第2 A列 E列の空白行を行指定 編集ー削除 ーー 結果 A社 住所 商品1 A社1 商品1 商品2 B社 住所 商品3 B社1 商品3 C社 住所 商品4 C社1 商品4 商品5 商品6 ーー 少し工夫すれば、エラーは出さすに空白にする式は組める。IF関数をかぶせる(略) ーー >関数でできないでしょうか? エクセルの関数の経験が少ないからこういうことをいうのだろう。 結果的に丸投げ、丸写ししないとならないだろう。 こういう表の中身の組み換え問題は、この質問に対しては、私ならVBAでやる。 関数では技巧的で、複雑になる。

erimomo
質問者

お礼

こちらの能力不足のため 気分を害されたようで 申し訳ありませんでした。今後気をつけます。 回答ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

A列でソートする。 第1行目はデータを要れない。見出しは可。 A社 住所 商品1 A社1 商品1 商品2 #N/A #N/A #N/A A社 住所 商品2 A社2 B社 住所 商品3 B社1 商品3 #N/A #N/A #N/A #N/A C社 住所 商品4 C社1 商品4 商品5 商品6 #N/A #N/A C社 住所 商品5 C社2 C社 住所 商品6 C社3 D2は =A2&COUNTIF($A$2:A2,A2) E2は =IF($A2=$A1,"",INDEX($A$2:$C$101,MATCH($A2&COLUMN()-4,$D$2:$D$101,0),3)) これをI2まで引っ張る E2:I2を下方向に式を複写。 データ範囲(A2:I100)を値にする。 E+A列でソートして空白行をより分ける。 E列が空白セルは捨てる。 時間がないので、後刻回答を追加するかもしれない。

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.2

一例です。 添付資料参照方。 A列に作業列を作る。 A1 =B1&COUNTIF($B$1:B1,B1)    *社名+A社がA列で何個あるかを表示させる。     表示方法は、A社1、A社2。 表示用の表を作り作業を行う。 C10 =IF(COUNTIF($A$1:$A$6,$A10&C$9),VLOOKUP($A10&C$9,$A$1:$D$6,4,0),"")     *右にコピー     *A社1が表にある場合、表から値を表示、以外は空欄      VLOOKUPだけでもいいのですが、その場合エラー表示が出ます。     *$A10&C$9でA社+1を表示しています。

erimomo
質問者

お礼

画像まで添付していただきありがとうございます。 勉強させていただきました。 ありがとうございます。

  • thincl
  • ベストアンサー率34% (104/305)
回答No.1

ピボットテービルを使えば出来ますよ。

erimomo
質問者

お礼

ありがとうございます。 やってみましたが データの個数が集計されるだけで実際の データが入ってくれません。 A社 2 B社 1 C社 3  のような 表になってしまいました。

関連するQ&A