• ベストアンサー

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/7941)
回答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
質問者

お礼

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