プロが教えるわが家の防犯対策術!

エクセルで↓ のようなデータがあります

 | A | B | C | D
1|A店|りんご| 2 |
2|A店|みかん| 3 |
3|A店|バナナ| 4 |
4|B店|りんご| 3 |
5|B店|バナナ| 2 |

これを以下のようなかたちにしたいのですが、一つずつ移動する以外に方法はありますか?

 | A | B | C | D | E | F | G |
1|A店|りんご| 2 |みかん| 3 |バナナ| 4 |
2|B店|りんご| 3 |バナナ| 2 |


100以上データがあり、手作業で移すのは大変です。
ちなみにVBAなどはほとんど理解できません。

何か解決策があればと質問させていただきたました。
よろしくお願いします。

A 回答 (6件)

こんばんは!


すでに回答は出ていますので、参考程度で・・・

店名を重複なしにSheet2に表示するようにしてみました。
↓の画像でSheet1に作業用の列を設けています。
作業列D2セルに
=IF(COUNTIF($A$2:A2,A2)=1,ROW(),"")
という数式を入れ、オートフィルでずぃ~~~!っと下へコピーしておきます。

そしてSheet2のA2セルは
=IF(COUNT(Sheet1!D:D)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!D:D,ROW(A1))))
としてオートフィルで下へコピーすると店名が表示されます。

次にB2セルに
=IF(OR($A2="",COUNTIF(Sheet1!$A:$A,$A2)<COLUMN(B1)/2),"",INDEX(Sheet1!$B$1:$B$1000,SMALL(IF(Sheet1!$A$1:$A$1000=$A2,ROW($A$1:$A$1000)),COLUMN(B1)/2)))

これは配列数式になってしまいますので、この画面からコピー&ペーストしただけではちゃんと表示されません。
貼り付け後、F2キーを押し編集可能にします。
Shift+Ctrlキーを押しながらEnterキーで確定!
数式の前後に{ }マークが入り配列数式になります。

同様にC2セル(これも配列数式です)に
=IF(OR($A2="",B2=""),"",INDEX(Sheet1!$C$1:$C$1000,SMALL(IF(Sheet1!$A$1:$A$1000=$A2,ROW($A$1:$A$1000)),COLUMN(B1)/2)))

としShift+Ctrlキー+Enterキーで確定!

B2。C2セルを範囲指定し、2列ずつ列方向へオートフィルでコピー!
そのまま下へコピーすると画像のような感じになります。

尚、Sheet1の店名と品名の行は重複しないものとしています。
(例 → A店・りんご という行が複数あることはない!)

長々と失礼しました。m(__)m
「エクセルで縦に並んだデータを横に並び替え」の回答画像6
    • good
    • 1
この回答へのお礼

ご丁寧に回答いただき、ありがとうございます。
何故か途中からSheet2のデータが「#NUM!」になってしまって、きちんと最後まで処理ができてないようでした。
私の知識が浅く、どこがどうなってエラーが出ているのか検討もつかず、申し訳ありません。。

お礼日時:2011/05/12 10:55

分かり易くしかもデータが多いときに計算に負担を掛けないようにするためには作業列を使って処理することがおすすめです。


元の表がシート1のA,B,C列の2行目から下方に入力されているとします。
作業列としてD2セルには次の式を入力して下方にオートフィルドラッグします。

=IF(A2="","",IF(COUNTIF(A$2:A2,A2)=1,MAX(D$1:D1)+1,D1))

E2セルには次の式を入力して下方にオートフィルドラッグします。

=IF(D2="","",D2+COUNTIF(A$2:A2,A2)/1000)

そこでシート2の2行目から下方にデータを表示させるとしたらシート2のA2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。

=IF(ROW(A1)>MAX(Sheet1!$E:$E),"",IF(COLUMN(A1)=1,INDEX(Sheet1!$A:$A,MATCH(ROW(A1),Sheet1!$D:$D,0)),IF(COUNTIF(Sheet1!$E:$E,ROW(A1)+ROUNDUP((COLUMN(A1)-1)/2,0)*0.001)=0,"",IF(MOD(COLUMN(A1),2)+1=1,INDEX(Sheet1!$B:$B,MATCH(ROW(A1)+ROUNDUP(((COLUMN(A1)-1)/2),0)*0.001,Sheet1!$E:$E,0)),IF(MOD(COLUMN(A1),2)+1=2,INDEX(Sheet1!$C:$C,MATCH(ROW(A1)+ROUNDUP(((COLUMN(A1)-1)/2),0)*0.001,Sheet1!$E:$E,0)),"")))))
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
教えて頂いたとおりにやったつもりなのですが、Sheet2のA2に

=IF(ROW(A1)>MAX(Sheet1!$E:$E),・・・・・・・・・・・・・

という数式を入れようとすると、「入力した数式は正しくありません。」と出てしまいました。
そのままコピーしてはNGだったでしょうか?

お礼日時:2011/05/12 11:01

一例です。


仮に元データをsheet1、sheet2のA列に店名を入力される事として抽出します。
(1)sheet2のB1に以下の配列数式(入力完了時にshift+ctrl+enterキーを同時押下)を入力
=IF(COUNTIF(Sheet1!$A:$A,$A1)>=ROUND(COLUMN(A1)/2,0),INDEX(Sheet1!$B:$B,SMALL(IF(Sheet1!$A$1:$A$200=$A1,ROW(Sheet1!$A$1:$A$200),999),ROUND(COLUMN(A1)/2,0))),"")
(2)sheet2のC1に以下の配列数式(入力完了時にshift+ctrl+enterキーを同時押下)を入力
=IF(COUNTIF(Sheet1!$A:$A,$A1)>=ROUND(COLUMN(A1)/2,0),INDEX(Sheet1!$C:$C,SMALL(IF(Sheet1!$A$1:$A$200=$A1,ROW(Sheet1!$A$1:$A$200),999),ROUND(COLUMN(A1)/2,0))),"")
(3)上記のB1:C1を選択して縦横に必要分コピー
    • good
    • 1

E列に店名リストを作成する


(なければフィルタオプションの設定で重複するレコードを無視するを使うとよい)

F1セルに 1 右へ連番
N2セルに =COUNTIF(A:A,E2) 下へオートフィル
F2セルに
=IF(F$1>$N2*2,"",INDEX($B:$C,MATCH($E2,$A:$A,0)+F$1/2,1))
G2セルに
=IF(F$1>$N2*2,"",INDEX($B:$C,MATCH($E2,$A:$A,0)+G$1/2-1,2))
F2:G2セルを選択して、右へオートフィル、そのまま下へオートフィル

E:N列を選択して 切り取り 別シートへ貼り付け
「エクセルで縦に並んだデータを横に並び替え」の回答画像3
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。
上記の方法でやりたいことができました!他の方の方法でもできたのだと思いますが、私はこちらの方法が一番最初に成功したので、ベストアンサーに選ばせていただきます。
ありがとうございました!!

お礼日時:2011/05/12 11:04

すみません質問をよく見ていませんでした


先ほどのやり方では単純に行と列を入れ替えるだけで
ご希望の形にはなりません
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私も最初これでやろうとしました。。

お礼日時:2011/05/12 10:39

表全体をコピーして


形式を選択して貼り付けで
行列を入れ替えるにチェックをつけて貼り付ける
「エクセルで縦に並んだデータを横に並び替え」の回答画像1
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私も最初これでやろうとしました。。

お礼日時:2011/05/12 10:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!