|
sこー さん こんにちは、ちんといいます。
タイムチャートで考えてみましょう。
C列を時間の確認ように使用しますので、属性:文字列にします。
考え方は、
午前0時〜24時までの横線(一本線)を引いて下さい。
0時10分から、10分刻みで縦線を23時50分まで引きましょう。
-----1-----2-----3-----4 ・・・ と、いうように。
例として、開始時間1:00〜終了時間2時30までの実績時間を求めるとしたら、
-----*********---3-----4 ・・・
というふうに、10分刻みで"*"マークに置き換えます。(*はダブリ防止用)
というふうに、ロジックを考えると、以下のようになります。
Sub ボタン1_Click()
Dim C_bar As String
Dim i1 As Long, i2 As Integer
Dim Fun_bar As Integer
Dim Fun As Integer '<-- 10分単位の個数
For i1 = 1 To 23
C_bar = C_bar + "-----" + Right$(Format(i1, "00"), 1)
Next i1
For i1 = 1 To 4
a = DateDiff("n", Cells(i1, 1).Value, Cells(i1, 2).Value)
GoSub Time_chart
Next i1
MsgBox (Fun * 10) & "分作業しました。"
Cells(10, 10).Value = C_bar
Exit Sub
Time_chart:
Fun_bar = a / 10 '<-- 10分単位で 1とする。(20分なら2となる)
b = DateDiff("n", "0:00", Cells(i1, 1).Value) '<-- "*"を書き込む位置の計算
For i2 = (b / 10) To (b / 10) + (Fun_bar - 1)
If Mid(C_bar, i2, 1) <> "*" Then '<-- ダブリのチェック
Fun = Fun + 1 '<-- 10分単位の個数を数える
Mid(C_bar, i2, 1) = "*"
End If
Next i2
Cells(i1, 3).Value = C_bar
Return
End Sub
以上参考までに、
▼sこー さん:
>皆様こんばんは。いつもいつもありがとうございます。
>
>この度、会社で外にでている時間帯を計算する事になったのですが、
>2人以上いると重なってしまう時間帯がでてきまして、
>その処理をどうすればよいのかわからず悩んでいます。
>
>
> A B
>1 9:30 10:30 ・・・・・・・(60分)
>2 11:40 12:30 ・・・・・・・(50分)
>3 12:00 12:40 ・・・・・・・(40分)
>4 13:00 13:50 ・・・・・・・(50分)
>
>
>Bの時間からAの時間を引き、最後に合計する為に
>
>a = DateDiff("n", Range("a1"), Range("b1"))
>
>で引き算し、forで1〜4行を計算し、合計を出したいのですが、
>そのまま計算してしまうと全ての合計時間の200分と表示されます。
>実際には2行目と3行目は時間帯が重なっており、11:40〜12:40なので60分、
>実際の合計時間は170分になりますよね。
>重なりを除去して合計できるような事は可能でしょうか?
>
>さらにここに
>
>5 9:00 14:00 ・・・・・・・(300分)
>
>と追加されれば、1〜4行をすべてカウントせず5行目だけの合計を出さなければならず、不勉強の私には考えつかない為、セルに色々計算式をいれて間違いだらけになりながらも、どうにか現状をしのいでおります。
>
>皆様、どうか良い方法があれば、ご教授ください。
>どうぞ、よろしくお願い致します.
|
|