• ベストアンサー

EXCEL 数式・関数でソートしたい

数式・関数でソートする方法を教えてください。 A列に日付、B列に品名、C列に個数が入ったSheet1があります。 これを日付順にソートしたSheet2をつくりたいと思っています。 Smallでやろうと思ったのですが、同じ日付が何回もでてくるために、うまくいきませんでした。 よろしくお願いします。

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

  • ベストアンサー
回答No.3

こんばんは。 昨日のご質問にもお答えしたものです。 これも同じ考えた方でできますよ。 ■作業列を使う方法です。 作業列はどの列を使用してもかまいません。 ここでは例として Sheet1の J列を使います。 A列の日付が 2行目から始まっているとすれば、 Sheet1の J2に↓( J列の表示形式は 「標準」 のままにしておいてください) ---------------------------- =IF(A2="","",A2*10000+ROW()) ---------------------------- ◆上の数式を、A列のデータ最終行までコピーしてください。 今後もデータが増えるのなら、予想される最大行までコピーしておいてください。 ( 最大500件だと思えば、J500 までコピー) 3.85E+08 ←のような感じで表示されても気にしないでください。 列幅を広げればちゃんと表示されます。  作業列が目障りなら非表示にしてください。 Sheet2 の A2に↓ ---------------------------------------------- =IF(COUNT(Sheet1!$J:$J)<ROW(A1),"",INDEX(Sheet1!$A:$C,MATCH(SMALL(Sheet1!$J:$J,ROW(A1)),Sheet1!$J:$J,0),COLUMN(A1))) ---------------------------------------------- 作業列を J列と仮定しています。 J列以外の列を作業列に使う場合は、数式の $J:$J (3ヶ所)をその列記号に変更してください。 絶対参照($)にしているところは必ず絶対参照にしておいてください。 ROW(A1)、COLUMN(A1) の A1はそのままにしておいてください。 ◆この数式を、そのまま右にC2までコピー そのまま(A2~C2が選択された状態で)下に、Sheet1 のデータ件数分コピーしてください。 今後もSheet1のデータが増えつづけるのなら、予想される最大行までコピーしておいてください。 A列の表示形式を「日付」、B・C列の表示形式を「標準」にしてください。   ◇ ROW(A1)、COLUMN(A1) の意味については、昨日のご質問の補足にお答えしておきましたので、そちらをご覧ください。

その他の回答 (3)

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

日付は日付シリアル値で値の実態は整数です。 A列にA2:A6に 2003/4/5 2004/1/1 2004/3/4 2003/4/5 2001/5/1 があるとします。 RANKは同じ日が同じ順位数字になってしまいます。これを避けるために、ある日で9件までしかダブらないと仮定できるなら =A2+0.1*COUNTIF($A$2:A2,A2) をB2にいれB6まで複写します。 B列の書式を数値、小数点以下を2位にしておきます。1位でもよいが。 10件をダブル可能性ありなら、0.01をかけましょう。 37716.10 37987.10 38050.10 37716.20 37012.10 となります。 これでB列でランクをとると =RANK(B2,$B$2:$B6) を複写する。 昇順ならSMALL関数を使う。 結果 4 2 1 3 5 これで連続した順位が振れました。 Sheet2にいって =OFFSET(Sheet1!$A$2,MATCH(ROW(),Sheet1!$C$2:$C$6,0)-1,0) と入れてA5まで複写する。 結果(書式を必ず日付にしておく) 2004/3/4 2004/1/1 2003/4/5 2003/4/5 2001/5/1 と並びました。(降順)

kt1
質問者

補足

皆様、ご回答ありがとうございました。 お礼が遅くなり申し訳ございません。また、補足欄で皆様にお礼申し上げる非礼をお許しください。 色々なやり方があって驚きました。どれも参考になるご回答です。 じっくり検討したいと思います。

回答No.2

こんにちは ご希望の回答であるかどうか自信がありませんが、私でしたらこんな関数で作成しますので、参考になさってください。 1 入力Sheet1のD列に =IF(A2="","",YEAR(A2)*100+MONTH(A2)+ROW()/1000)と日付を数字に変換。  (/1000の1000はデータの数に伴い変更してください。) 2 入力Sheet1のE列に =IF(A2="","",RANK(D2,$D:$D,1)として、1で取出した数字をRANKづけします。 3 1と2をドラックし行コピーします。 4 Sheet2 のA2から 1,2,~と番号を入力しておきます。 5 Sheet2のB2に =INDEX(Sheet1$A$2:$E$1000,MATCH(A2,Sheet1$E$2:$E$1000,0),1) 6 同じくC2に ),2),   D2に ),3)といれ、これらを 下にドラックしてコピーします。 説明が下手ごめんなさい。 少しでも参考になれば幸いです。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

D列に D2=TEXT(A2,"yyyymmdd")&TEXT(ROW(),"0000") としてこの列でSMALL関数を使えばできませんか?

関連するQ&A