• ベストアンサー

Excelでの並び替えについて。

Excelでの並び替えで困っています。 現在、行に日付、列に商品名を入力し、その間に販売個数を入力し管理しています。 入力はしやすいのですが、データとして扱う場合に検索等がしにくいので 日付、商品名、個数を1行に並び替えしたいと思っています。 個数が多いため、手動で全て行うのは不可能に近いです。 関数で行う事ができれば良いのですが、何か方法がありますでしょいうか。 できれば、個数が空白のセルは無視して、上に詰めて並び替えができれば理想です。

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

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

No.3です! 補足に >A列が数式ではなく、シリアル値となっています。 とありますので・・・ 前回の数式はSheet1のA列が単に1~31の数値だとしての数式でした。 前回の配置そのままだとして、Sheet2のA列数式はそのままで大丈夫です。(配列数式) ただ、表示形式を変更してください。 B2・C2セルの数式が変わってきます。 B2セル(配列数式)は =IF(A2="","",INDEX(Sheet1!$B$2:$F$2,,SMALL(IF(OFFSET(Sheet1!$B$2:$F$2,MATCH(A2,Sheet1!$A$3:$A$33,0),,1)<>"",COLUMN(A1:E1)),COUNTIF($A$2:A2,A2)))) C2セル(配列数式ではありません)は =IF(COUNTBLANK(A2:B2),"",INDEX(Sheet1!$B$3:$F$33,MATCH(A2,Sheet1!$A$3:$A$33,0),MATCH(B2,Sheet1!$B$2:$F$2,0))) に変更してみてください。 ※ 商品数は5品目(5列)としていますので、実際のデータ数に合わせて 数式内の範囲指定部を変更してください。m(_ _)m

seresuthi
質問者

お礼

参考にして、設定することにより 望み通りのエクセルを作ることが出来ました。 ありがとうございます。

その他の回答 (5)

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

日付がシリアル値で入力されているということは例えば2012/12/1と入力されているが表示形式で1日のようにしていると考えてよいのでしょう。 そのことはお示しのような表が月が変わっても入力されていると考えることで良いのですね。 例えばお示しのような表がシート1に有るとしてA1セルに日付の文字がA2セルから下方には日付が入力されているとします。 B2セルからF2セルまでの商品名のAからEが並んでいるとします。 そこで例えば求めたい表の検索年の文字をG1セルにH1セルには2012などの西暦年を入力します。I1セルには検索月と入力してJ1セルには12などと入力します。 お求めの表を作るには複雑な配列数式などを使うことはデータが多くなると計算に負担がかかりますのでできるだけ作業列を使って対応することにします。 G3セルには次の式を入力して下方にドラッグコピーします。 =IF(COUNT(B3:F3)=0,"",IF(AND(YEAR(A3)=H$1,MONTH(A3)=J$1),MAX(G$2:G2)+COUNT(B3:F3))) I3セルには次の式を入力してM3まで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =H3&IF(B3<>"",B$2&"*"&B3&"/","") N3セルには次の式を入力してR3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF($M3="","",TRIM(MID(SUBSTITUTE($M3,"/",REPT(" ",100)),(COLUMN(A1)-1)*100+1,90))) 以上で作業列の操作は終わりです。作業列が目障りでしたらこれらの列を選択して右クリックして「非表示」を選択すればよいでしょう。 シート2にはお求めの表を作成します。 A1セルには日付、B1セルには商品名、C1セルには個数の文字を入力します。 A2セルには次の式を入力して下方にドラッグコピーします。 =IF(ROW(A1)>MAX(Sheet1!G:G),"",INDEX(Sheet1!A:A,IF(ROW(A1)<MIN(Sheet1!G:G),MATCH(MIN(Sheet1!G:G),Sheet1!G:G,0),IF(COUNTIF(Sheet1!G:G,ROW(A1))=1,MATCH(ROW(A1),Sheet1!G:G,0),MATCH(SMALL(Sheet1!G:G,RANK(INDIRECT("Sheet1!G"&MATCH(ROW(A1),Sheet1!G:G,1)),Sheet1!G:G,1)+1),Sheet1!G:G,0))))) シリアル値で表示されますので表示形式を日付にします。 B2セルには次の式を入力してC2セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF($A2="","",IF(COLUMN(A1)=1,LEFT(INDEX(Sheet1!$N:$R,MATCH($A2,Sheet1!$A:$A,0),COUNTIF($A$2:$A2,$A2)),FIND("*",INDEX(Sheet1!$N:$R,MATCH($A2,Sheet1!$A:$A,0),COUNTIF($A$2:$A2,$A2)))-1),MID(INDEX(Sheet1!$N:$R,MATCH($A2,Sheet1!$A:$A,0),COUNTIF($A$2:$A2,$A2)),FIND("*",INDEX(Sheet1!$N:$R,MATCH($A2,Sheet1!$A:$A,0),COUNTIF($A$2:$A2,$A2)))+1,10)*1))

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

実際に想定している商品数や個数は最大でどの程度になるのでしょう。

seresuthi
質問者

補足

商品数は50程度です。 しかし一つのタブで12月分管理しており、 そのタブが20個ほどあります。 一日に出る個数は、全て合わせても20程度です。

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

こんばんは! 一例です。 ↓の画像のようにSheet1(左側)のデータをSheet2(右側)に表示するとします。 Sheet1のA列はシリアル値ではなく、単に1~31までの数値だとします。 Sheet2のA2セル(配列数式)に =IF(COUNT(Sheet1!$B$3:$F$33)<ROW(A1),"",INDEX(Sheet1!$A$3:$A$33,SMALL(IF(Sheet1!$B$3:$F$33<>"",ROW($A$1:$A$31)),ROW(A1)))) B2セル(これも配列数式)に =IF(A2="","",INDEX(Sheet1!$B$2:$F$2,,SMALL(IF(OFFSET(Sheet1!$B$2:$F$2,A2,,1)<>"",COLUMN(A1:E1)),COUNTIF($A$2:A2,A2)))) C2セル(配列数式ではありません!)に =IF(COUNTBLANK(A2:B2),"",INDEX(Sheet1!$B$3:$F$33,A2,MATCH(B2,Sheet1!$B$2:$F$2,0))) という数式を入れ、A2~C2セルを範囲指定 → C2セルのフィルハンドルでずぃ~~~!っと下へコピー! これで画像のような感じになります。 ※ この画面から数式をコピー&ペーストする場合は 配列数式の場合 A2・B2セルに貼り付け後、数式バー内で一度クリック! 編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。m(_ _)m

seresuthi
質問者

補足

A列が数式ではなく、シリアル値となっています。 その場合は変わってしまうのでしょうか?

  • sporespore
  • ベストアンサー率30% (430/1408)
回答No.2

ピボットテーブルを使えば簡単にできます。 ネットで「ピボットテーブル」と入れると多くの方が説明していますので参考にしてやってみてください。

seresuthi
質問者

お礼

そのような方法もあるのですね。 今回は少し思いと違うため、見送らせてもらいますが 参考になりました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

まぁふつーに作業列を追加してジミチ―に行っていけば普段の関数だけでもなんとかやれますが、折角なので。 I2に =IFERROR(INDEX(A:A,SMALL(IF($B$3:$F$33<>"",ROW($B$3:$F$33)),ROW(I1))),"") と記入、必ずコントロールキーとシフトキーを押しながらEnterで入力。下向けに沢山コピー。 J2に =IFERROR(INDEX($2:$2,MOD(SMALL(IF($B$3:$F$33<>"",ROW($B$3:$F$33)*100+COLUMN($B$3:$F$33)),ROW(J1)),100)),"") と記入、必ずコントロールキーとシフトキーを押しながらEnterで入力。下向けに沢山コピー。 K2に =IFERROR(INDIRECT(TEXT(SMALL(IF($B$3:$F$33<>"",ROW($B$3:$F$33)*100+COLUMN($B$3:$F$33)),ROW(K1)),"!R00!C00"),FALSE),"") と記入、必ずコントロールキーとシフトキーを押しながらEnterで入力。下向けに沢山コピー。 すると出来ます。 数式が解析できなくて実地に応用できなかったときは、諦めて多分他の人から寄せられる作業列を使う方法で作成してください。 #この程度の分量なら、配列計算が重いといった事は起こりません。

seresuthi
質問者

お礼

内容がよく分からず、実際に使うことが出来ませんでした。 もう少し、考えたいと思います。 素早い回答、ありがとうございます。

関連するQ&A

  • Excelでの並び替えについて(二度目)

    一度こちらで、同タイトルで質問したものです。 http://okwave.jp/qa/q7834603.html 一度は解決したのですが、 Excel2003で開いたところ、errorになってしまい、使うことができませんでした。 そこで、Excel2003でも計算可能な式を教えていただけませんでしょうか? やりたいことは、行に日付、列に商品名を入力してあり、その間に販売個数が入ったデータを、 画像のように、上から日付順で並び変えたいと思っています。 データが空くところは上に詰めることで、空白ができない方法で。 関数でのやり方があればと思います。 また、可能な限り、余分な行や列は使わずに、同じsheet上に配置したいと思います。 二度目ということで、お手数おかけしますが、よろしくお願いします。

  • エクセル マクロ VBA

    エクセルのマクロについて質問です。 『集計』というブックの『集計開始』というシートに     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 コメント  空白     空白   3行目 空白   空白     空白 4行目 商品名  支店     個数  5行目 空白   空白     空白 6行目 空白   空白   コメント1 7行目 空白   空白     空白 8行目 空白   空白   コメント2 9行目以降    上記のデータ(見出しを除く)の繰り返し というデータが入っています。 B列の中に『AAA』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 C列の中に『B』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 (今は、手作業で編集→置換→検索する文字列の中に『B*』と入力し、 置換後の文字列を空白にしてすべて置換ということをやっています。)                            ABC列(データーの入っている行まで)の空白を含む行を一括削除し、 以下のような形にしたいのです。     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 商品名  支店     個数  3行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

  • エクセル 並び替えがうまくいかない。

    不法投機されたゴミの種類ごとの個数が記載されているエクセルの表を仕事で使用しています。 数が多い順に1位~3位までのゴミの種類をあげてくれと上司にいわれたので並び替えを使用し算出しようとしました。ところが右端にあるゴミの個数のみ空白行がない形でびっしり並び替えされ、並び替えされなかった左端にあるゴミの種類の項目と対応しなくなってしまいました。 そのため、結局 目視で探すことになりました。 このような一つの表であるにもかかわらず、特定の列のみ並び替えされ、連動して並び替えしてほしい列が並び替え対象外となる理由ないしは回避方法についてご存知の方がいたらご教示ください。

  • エクセル関数 セルの個数

    A列に空白セルと文字列が入力されています。 文字列が入っているセルだけをフィルタで抽出しました。 その抽出されたセルが何行あるか個数を出す関数はありませんか?

  • Excel で 並び替えを教えてください。

     添付図のように、A列に1~4など入力すると並び変えられます。 しかし、B列に図のように干支を入力したとたんに、並び替えができなくなります。  データを複数行に入力した場合に行を崩さないで、データの並び替えをすることができますか?   

  • エクセル 数式入り等のセルの個数について

    こんにちわ。教えて下さい。 セルの個数を数えたいのですが、下記のいづれかの方法で出来るやり方はありますでしょうか? ☆条件付き書式で色をつけた空白のみのセルの個数の数え方(列に対応) (1)A1に今日又は今日以前の日付が入って、B1にはA1の日付から2週間たっても、何らかの日付・文字が入らない場合は空白の状態で色がつくようになっています。(文字が入力されたら色は無しになります。2条件が1つのセルに設定されています) 一番ベストなのは、この状態で空白で色のついているセルの個数が数えれば一番いいです。 もし、上記で駄目な場合、 ☆C1に別の数式で、B1が空白かそうでないかで、「FALSE」「TRUE」が表示されるように設定して、その状態で「FALSE」の個数を数えるっていうやり方まではわかるのですが、A,B,C列とも、入力していけば行が増えていくので、先にC列に数式をコピーしておくと、A列に日付が入力されていなくても、「FALSE」が表示されます。A列に日付が入力されている行での「FALSE」の数を数えるという方法はありますか? 説明が下手ですみません。。。 つまり、自分がない知恵で思った、2つの方法のどちらかででも、数える方法があれば教えて下さい。もちろん、もっといい方法があれば幸いです。

  • エクセルで並び替えがうまくいきません。

    エクセル2000で並び替えをしている時、先頭行の各セルの項目が「並び替え」ダイアログボックスの「優先されるキー」に表示されず、うまく並び替えることができないことがありました。また、無理やり、「最優先されるキー」のところに、たとえばE列とか入れて並び替えをさせようとしたら、セル内のデータが統一なくバラバラになってしまいました。いったんそのBOOKは捨て、再度テータを再入力したところ、今度は問題なく入力できたのですが、こなことってあるのでしょうか?大切なデータを扱っているので、以後、こんなことがないように防止策を講じたいのですが、どうしたらこんなことになるのか原因をまず知りたいと思います。どなたかご存知の方があれば、教えてください。よろしくお願いします。

  • Excelで、COUNTA関数の代わりのようなもの、何かありますか?

    B列のセルに 3/3 3/3 3/3 3/4 3/4 3/5 3/5 3/5 という風に、同じ日付が入力されているとします。 同じ日は無視して、これを、3と数えることはできますか? 同じ日付を空白にすれば、COUNTA関数で出来ると思いますが、 このリストは、このままで、 同じ日付を無視して、数えた結果、 3と返ってくる、関数、もしくは、他の方法があったら、教えてください。 よろしくお願いいたします。

  • (エクセル)表から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を組めばいいかもお願いいたします。

  • エクセルの表の並び替え

    エクセル2003(OSはwin7(HP))を使用しています。 表の並び替えをやりたいのですがご存知の方、ご教授願います。 目的 ・クラス分けされた人(20人程度)のそれぞれの点数が示された表 (B列にクラス、C列に点数、D列に氏名が入力済み)にクラス平均点を 示す行を追加したい。 条件 ・B列に0から順に3までの数値が並んでいます。これは学校などの クラスをあらわしており、C列に点数(D列に名前があるが今回は無視)が 入力されています。 ・クラスは整数で表されており、0から3まであります。 並び方は0から順に大きくなっていきますが、どの数値が何行あるかは 決まっていない状態。(各クラスの人数はバラバラ)   ・例えば B列(B1セル~B7セル)に 0,0,0,1,2,2,3 C列(C1セル~C7セル)に 4,2,6,5,9,5,2 と入力されている場合  0クラスの平均点は4点(4,2,6の平均)、1クラスの平均点は5、2クラスは 7(9,5の平均)、3クラスは2となります。  これを以下のように各クラスの境目に平均点を示す行を1行ずつ追加したいのです。  F列(F1セル~B11セル)に0,0,0,"平均",1,"平均",2,2,"平均",3,"平均"  G列(G1セル~G11セル)に4,2,6, 4 , 5 , 5 , 9,5, 7 , 2, 2  これをマクロではなく、関数を組み合わせてうまくやりたいのですがそのやり方に ついてお教えください。

専門家に質問してみよう