|
▼ハト さん:
ありがとうございます。
>このやり方ですと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】の時もお世話になりました)
※「投稿種別」はスレ主ではないので、あえて「お礼」ではなく
「発言」にしておきました。
気持ちは「お礼」なのですが・・・
|
|