[[20100521112753]] 『重なっている時刻の見つけ方』(ぺす) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『重なっている時刻の見つけ方』(ぺす)
初心者ですみません。教えてください。
バイトさんの勤務表で、通常なら下記のシフトになります。

    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.