• ベストアンサー

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/17068)
回答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/17068)
回答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/17068)
回答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

  • 底値表を作る際のエクセルの計算式について

    エクセルで買い物の底値表を作っています。それぞれの商品について、底値を出しているスーパーの名前を底値の横の列、その横に曜日を出したいと思っています。 1行目がスーパーの名前(6つ)です。 それぞれのスーパーの下(2行目)には、値段、日付、曜日、備考の4項目を入れています。 3行目以下に商品名(A列)と、それぞれのスーパーマーケットで売っている値段、日付などを入力します。 各商品の底値を、商品名と各スーパーの値段などの間のB列にMIN関数で返しました。 その底値の商品を売っているスーパー名を1行目から参照してC列に、曜日(それぞれの商品と同じ列にあります)をD列に反映させるには、どんな計算式を使えばよいでしょうか。

  • エクセル 表の自動追加

    エクセルで見積書を作成しています。 単純化して書きますと    A      B        C    D   E 1 商品コード 商品名    単価   数量  金額               合計¥~~ vlookup関数を使ってA列に商品コードを入力B列に商品名、C列に単価が引用され、後はD列の数量を入力すればE列の金額および合計金額が出るというようにしているのですが、 A~Eが埋まれば自動的に2行目が合計との間に挿入されるような関数?などはあるのでしょうか。現在では15行程度の表があるのですが、もっと数が増えたときや、数が少ないときに〆の線を引くのが面倒なのです。  私自身はエクセルはネットで独学程度で学んでいるので詳しくありません。自分でいろいろ調べたのですが(と言ってもネットで調べただけですが)VBAを使用しなければ難しいでしょうか? 拙い文章で申し訳ありませんが、ご教授のほどよろしくお願いいたします。

  • エクセル 表

    エクセルについて質問があります 表を作成しています 例えば A4に項目 B4にメーター値 C4には B3までの総合計とB4の合計の値が 入力 されるような表を作成したいです B列に数値がなければ Cは その際は 例えばB列が0なら C欄は空欄になるように設定したいです ちょっと分かりづらい説明になってしまいましたが どなたか この関数をお教え下さい よろしくお願い いたします

  • エクセルの表で条件を指定しての整列

    エクセルの表で条件を指定して整列させようとしています。 よろしくお願い致します。 画像のようにA列の商品名に、B列、C列の2つの条件が付いた商品がありD列に在庫数を入れています。 はじめは「画像C表」のように規則を設定したものに従って並んでいたのですが、操作ミスがあり「画像A表」のように行をバラバラにしてしまいました。 A列の商品名、B列、C列の条件とD列の在庫数の横の並び(1行づつの並び方)は元のままです。 A列の商品名、B列、C列の条件の記入内容は半角全角文字様々です。 「画像B表」のような在庫数だけ入っていない表は存在しています。 これを「画像B表」の整列規則に従って元のように並べ直すのに苦労しています。 例えば定型の表である「画像B表」のA2セルとB2セルとC2セルの値が共通の行の「画像A表」のD2セルの値を「画像B表」のD2セルに並べるという方法が出来ればと思うのですが数式をどう設定してよいのか判らない常態です。 実際の商品数(行数)は10,000程あり日常扱っている商品のためかなり焦っております。 確実に元に戻せればどのような方法でも結構です。 初歩的な内容かもしれませんが、よろしくお願い致します。

  • (エクセル)表から1列の別表をつくりたい。

    表に入力されたものを1列に並び替えをしたいのです。(エクセル関数) エクセルの表から、セルに入力された情報を抜き出し、並び替えたいのですが、行き詰ってしまい質問させていただきます。 (やりたいこと) 添付資料のように、事業所ごとに購入した物品が日付ごとに入力されていきます。この表を一列で並び替えることを したいのですが、現状の表の形で1列に抜き出すやり方が思い浮かびません。ひとつずつリンクを設定していけばいいですが、 それですと、空白のセルができてしまうこともあり、空白を消すためにフィルタをやらなくてはいけず、なんとか関数でどうにかできないと質問させていただきました(つまり空白のセルは飛ばし、隙間のない1列の表に変換したいです)。 (試したこと) (1)vlookup関数を使うために、日付の横に検索列を作ってもみましたが、同じ行に複数の抜き出すべくものがあると、 if関数のネストをいれるにも「if(c5="","",vlookup(v5,b5:r10,2,fasle)」みたくやってみましたが、c5までは取り出せても、 d5,e5,f5・・・と右にずらしていく関数式が思い当たりません。 (2)種類、数量データ入力されている全てのセルの横に(1.2.3.4.5.6.7.8.9.・・・)と数字をいれて検索列をつくり、vlookupとmatch関数の 組み合わせも試しましたが、vlookup関数の性質上、複数列に検索値(「vlookup(検索値,範囲,列番号,検索の型)」)が存在しているとこれも出来ず。 説明が不十分な点もあると思いますが、よろしくお願いいたします。もし、VBAでなければ難しいとのことでしたら、どのようなVBAを組めばいいかもお願いいたします。

  • エクセルの表引き?

    こんにちは いつもお世話になっています エクセルの表引きについて教えてください。 実は表引きといえるかどうかわからないので、できるか、できないかだけでも知りたいです。 sheet1に次のデータがあります。 A     B     C 1     秋田    a 2     愛知    a 3     石川    a 4     愛媛    b 5     大分    b 6     鹿児島   b 7     香川    c 8     熊本    c A列は連番とは限りません、重複データはありません。 C列でグループ分けしてあり、第一条件でソートしてあります。 sheet2ではA列に10行ごとに黒枠罫線がひいてあるだけで、ほかにデータはありません。 この枠線の中にsheet1のC列のグループごとにA列のデータを振り分けたいのです。 sheet1のC列は昇順でソートしてありますのでsheet2へも、その順番で各枠線内の上から入力させたいです。 sheet2のA列へはC列のa,b,cの各データの個数より余分に枠罫線がひかれてあるので、入りきらないことはありません。 つまり、 sheet2に A 1 2 3 7行分空白(ここまで枠罫線) 4 5 6 7行分空白(ここまで枠罫線) 7 8 8行分空白(ここまで枠罫線) と入力させたいのです。 関数とか表引きではできないとすると、他の方法はあるでしょうか。 条件付書式でもできるでしょうか。 わかりづらい表現で申し訳ないですが、よろしくお願いします。

  • エクセル関数での重複削除

    以下のようなエクセル表があったとします。       【列A】  【列B】 【行1】   1     A社   【行2】   2     B社 【行3】   3     B社  【行4】   4     C社 【行5】   5     C社 【行6】   6     C社 この表の下のほうに、【列B】の社名を重複を削除した形で一覧表示させたいのです。この例の場合ですと、              A社              B社              C社 と表示させたいのですが。。。 フィルタ機能を使って重複を削除すれば同じようなことができるのですが、今後の更新作業を楽にするため関数でやりたいのですが、可能でしょうか。 教えてください。

  • エクセルのIF関数について

    エクセルのIF関数について質問をさせて頂きます。 現在、下記のような条件で抽出できる式を考えているのですが、 中々思うような式が思い浮かびません。 例えば、     A列  B列  C列  D列 1行目  111 2行目  222 3行目  333 4行目  444 5行目  555 6行目  666 7行目  777 8行目  888 9行目  999 上記のようなシートがあったとして、     A列  B列  C列  D列 1行目  111       999 2行目  222       333 3行目  333   ○   123   × 4行目  444 5行目  555 6行目  666 7行目  777 8行目  888 9行目  999   ○ 上記のように、例として C列の1行目に「999」と入力した場合、A列の9行目に「999」の数字があるので、その横のB列に「○」 C列の2行目に「333」と入力した場合、A列の3行目に「333」の数字があるので、その横のB列に「○」 C列の3行目に「123」と入力した場合、どこにも該当番号がないので、入力したC列の横、即ちD列の3行目に「×」を表示 要は、A列のどこかに該当数字があった場合にはその数字の横(B列)に「○」、どこにも該当数字が無い時には、入力した数字の横、D列に「×」を表示するような数式を考えています。 IF関数を使えばできるような気がするのですが、色々と試してみても中々うまくいきません。 下手な説明で分かり辛いかもしれませんが、どなたかご存知の方がいましたら、ご教授の程頂ければ幸いです。 どうぞ宜しくお願い致します。

  • エクセルの表計算で、検索値が含まれる列を検索後、同じ列の違う行にある数

    エクセルの表計算で、検索値が含まれる列を検索後、同じ列の違う行にある数値を返す場合はどのようにすればいいのでしょうか? ※下表を例としますと、検索値 150 が含まれる1行目のC列を検出後、同じ列の2行目に入力されている 4300 を返す場合の関数式を教えてください。     A      B         C        D 1   1~50  51~100   101~250   251~500 2   5000    4500      4300     4000

  • エクセルでこのようなことはできますか?

    エクセル2010です。 たとえば図のように、各都市での新規店舗オープンの予定表があり、A店・B店・C店が、それぞれの都市でオープン予定となっているとします。 図では、B店が4都市全てでオープンしたため、右の別表に「○」がついています。 これを自動で「○」がつくようなシステムのシートを作りたいと思っています。 考えているのは、B店の場合だと、F3のセルに、 C列で「準備中」と書かれている行のうち、同じ行のB列のどこにもE3("B店"という文字列)が無ければ、"○"を表示する、 となるようにしたいのです。 こういう場合どのような関数を使えば良いのでしょうか?LOOKUP関数とCOUNTIF関数でいろいろやってみたのですがどうにもうまくいきません・・・ よろしければアドバイスをいただけますでしょうか。よろしくお願いします。

専門家に質問してみよう