| 
    
     |  | おはようございます 
 ▼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
 
 アドバイスらしくなくて申し訳ないです
 
 
 |  |