| 
    
     |  | ▼ハト さん: ありがとうございます。
 
 
 >このやり方ですと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の値が正しく設定されません
 
 
 ご指摘通りイタい間違いでした。
 ↓の様にしてみました。
 
 
 '時系列に並べ替え
 Dim EDate As Date
 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
 
 If EDate < BDate(j, 2) Then
 EDate = BDate(j, 2)
 End If
 Next j
 Next i
 
 MDate = DateDiff("d", BDate(2, 1), EDate)
 
 さらに冗長になってしまった・・・
 
 
 >あと、ソートは
 >日時をエクセル上に作業列として書き出し、
 >エクセルのソート機能(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
 
 言われてみると確かにマヌケな事してました。^^;
 
 
 >アドバイスらしくなくて申し訳ないです
 
 いえいえ、勉強になりました、ありがとうございました。
 これからも宜しくお願いします。
 (記事番号【37734】の時もお世話になりました)
 
 
 ※「投稿種別」はスレ主ではないので、あえて「お礼」ではなく
 「発言」にしておきました。
 気持ちは「お礼」なのですが・・・
 
 
 
 |  |