都道府県穴埋めゲーム

作業時間をエクセルで計算させたいのですが、よろしくお願いします。
条件は
1.作業時間 0時~24時
2.普通作業時間帯 8時30分~17時20分(昼休み1時間で7時間50分)
3.普通時間外作業時間帯 5時~8時30分及び17時20分~22時
4.深夜時間外作業時間帯 0時~5時及び22時~24時
5.昼休みは12時~13時
6.時間は分単位
です。この条件で
作業開始時間  作業終了時間 普通時間 普通時間外 深夜時間外
   A1         B1     C1     D1     E1
という項目を設け、作業開始時間A1と作業終了時間B1に時間を入力し、
普通時間C1・普通時間外D1・深夜時間外E1のセルに計算させたいのですが
よろしくお願いします。作業ですのであらゆる時間帯があり、作業終了時間も決まってません。できれば、マクロでなく関数で計算させたいのですがよろしくお願いします。  

A 回答 (2件)

     A      B      C     D      E


1 作業開始時間 作業終了時間  普通時間  普通時間外  深夜時間外
2   入力     入力     式1     式2     式3


と表があるとします。C2、D2、E2に式1、式2、式3を入力します。後はコピーしてください。

式1= IF( MIN("12:00",B2)>MAX( "8:30",A2) ,(MIN("12:00",B2)-MAX( "8:30",A2)),0)
   +IF((MIN("17:20",B2)>MAX("13:00",A2)),(MIN("17:20",B2)-MAX("13:00",A2)),0)

式2= IF( MIN( "8:30",B2)>MAX( "5:00",A2) ,(MIN( "8:30",B2)-MAX( "5:00",A2)),0)
   +IF((MIN("22:00",B2)>MAX("17:20",A2)),(MIN("22:00",B2)-MAX("17:20",A2)),0)

式3= IF( MIN( "5:00",B2)>MAX( "0:00",A2) ,(MIN( "5:00",B2)-MAX( "0:00",A2)),0)
   +IF((MIN("24:00",B2)>MAX("22:00",A2)),(MIN("24:00",B2)-MAX("22:00",A2)),0)

作業終了時間が24:00を超える場合は想定していません。
作業開始時間~24:00と0:00~作業終了時間に分けて入力します。
また、24時間超の勤務時間は対応していません。(対応すれば、式がどんどん複雑になっていきます)

上式は、下のユーザー定義関数(面倒な期待値計算等を計算する時に使う方法です。)を考えた後、作り出した式です。
ある意味、調和が取れていてきれいではあります。ただ、ユーザー定義関数の方が可読性、保守性はいい様に思いました。
関数をお望みのようなので作ってみました。ご参考に。

<下の関数の使い方>
 =KinmuJikan(勤務開始時刻セル、勤務終了時刻セル、計算区分)
・・・・・・・・・計算区分 1:普通、2:普通時間外、3:深夜
のように使うユーザー定義関数です。

Function KinmuJikan(srtTM As Date, endTM As Date, Kinmu As Integer)
  Dim tmTable As Variant  '作業時間帯のテーブル
  Dim tmKbn As Variant   '作業時間帯の区分(0:休み、1:普通、2:普通時間外、3:深夜)
  tmTable = Array("0:00", "5:00", "8:30", "12:00", "13:00", "17:20", "22:00", "24:00")
  tmKbn = Array(0, 3, 2, 1, 0, 1, 2, 3)

  Dim srtKbn As Integer  '勤務開始の区分
  Dim endKbn As Integer  '勤務終了の区分
  Dim t As Integer     'カウンタ
  'どの区分から勤務開始し、どれで終わったか調べる
  For t = LBound(tmTable) + 1 To UBound(tmTable)
    If tmTable(t - 1) < srtTM And srtTM <= tmTable(t) Then srtKbn = t
    If tmTable(t - 1) < endTM And endTM <= tmTable(t) Then endKbn = t
  Next

  Dim srtTime As Date   '作業時間帯での計算開始時刻
  Dim endTime As Date   '作業時間帯での計算終了時刻
  KinmuJikan = 0
  For t = srtKbn To endKbn
    srtTime = Application.Max(tmTable(t - 1), srtTM)
    endTime = Application.Min(tmTable(t), endTM)

    '勤務時間を合算する
    KinmuJikan = KinmuJikan - (endTime - srtTime) * (tmKbn(t) = Kinmu)
  Next
End Function
    • good
    • 0
この回答へのお礼

急な出張で、返事が今日になってしまいすみませんでした。上記の式1.2.3で見事できました。さっそく使い業務にいかしたと思います。ありがとうございました。

お礼日時:2003/02/09 14:55

苦労して1日考えました。

理解していただけるか心配ですが、取り急ぎ一応載せます。テストも充分でないので、理解して・テストして、自己責任で使ってください、責任は取れません。業務用ソフトなので簡単には出来ません。頑張ってください。
(1)始業時刻はA列、終業時刻はB列に入力する。
8:30や5:30のように入力する。真夜中2時の場合も2:00と
入力してください。
始業時刻>0、終業時刻>0のチェックはしていません。
後記の変換後時刻を考えた後で、始業時刻<終業時刻はチェックしてない。
朝5時を跨いだ勤務時間の入力は、次ぎの日(次行に記入)してもらう約束とすること。別の勤務日の扱いにする。
昼の休息時間との関係で、12時台の終業時刻も12時を越える部分は1時以降に繰り越さず、休憩時間としている
(各社取り扱いが違うでしょう。問題ありの点)。本来入れさせない方が簡単になる。12時30分まで続けて働いて帰った人は、1:30と記入可とするとか。
(2)朝5時が1日のスタートなので(私のやり方では、そう捕らえるので)朝5時を0時に変換する。丁度5時間時差のある国へ行ったと考える。(私の工夫)
(3)したがって始業時刻を変換した時刻をC列に、終業時刻を変換した時刻をD列に入れる。変換は後記の関数式で行う。
(4)1日を、(A)早朝就業、(B)通常就業、(C)時間外就業、(D)深夜就業と名付け、4つに区分する。
AはE列、BはF列、CはG列、DはH列に出す。
(5)実際の時間外手当てでは(A)と(C)は同じ扱いだと思うが、計算と考える容易さのため、一旦別に分けている。あとで足すことになる。
(6)(B)の時間帯の場合、昼の1時間休憩時間を差し引くべきだが、これも計算の容易さのため、一旦は含めて計算している。後に別途I列を差し引く。
(7)時刻は8:30のように、:を使って入力する。(標準の時刻の入力方法)
(8)A,B,C,D列の時間計算は、セルにIF関数等で式を入れると、非常に複雑で長い式になりすぎるので、別途関数を作った。(私の工夫)
(9)その関数名は、AはRG1、BはRG2、CはRG3、DはRG4で、引数は2つで、C列とD列の値である。例=RG1(C2,D2)など。
(10)(3)の就業時間の変換(C列)は
   =IF(A2-5/24>0,A2-5/24,A2+19/24)
   (3)の終業時間の変換(D列)は
   =IF(B2-5/24>0,B2-5/24,B2+19/24)
で、ご覧のように勿論形は同じである。
(11)(9)のRG1~RG4と言う関数の内容は下記の通り。VBEの標準モジュールにコピーし貼りつけること。
Function RG1(s, e)
Select Case s
Case Is < 3.5 / 24
If e < 3.5 / 24 Then
RG1 = e - s
Else
RG1 = 3.5 / 24 - s
End If
Case Else
RG1 = 0
End Select
End Function
'----------------
Function RG2(s, e)
Select Case s
Case Is < 3.5 / 24
If e < 3.5 / 24 Then
RG2 = 0
ElseIf e < 12.5 / 24 Then
RG2 = e - 3.5 / 24
Else
RG2 = 12.5 / 24 - 3.5 / 24
End If
Case Is < 12.5 / 24
If e < 12.5 / 24 Then
RG2 = e - s
Else
RG2 = 12.5 / 24 - s
End If
Case Else
RG2 = 0
End Select
End Function
'---------------
Function RG3(s, e)
Select Case s
Case Is < 12.5 / 24
If e < 12.5 / 24 Then
RG3 = 0
ElseIf e < 17# / 24 Then
RG3 = e - 12.5 / 24
Else
RG3 = 17# / 24 - 12.5 / 24
End If
Case Is < 17# / 24
If e < 17# / 24 Then
RG3 = e - s
Else
RG3 = 17# / 24 - s
End If
Case Else
RG3 = 0
End Select
End Function
'--------------
Function RG4(s, e)
Select Case s
Case Is < 17# / 24
If e < 17# / 24 Then
RG4 = 0
Else
RG4 = e - 17# / 24
End If
Case Else
RG4 = e - s
End Select
End Function
(注)12.5の0.5は30分を表す。変換前の12.5+5=17.
5(すなわち夕5時)を表す。
24で全て割っているのは、エクセルが時刻は1日=24時間を1とする数値として
表して・扱っているからです。
(12)E,F,G,Hの第2行の関数式は下記の通り。第3行目以下は複写して下さい。
E2は=RG1(C2,D2)
F2は=RG2(C2,D2)
G2は=RG3(C2,D2)
H2は=RG4(C2,D2)
I列は=KYU(C2,D2)
(13)昼休憩時間を計算する関数式は(I列)
Function kyu(s, e)
Select Case s
Case Is < 7# / 24
If e < 7# / 24 Then
kyu = 0
ElseIf e > 8 / 24 Then
kyu = 1 / 24
Else
kyu = e - 7 / 24
End If
Case Else
kyu = 0
End Select
End Function
(14)あとはE+Gを出し、Bから昼休憩Iを引き、E+G、Hには自社の時間外料率を掛けて、Bには時給者には時給額をかけて計算してください。
ここでは省略します。ここでいう表は計算表・ワークシート(裏方表)なので別シートにした方が良いかもしれない。
(15)データサンプル(A列からI列。OKWEBで強制改行される
と思いますので、修正して見て下さい。)
実際就業実際終了換算就業換算終業早朝就業通常就業時間外就業深夜就業昼休憩
7:3018:302:3013:301:009:001:000:001:00
1:303:3020:3022:300:000:000:002:000:00
3:304:0022:3023:000:000:000:000:300:00
4:004:3023:0023:300:000:000:000:300:00
5:005:000:000:000:000:000:000:000:00
6:308:301:303:302:000:000:000:000:00
9:3018:304:3013:300:008:001:000:001:00
10:3017:305:3012:300:007:000:000:001:00
23:3024:0018:3019:000:000:000:000:300:00
7:008:202:003:201:200:000:000:000:00
8:008:203:003:200:200:000:000:000:00
(16)表のセルの書式は「時刻」を選ぶこと。すると上
表のように3:00のように、表示されます。
(17)テストデータはエクセルで、始業時間・就業時間を共に10分おきに作り、結果を入念にチェックされることをお勧めします。24*6*24*6=20736行で
不可能ではないでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!