状況:
出退勤表にありがちなシチュだと思うが、こんな感じの表を考えてみる。1日の労働時間の集計をするには単純に
(退勤時間 - 出勤時間)の合計
な分けだが、それを数式で表すにはどうすればいい?
1.集計用の列を追加して、その列で集計する。
こんな感じ。
2.なんとか1個のセル内で計算する。
1の方法でも集計処理自体は問題なく実現できる。
しかし、見た目を整えるのが面倒だ。
集計用の別シートを作成して、そこで処理すれば、見た目は何とかなるだろう。
しかし、この方法ではネタにならない。
というわけで、2を採用。
考え方:
(退勤時間 - 出勤時間)の合計この式を
退勤時間の合計 - 出勤時間の合計
と展開する。
つまり、バックが白色の行の合計から、薄青の行の合計を引くことを考える。
合計を求めるならSUM関数だが、範囲指定をどうするか?
セルを1行おきに直接指定する。
まあ、人数追加(行追加)とかなければ、問題はない。
行数が多いと数式を記述するのが大変そうだが・・・
しかし、人数追加にも対応できて、記述も楽なやり方はないだろうか?
行追加に対応するためには、エクセル自身の補正機能?
(あの、行や列を追加した時に、数式の範囲を自動的に変えてくれる機能)
を使えるようにしたい。
そのためには、
”B4:B11”
というような連続した範囲をSUM関数に指定する必要がある。
そして、その連続した範囲を2つの別々の範囲に分けて合計を求める。
ということを考えてみる。
実際の数式:
範囲を分けるやり方だが、配列数式で範囲の一部を0に置き換えて合計する方法
{=(SUM(IF(条件1,B4:B11,0))-SUM(IF(条件2,B4:B11,0)))*24}
が考えられる。(24を乗じているのは単位を時間にするため)
これには、出勤時間と退勤時間の行を判定する条件が必要になる。
さてどうするか?
これは行番号で判定できるだろう。
今回の例では、1行おきなので、行番号が偶数か奇数で範囲を分けられるので、
条件1:
ISODD(ROW(B4:B11)-ROW(B$4))
条件2:
ISEVEN(ROW(B4:B11)-ROW(B$4))
とすれば良いだろう。
(ここで、ROW(B$4))を引いているのは、表の上に行が追加された場合を想定しての処理。)
これでいいんだが、飛ばす行数が変わる場合も想定して、
条件1:
MOD(ROW(B4:B11)-ROW(B$4),2)=1
条件2:
MOD(ROW(B4:B11)-ROW(B$4),2)=0
こっちのほうがいいだろう。
結果:
これでOK。
参考:
こんな変更があってもわずかな手間で修正できる。B5:B16とB$5への変更は行を追加したときにエクセルが自動的にやってくれる。
手作業で変更したのは除数を2から3にしただけ。
以上、今回はおしまい。
0 件のコメント:
コメントを投稿