|
おはようございます
▼sin さん:
>横から失礼します。
>
>▼ハト さん:
>お手本のようなスマートなやり方に感心しました。
>勉強になります。
ありがとうございます。
でも自分もまだまだ勉強中です(^^;
>ところで、
>> ElseIf j = OnDate And k = OnTime Then
>> TM = Minute(ws.Cells(i, 4))
>は
> Tm = 60 - Minute(ws.Cells(i, 4))
>にしないと開始利用時間が合わないのでは?
申し訳ありません、おっしゃる通り自分のミスです。
TM = 60 - Minute(ws.Cells(i, 4))
です
お恥ずかしい(^^;
>'行ごとに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))
このやり方ですとMDateの算出に問題があります
ON OFF
2006/05/28 21:00 2006/05/28 23:30
2006/05/28 22:00 2006/05/29 01:00
2006/05/28 22:30 2006/05/28 23:00
のようなデータの場合、ONの日時はソートされても
OFFの日時はソートされていないのでにMDateの値が正しく設定されません
あと、ソートは
日時をエクセル上に作業列として書き出し、
エクセルのソート機能(Range.Sort)を使った後、配列に入れる方法もあります
>'日付/時間帯ごとに集計
うーん、アドバイスって程の物じゃないですが
DateAdd("h", j, TDate)
DateAdd("h", j + 1, TDate)
の2つが何度も出てきますんで
> For j = 0 To 23
> Tm = 0
DateA = DateAdd("h", j, TDate)
DateB = DateAdd("h", j + 1, TDate)
と変数に代入し、↓のような部分を
> Do Until BDate(k, 1) >= DateAdd("h", j + 1, TDate)
> If BDate(k, 2) > DateAdd("h", j, TDate) Then
↓の様にした方がすっきりするかな?
Do Until BDate(k, 1) >= DateB
If BDate(k, 2) > DateA Then
あと↓は
> k = m
>
> Do Until BDate(m, 2) >= DateAdd("h", j + 1, TDate) Or m = ed
> k = m + 1
> m = m + 1
> Loop
↓の様にしましょう
Do Until BDate(m, 2) >= DateAdd("h", j + 1, TDate) Or m = ed
m = m + 1
Loop
k = m
アドバイスらしくなくて申し訳ないです
|
|