|
横から失礼します。
▼ハト さん:
お手本のようなスマートなやり方に感心しました。
勉強になります。
ところで、
> ElseIf j = OnDate And k = OnTime Then
> TM = Minute(ws.Cells(i, 4))
は
Tm = 60 - Minute(ws.Cells(i, 4))
にしないと開始利用時間が合わないのでは?
A列の番号1は22:30なのでたまたま合うのですが
A列の番号2の13:00〜は13:00台の利用時間が0分に
A列の番号4の15:50〜は15:00台の利用時間が50分に
になってしまいます。
私はこれまで日時系の関数をほとんど使ったことがなかったので、
今回勉強のためにハト さんのコードを元にやり方を変えて
試してみました。
時系列に並べ替えて結果を表示しようというものです。
しかし、かなり不細工なコードになってしまいました。;;
特に
'日付/時間帯ごとに集計
から下の部分をもう少しスマートに出来そうな気がするのですが・・・
もしアドバイスなど頂けると幸いです。
(結局、ループが多すぎて実用には向きませんが・・・)
Sub Test2()
Dim BDate() As Date
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim ws As Worksheet
Dim SDate As Date
Dim ed As Integer
Dim TDate As Date
Dim MDate As Integer
Dim Tm As Long
Const RCNT As Integer = 3 '総部屋数、ここでは仮に3としている
Set ws = ThisWorkbook.ActiveSheet
ed = ws.Range("C65535").End(xlUp).Row
ReDim BDate(2 To ed, 2)
'行ごとにON日付/時刻、OFF日付/時刻を日付型配列に格納
For i = 2 To ed
BDate(i, 1) = CDate(CDate(Cells(i, 3)) & " " & CDate(Cells(i, 4)))
BDate(i, 2) = CDate(CDate(Cells(i, 5)) & " " & CDate(Cells(i, 6)))
Next i
'時系列に並べ替え
For i = 2 To ed
For j = i + 1 To ed
If BDate(i, 1) > BDate(j, 1) Then
TDate = BDate(i, 1)
BDate(i, 1) = BDate(j, 1)
BDate(j, 1) = TDate
TDate = BDate(i, 2)
BDate(i, 2) = BDate(j, 2)
BDate(j, 2) = TDate
End If
Next j
Next i
MDate = DateDiff("d", BDate(2, 1), BDate(ed, 2))
SDate = Format(BDate(2, 1), "yyyy/mm/dd")
Worksheets.Add after:=ws
Set ws = Nothing
Set ws = ThisWorkbook.ActiveSheet
For i = 0 To 23
ws.Cells(1, i + 2) = i & ":00"
Next i
k = 2
m = 2
'日付/時間帯ごとに集計
For i = 0 To MDate
ws.Cells(i + 2, 1) = DateAdd("d", i, SDate)
TDate = DateAdd("d", i, SDate)
For j = 0 To 23
Tm = 0
Do Until BDate(k, 1) >= DateAdd("h", j + 1, TDate)
If BDate(k, 2) > DateAdd("h", j, TDate) Then
If BDate(k, 1) > DateAdd("h", j, TDate) And BDate(k, 2) < DateAdd("h", j + 1, TDate) Then
Tm = Tm + Minute(BDate(k, 2)) - Minute(BDate(k, 1))
ElseIf BDate(k, 1) > DateAdd("h", j, TDate) And BDate(k, 2) >= DateAdd("h", j + 1, TDate) Then
Tm = Tm + 60 - Minute(BDate(k, 1))
ElseIf BDate(k, 1) <= DateAdd("h", j, TDate) And BDate(k, 2) < DateAdd("h", j + 1, TDate) Then
Tm = Tm + Minute(BDate(k, 2))
ElseIf BDate(k, 1) <= DateAdd("h", j, TDate) And BDate(k, 2) >= DateAdd("h", j + 1, TDate) Then
Tm = Tm + 60
End If
End If
k = k + 1
If k > ed Then Exit Do
Loop
k = m
Do Until BDate(m, 2) >= DateAdd("h", j + 1, TDate) Or m = ed
k = m + 1
m = m + 1
Loop
ws.Cells(i + 2, j + 2) = Application.Round(Tm / (60 * RCNT) * 100, 0) & " %"
Next j
Next i
Columns("b:y").ColumnWidth = 5.25
Set ws = Nothing
End Sub
|
|