[[20100929112054]] 『日付が早い順から重複ありの連番をふる方法』(Rose) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『日付が早い順から重複ありの連番をふる方法』(Rose)

 発注書を作っています。
 過去ログでみつけられなかったので教えてください。
 最大6品目の複数商品があり、1ヶ月ごとに発注をします。
 発送日は毎週1回と決まっており、最大4週分を一度に発注します。
 (5週間ある場合は最終週は数えないので最大でも4週です。)

 たとえばC2からC5まで発送の順番を入れていきたいのですが、
 単純にRANK関数を入れるとこのように表示されます。

 	A	B	C	
 1	品番	発送日	発送順
 2	0002	10/7	1
 3	0003	10/7	1
 4	0003	10/28	5
 5	0004	10/14	3
 6	0004	10/28	5
 7	0005	10/14	3

 これを下記のように表示するにはどうしたらいいでしょうか。
 発送は月に1回しかない場合もあれば、毎週(4回)ある場合もあり、
 MAX/MIN/LARGEなどを使ってもいまいちうまくいきませんでした。

 	A	B	C	
 1	品番	発送日	発送順
 2	0002	10/7	1
 3	0003	10/7	1
 4	0003	10/28	3
 5	0004	10/14	2
 6	0004	10/28	3
 7	0005	10/14	2

 関数でよろしくお願いします。XP、EXCEL2003です。

 C2セルに
 =SUMPRODUCT(((COUNTIF(OFFSET(B$2,,,ROW($1:$6)),B$2:B$7)>1)*10^7+B$2:B$7<B2)*1)+1
 と入力して下へコピー、でどうでしょうか?

 なお、範囲を変更する場合、「ROW($1:$6)」の部分は1から計算範囲の行数としてください。
 (上の式の場合、2行めから7行めの6行なので「ROW($1:$6)」としている)

 例:発送日がB5セルからB20セルの場合、5行目から20行目までの16行なので
 =SUMPRODUCT(((COUNTIF(OFFSET(B$5,,,ROW($1:$16)),B$5:B$20)>1)*10^7+B$5:B$20<B5)*1)+1
 とする。
 (独覚)

 発送日を昇順に並べ替えれば簡単だと思いますが(表も見やすくなるし)
 並べ替えは不可なのでしょうか?

 並べ替え不可、作業列の使用は可なら

     A    B    C    D     
 1   品番  発送日  発送順
 2   0002  10/7    1   10/7
 3   0003  10/7    1
 4   0003  10/28    3   10/28
 5   0004  10/14    2   10/14
 6   0004  10/28    3
 7   0005  10/14    2

 D2 =IF(COUNTIF($B$2:B2,B2)=1,B2,"")
 C2 =IF(B2="","",RANK(B2,$D$2:$D$10,1))

 下にフィルコピー

 (R)


 独覚さま

 サンプルの表ではうまくいきました! ありがとうございます。

 ただ、実際の表では、不規則に行間があいています。
 実際の表に当てはめてみたところ、1となってほしいところに
 15と表示されました。空欄の部分を1としてしまうためのようです。
 空欄の場合はIFで""を返すようにしてみても同じでした。

 ↑↑↑
 ここまで書いていたところで、Rさまの回答をいただきました。

 Rさま

 空欄の場合を先読みしていただいてありがとうございます。
 作業列を使う方法でうまくいきました!
 ありがとうございました。 

 ちなみに今回の質問は、もともとの(他の人の)フォーマットがあって、
 そこに自動で表示できないか、という依頼を受けてのことでした。
 外国に送る発注書なので、フォーマットを変えたりはあまりしたくないそうです。
 さらに実際は、「1st、2nd、3rd、4th」と記載したい、とのことだったのですが、
 そこはがんばって自分でやってみます。

 みなさまありがとうございました。 
 なお、最初の質問の範囲が間違っていました、すみません。C5→C7(Rose)


 途中に空欄がある場合はこのように。

 =IF(B2="","",SUMPRODUCT((((COUNTIF(OFFSET(B$2,,,ROW($1:$6)),B$2:B$7)>1)+(B$2:B$7=""))*10^7+B$2:B$7<B2)*1)+1)

 さらに、「1st、2nd、3rd、4th」は
 =IF(B2="","",CHOOSE(SUMPRODUCT((((COUNTIF(OFFSET(B$2,,,ROW($1:$6)),B$2:B$7)>1)+(B$2:B$7=""))*10^7+B$2:B$7<B2)*1)+1,"1st","2nd","3rd","4th"))
 で。

 Rさんの式であれば
 C2 =IF(B2="","",CHOOSE(RANK(B2,$D$2:$D$10,1),"1st","2nd","3rd","4th"))
 で。
 (独覚)


 独覚さま

 つぶやきにまでご回答いただき恐縮です…。
 お恥ずかしながら、IFとかVLOOKUPの力技でやろうと思ってました。
 CHOOSE関数ってこんなふうに使うんですね〜!
 RANKと相性がよさそうですね。今後も応用したいと思います☆

 (Rose)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.