- ベストアンサー
旅費を二重払いしないための関数SUMPRODUCT
- エクセル2010を使っている者です。たとえば以下のようにエクセルの表において、旅費精算をする1つの旅行(出張)について一行で書いたシートがあったとします。
- 田中一郎さんについて見ていただきたいのですが、この場合、機械的に作業すると二重に旅費を支払ってしまいそうな場合に関係する行は、10行目以外のすべてです。氏名が同じで、出発日、到着日が重なっている部分がある場合はもちろんのこと、連続して出張している場合(11月5日、11月6日)もその危険性があります。
- 指定したセル(列)に「確認」という文字が入るように以下の関数を組んで下にドラッグしているのですが、完全にはうまく動いてくれません。12行目の11月15日の出張についても「確認」と入ってほしいのですが、11行目の14日の行については「確認」と入るのに、12行目には入りません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
考えをまとめるため、はじめに、重複判定の方法を解説しておきます。 AとBで範囲が重複しているデータというのは、 A ===== B===== A===== B ===== A ======= B ===== A ===== B ======= 以上のパターンになります(端がそろっているものも同じパターンとみることにします) これに共通している条件は Aの始端<=Bの終端 かつ Bの始端<=Aの終端 です。 (念のため、重複しないデータは (A ==== (B ==== (Bの始端<=Aの終端の条件に合わないことがわかります。 さらに連続データも含めるため、検討するデータは両端を1日ずつ大きくして考えることにします。 これを式にすると (2行目に書く式の場合) {=if( sumproduct( (B$2:B$1000=B2) * (C$2:C$1000<=D2+1) * (C2-1<=D$2:D$1000) ) > 1,"確認","" ) } (1行目は、見出しが書かれているので、2行目からの検討にしています。) この式では、かならず自分自身のデータも比較されてしまう(たとえばC2=<D2+1)ので、ほんとなら条件に合わない場合でもsumproductの結果は1になってしまいます。なので、条件に合う時の値は2以上なので最後の比較は >=1 でなく >1 になっています。
その他の回答 (2)
- kagakusuki
- ベストアンサー率51% (2610/5101)
Excel2010を御使いなら、SUMPRODUCT関数ではなく、COUNTIFS関数を使った方が計算処理の負荷が軽くなるかと思います。 次の関数を「確認」と表示させたい列のセル(行番号は問いません)に入力してから、そのセルをコピーして、「確認」と表示させたい欄の他の全てのセルに貼り付けて下さい。 =IF(AND(INDEX($B:$B,ROW())<>"",COUNT(INDEX($C:$C,ROW()),INDEX($D:$D,ROW()))=2),SUBSTITUTE(IF(COUNTIFS($B:$B,INDEX($B:$B,ROW()),$C:$C,"<="&INDEX($C:$C,ROW()),$D:$D,">="&INDEX($C:$C,ROW())-1)>1,"出発確認","")&IF(COUNTIFS($B:$B,INDEX($B:$B,ROW()),$D:$D,">="&INDEX($D:$D,ROW()),$C:$C,"<="&INDEX($D:$D,ROW())+1)>1,"帰着確認",""),"確認帰","・帰"),"") すると、 出発日が「他の出張の、出発日から『帰着日の翌日』までの期間」に重なる場合には「出発確認」と表示され、 帰着日が「他の出張の、『出発日の前日』から帰着日までの期間」に重なる場合には「帰着確認」と表示され、 出発日が「他の出張の、出発日から『帰着日の翌日』までの期間」に重なっていて、尚且つ帰着日が「他の出張の、『出発日の前日』から帰着日までの期間」に重なっている場合には「出発・帰着確認」と表示されます。
お礼
素晴らしい関数をありがとうございます。 なんとか解読できました。
- picopico_7
- ベストアンサー率30% (11/36)
お礼
ありがとうございます。 非常にわかりやすく、適切に書いていただき、大変助かりました。