[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『重なっている時刻の見つけ方』(ぺす)
Aさん 出勤 退勤 Bさん 出勤 退勤
21日 9:00 15:00 21日 15:00 21:00
22日 15:00 21:00 22日 9:00 15:00
これが繁忙期には重なる時間が発生します。
Aさん 出勤 退勤 Bさん 出勤 退勤
21日 9:00 16:00 21日 14:00 21:00
22日 15:00 21:00 22日 9:00 15:00
これが発生した日(上記なら21日)をチェックしたいのですが、
関数などを使って出来るでしょうか?
データは、二人分だけですか?
(半平太) 2010/05/21 13:01
いえ、3〜6人です。
情報不足ですみません。
(ぺす)
バイトさんの登録人数が3〜6人であって、一日はたいてい2人です。
たまに3人で回す日もありますが、めったにありません。
(ぺす)
こんにちは。 > バイトさんの登録人数が3〜6人であって、一日はたいてい2人です。 6人の組合せだと15通りもあるので、ちょっとなえましたが、3人ぐらいまでなら個別に判定できますね。
・J〜L列でそれぞれ2人ずつの重複判定をしています。 ・各人の勤務時間の和よりも、最初の出勤〜最後の退勤時間が少なければ、途中で重なっていると判定。 ・出勤退勤は、24時間を超えない前提です。
※「_」セルは未入力または"" [R/C] [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [1] Aさん 出勤 退勤 Bさん 出勤 退勤 Cさん 出勤 退勤 AB BC CA [2] 21日 9:00 15:00 21日 15:00 21:00 _ _ _ _ _ _ [3] 22日 15:00 21:00 22日 9:00 15:00 _ _ _ _ _ _ [4] 21日 9:00 16:00 21日 14:00 21:00 _ _ _ 重 _ _ [5] 22日 15:00 21:00 22日 9:00 15:00 _ _ _ _ _ _ [6] 21日 9:00 15:00 21日 15:00 21:00 21日 16:00 20:00 _ 重 _ [7] 22日 15:00 21:00 22日 9:00 15:00 22日 16:00 20:00 _ _ 重 [8] 21日 9:00 16:00 21日 14:00 21:00 21日 10:00 20:00 重 重 重 [9] 22日 15:00 21:00 22日 9:00 15:00 22日 7:00 8:00 _ _ _
J2 =IF($C2-$B2+$F2-$E2>MAX($B2:$F2)-MIN($B2:$F2),"重","") →J2:J9フィルコピー K2 =IF($F2-$E2+$I2-$H2>MAX($E2:$I2)-MIN($E2:$I2),"重","") →K2:K9フィルコピー L2 =IF($I2-$H2+$C2-$B2>MAX($H2:$I2,$B2:$C2)-MIN($H2:$I2,$B2:$C2),"重","") →L2:L9フィルコピー (コタ)
登録人数が多いので少しアレンジを考えてみます。
わからなければ、また質問させて頂きます。
ありがとうございました。
(ぺす)
上の表をお借りして、
J2:=IF(OR(B2>=F2,E2>=C2),"","重")
K2:=IF(OR(E2>=I2,H2>=F2),"","重")
L2:=IF(OR(B2>=I2,H2>=C2),"","重")
(NB)
ちょっと変わった方法でUDF作ってみました。 (時間をRangeオブジェクトに見立ててIntersectで重複判定)
標準モジュールに
Function pes(ParamArray myTime() As Variant) As String
Dim myRng As Range, r As Variant
Dim s As Long, e As Long
For Each r In myTime
If r.Cells(1).Value <> "" And r.Cells(2).Value <> "" Then
s = DateDiff("n", TimeValue("0:00"), CDate(r.Cells(1).Value)) + 1
e = DateDiff("n", TimeValue("0:00"), CDate(r.Cells(2).Value)) + 1
If myRng Is Nothing Then
Set myRng = Range("A" & s & ":A" & e)
Else
If Application.Intersect(myRng, Range("A" & s & ":A" & e)) Is Nothing Then
Set myRng = Application.Union(myRng, Range("A" & s & ":A" & e))
ElseIf Application.Intersect(myRng, Range("A" & s & ":A" & e)).Cells.Count <= 1 Then
Set myRng = Application.Union(myRng, Range("A" & s & ":A" & e))
Else
pes = "重複"
Exit Function
End If
End If
End If
Next r
pes = ""
End Function
で、セルに =pes(B2:C2,E2:F2,H2:I2) のように入れてみてください。 人数が増えるのでしたら、「,」で区切って時間の範囲を増やせば30人まで行けるかな? 範囲は必ず出勤:退勤の範囲を1つとして入れてください。 (momo)
ほとんど同じですが、
J2:=IF((B2-F2)*(C2-E2)>=0,"","重")
K2:=IF((E2-I2)*(F2-H2)>=0,"","重")
L2:=IF((B2-I2)*(C2-H2)>=0,"","重")
(NB)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.