- ベストアンサー
エクセルで日付順にデータを自動的に並べ替える方法
- エクセルで日付け順位にデータを並べ替えたいと思います。エクセル機能の並べ替え利用するのではなく、数式で並べ替えたいと思っています。
- VBAもできませんが、同じ日時や空欄がある場合も対応できる方法があれば教えていただけませんか。
- 質問内容: エクセルで数式を使用して日付け順にデータを並べ替えたい。同じ日時や空欄がある場合も対応できる方法を教えてほしい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
E,F,G列に並べ替えしたデータを表示させるとして、例えばH列を作業列としてI1セルには次の式を入力しえ下方にオートフィルドラッグします。 =IF(A1="","",IF(C1="",50000+ROW(A1),C1+ROW(A1)*0.001)) そこでE1セルには次の式を入力してG1セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF($A1="","",IF(AND(SMALL($I:$I,ROW(A1))>50000,COLUMN(A1)=3),"",INDEX($A:$C,MATCH(SMALL($I:$I,ROW(A1)),$I:$I,0),COLUMN(A1)))) G列を選択したのちに書式設定の表示形式から日付の和暦で選択すればよいでしょう。
その他の回答 (4)
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答番号ANo.4です。 >F1のセルがうまく表示されません。(E1と同じになってしまいます) それはおそらく、E1セルに数式を入力した際の入力ミスが原因かと思われます。 ANo.4では、E1セルに入力する数式を =IF(ROWS($1:1)>COUNT(Sheet2!$A:$A),"",INDEX( Sheet1!A:A ,MATCH(SMALL(Sheet2!$A:$A,ROWS($1:1)),Sheet2!$A:$A,0))) と言う具合に、「INDEX(」の後に続く、Sheet1のA列を参照する様に指定している箇所を、相対参照としていますが、もしかしますと、質問者様は誤って、 =IF(ROWS($1:1)>COUNT(Sheet2!$A:$A),"",INDEX( Sheet1!$A:$A ,MATCH(SMALL(Sheet2!$A:$A,ROWS($1:1)),Sheet2!$A:$A,0))) と言う具合に、絶対参照にしてはおられないでしょうか? もし、「INDEX(Sheet1!$A:$A」とされていた場合には、「INDEX(Sheet1!A:A」に戻して下さい。 そしてその上で、E1セルをコピーして、Sheet1のF1セルに貼り付けてから、Sheet1のE1~F1の範囲をコピーして、同じ列の2行目以下に貼り付けて下さい。 >難しい内容を回答頂き ANo.4の回答では、元データが入力されているセルが削除、挿入、切り取り、貼付け、等の編集作業が行われて、セルの位置関係がずれてしまった場合も考えて、セルの位置が上下にずれた場合においても、正常に動作する様にするために、「INDEX(Sheet1!$C:$C,ROW())」等の様に、 INDEX関数とROW()の組み合わせで参照先を指定しているために、数式が長くなっております。(セルが左右にずれる場合には対応しておりません) それから、計算処理に要するパソコンの負荷は大きくなりますが、作業列を使用せずに、関数のみで並べ替える事も、一応は可能です。 まず、E1セルに次の数式を入力して下さい。 =IF(ROWS($1:1)& gt;COUNTIF($A:$A,"*"),"",INDEX(A:A,SUMPRODUCT(ROW(INDEX($A:$A,1):INDEX($A:$A,MATCH("゛",$A:$A,-1)))* (INDEX($C:$C,1):INDEX($C:$C,MATCH("゛",$A:$A,-1))=IF(ROWS($1:1)> COUNT($C:$C),"",SMALL($C:$C,ROWS($1:1))))* (COUNTIF(OFFSET(INDEX($C:$C,1),,,ROW(INDEX($A:$A,1):INDEX($A:$A,MATCH("゛",$A:$A,-1)))),"="& amp;IF(ROWS($1:1)>COUNT($C:$C),"",SMALL($C:$C,ROWS($1:1))))=IF(ROWS($1:1)>COUNT($C:$C),ROWS($1:1)-COUNT($C:$C),ROWS($1:1)-RANK(SMALL($C:$C,ROWS($1:1)),$C:$C,1)+1))))) 次に、G1セルに次の数式を入力して下さい。 =IF(ROWS($1:1)& gt;COUNT($C:$C),"",INDEX($C:$C,SUMPRODUCT(ROW(INDEX($A:$A,1):INDEX($A:$A,MATCH("゛",$A:$A,-1)))* (INDEX($C:$C,1):INDEX($C:$C,MATCH("゛",$A:$A,-1))=SMALL($C:$C,ROWS($1:1)))* (COUNTIF(OFFSET(INDEX($C:$C,1),,,ROW(INDEX($A:$A,1):INDEX($A:$A,MATCH("゛",$A:$A,-1)))),"="& amp;SMALL($C:$C,ROWS($1:1)))=ROWS($1:1)-RANK(SMALL($C:$C,ROWS($1:1)),$C:$C,1)+1)))) 次に、E1セルをコピーして、F1セルに貼り付けて下さい。 次に、E1~G1の範囲をコピーして、同じ列の2行目以下に貼り付けて下さい。 これで、日付け順位のデータを並べ替えが自動的に行われます。(こちらも、セルが上下にずれた場合でも正常に動作します)
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、元データが存在しているシートのシート名がSheet1であるものとします。 又、Sheet2のA列を作業列として使用するものとします。 まず、Sheet2のA1セルに次の数式を入力して下さい。 =IF(ISNUMBER(INDEX(Sheet1!$C:$C,ROW())),INDEX(Sheet1!$C:$C,ROW())+COUNTIF(INDEX(Sheet1!$C:$C,1):INDEX(Sheet1!$C:$C,ROW()),INDEX(Sheet1!$C:$C,ROW()))*"0:0:1"/COUNTIF(Sheet1!$C:$C,INDEX(Sheet1!$C:$C,ROW())),IF(OR(ROW()>MATCH("゛",Sheet1!$A:$A,-1),INDEX(Sheet1!$A:$A,ROW())="",INDEX(Sheet1!$B:$B,ROW())=""),"",9999999+ROW())) 次に、Sheet2のA1セルをコピーして、Sheet2のA2以下に貼り付けて下さい。 次に、Sheet1のE1セルに次の数式を入力して下さい。 =IF(ROWS($1:1)>COUNT(Sheet2!$A:$A),"",INDEX(Sheet1!A:A,MATCH(SMALL(Sheet2!$A:$A,ROWS($1:1)),Sheet2!$A:$A,0))) 次に、Sheet1のG1セルに次の数式を入力して下さい。 =IF(ROWS($1:1)>COUNT(Sheet1!$C:$C),"",INDEX(Sheet1!$C:$C,MATCH(SMALL(Sheet2!$A:$A,ROWS($1:1)),Sheet2!$A:$A,0))) 次に、Sheet1のE1セルをコピーして、Sheet1のF1セルに貼り付けて下さい。 次に、Sheet1のE1~G1の範囲をコピーして、同じ列の2行目以下に貼り付けて下さい。 これで、日付け順位のデータを並べ替えが自動的に行われます。
お礼
早速、難しい内容を回答頂きありがとうございました。現在、試していますが F1のセルがうまく表示されません。(E1と同じになってしまいます) 私の操作がダメでしょうか?お願いします。
- KURUMITO
- ベストアンサー率42% (1835/4283)
回答No2です。 データが1000行以上にもなるのでしたら、I1セルへの入力の式は次のようにしてください。 =IF(A1="","",IF(C1="",50000+ROW(A1),C1+ROW(A1)*0.00001))
- shincha119
- ベストアンサー率42% (95/226)
1:データ行を全て選択する(Aから"空欄"までの範囲) 2:「データ」メニューから並べ替えを選択して、日付の列を選択(この場合はCかG) これでソートできますよ。
補足
回答ありがとうございます。ソートでなく自動的にできるといいなと思っております。何卒よろしくお願いします。
お礼
ありがとうございます。できました。感謝です!!