回答No.4です。
>早速試させていただきましたところ、「入力した式は正しくありません」と出てしまい、数式中の6つめのROWがハイライトされます。
>エクセル2002に起因するエラーでしょうか?
回答No.2様が
>※ COUNTIFS関数を使用していますので、Excel2007以降での対応となります。
と仰っておられる事に対して、質問者様の御補足では何も触れておられなかったため、質問者様が御使いのExcelはExcel2007以降のものだと判断し、回答No.4の関数を御伝え致しましたが、回答No.4の投稿後になってから回答No.3に対して付けられた御補足によりますと、現在手元で使っておられるExcelはExcel2002なのですね。
Excel2007よりも前のバージョンのExcelでは、ネスト(関数の中に関数を何重の入れ子にしているかを表す数)のレベルが7レベルまでの関数しか使う事が出来ません。
回答No.4の関数のネストレベルは8ですので、Excel2002では使う事が出来ません。
一方、Excel2007からはネストレベルが64まで可能となっていますので、通常使用するのがExcel2007という事でしたら、そちらで確認して頂いた方が良いと思います。
尚、Excel2003以前のExcelで同じ事を行う場合には、E2セルに入力する関数を次の様なものとして下さい。
=IF(AND($A2<>"",ISNUMBER($B2)),$B2+IF(ROW()-MATCH($A2,$A:$A,0)+1=MATCH(MAX(OFFSET(INDEX($B:$B,MATCH($A2,$A:$A,0)),,,COUNTIF($A:$A,$A2))),OFFSET(INDEX($B:$B,MATCH($A2,$A:$A,0)),,,COUNTIF($A:$A,$A2)),0),SUMIF($A:$A,$A2,$D:$D),0),"")
これは、回答No.4の関数の中の「INDEX($A:$A,ROW())」という部分を「$A2」に、「INDEX($B:$B,ROW())」という部分を「$B2」に、それぞれ置換したものです。
それでは何故回答No.4では、最初から「$A2」や「$B2」にしておかなかったのかと申しますと、「$A2」や「$B2」とした場合には、元データであるA列のセルやB列のセルに対して、切り取りや挿入、並べ替え等のセルの位置が変わってしまう様な操作を行った際に、セルの位置関係がずれてしまい、関数によって得られる値がおかしくなってしまう事があるためです。
一方、セルの指定方法として「INDEX($A:$A,ROW())」や「INDEX($B:$B,ROW())」等の様にしますと、A2セルやB2セルといった特定のセルを指定している訳ではなく、「A列の中で『この関数が入力されているセル』と同じ行番号の所にあるセル」、「B列の中で『この関数が入力されているセル』と同じ行番号の所にあるセル」という指定方法になりますから、元データであるA列のセルやB列のセルに対して、切り取りや挿入、並べ替え等のセルの位置が変わってしまう様な操作を行った場合でも、正しい結果が得られるからです。
それから、回答No.4の関数の動作確認をExcel2002で行われるのでしたら、回答No.4の関数の中の一部である、ネストのレベルが深い所に記述されている関数を作業列に移しておき、その作業列で得られた結果を利用して、回答No.4の関数の中のネストのレベルが浅い所に記述されている関数による処理を行う様にすれば良い訳です。
具体的には、まず、回答No.4の関数である
=IF(AND(INDEX($A:$A,ROW())<>"",ISNUMBER(INDEX($B:$B,ROW()))),INDEX($B:$B,ROW())+IF(ROW()-MATCH(INDEX($A:$A,ROW()),$A:$A,0)+1=MATCH(MAX(OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW())))),OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW()))),0),SUMIF($A:$A,INDEX($A:$A,ROW()),$D:$D),0),"")
の中の
MAX(OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW()))))
という部分(伝票番号が同じものの中における、最も高い発送金額を求める関数)を取り出し、それを、その部分が動作する条件である
IF(AND(INDEX($A:$A,ROW())<>"",
と組み合わせた
=IF(AND(INDEX($A:$A,ROW())<>"",ISNUMBER(INDEX($B:$B,ROW()))),MAX(OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW())))),"")
という関数を、適当な列(ここでは仮にG列を使う事にします)の2行目以下に入力しておきます。
そして、E2以下には、回答No.4の関数の中の
MAX(OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW()))))
の部分を、「G列の中で『この関数が入力されているセル』と同じ行番号の所にあるセル」の値を返す関数である
INDEX($G:$G,ROW())
に置き換えた、
=IF(AND(INDEX($A:$A,ROW())<>"",ISNUMBER(INDEX($B:$B,ROW()))),INDEX($B:$B,ROW())+IF(ROW()-MATCH(INDEX($A:$A,ROW()),$A:$A,0)+1=MATCH(INDEX($G:$G,ROW()),OFFSET(INDEX($B:$B,MATCH(INDEX($A:$A,ROW()),$A:$A,0)),,,COUNTIF($A:$A,INDEX($A:$A,ROW()))),0),SUMIF($A:$A,INDEX($A:$A,ROW()),$D:$D),0),"")
という関数を入力して下さい。
これで、Excel2002を使って、回答No.4の関数の動作確認を行う事が出来ます。
お礼
No.1様 「最後の一つ」にまとめての加算もできました。 ひとりではこの式には絶対たどりつけなかったと思います。 本当にありがとうございました!!