[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『日付の比較』(三太郎)
EXCELのVBAにて集計を行っています。
例えば本日の日付(2020/5/18)を対象に
以下の時間帯で集計を行う場合、
10:00〜10:30 〇〇件
10:30〜11:00 〇〇件
対象が0件になってしまいます。
対象のデータは"yyyy/m/d h:mm"でデータが格納されています。
10:00を日付にすると1900/1/0になるのが原因なのでしょか?
時間帯を対象の日付毎に合わせてから集計を行うのが大変なので、
時刻のみで集計を行いたいのですが可能でしょうか?
< 使用 Excel:Excel2013、使用 OS:Windows7 >
シリアル値 日付 でネット検索してみてください。 (OK) 2020/05/18(月) 11:11
>時間帯を対象の日付毎に合わせてから
意味不明です。 (OK) 2020/05/18(月) 11:13
>時間帯を対象の日付毎に合わせてから →10:00を2020/5/18 10:00とやらないと正しい処理件数になりません。 (三太郎) 2020/05/18(月) 11:22
再掲です。
>シリアル値 日付 >でネット検索してみてください。
(OK) 2020/05/18(月) 11:35
10:00:00 シリアル値→0.416666667
2020/5/18 10:00:00 シリアル値→43969.41667 (OK) 2020/05/18(月) 11:57
どういう集計方法で集計したのか説明がないと こちらは何が問題なのか分からないです。
読み返したら、手掛かりはありましたね。 ↓ >EXCELのVBAにて集計を行っています。
なら、そのコードをアップしてください。
(半平太) 2020/05/18(月) 12:20
Sub 集計()
Dim LastRow As Long '時間帯の最終行 Dim Endrow As Long '対象のデータの最終行 Dim r As Range Dim c As Range Dim ws1 As Worksheet Dim ws2 As Worksheet
Set ws1 = Worksheets("Sheet1") '集計を行うシート Set ws2 = Worksheets("Sheet2") '対象のデータがあるシート Worksheets("Sheet1").Select
LastRow = ws1.Range("B" & Rows.Count).End(xlUp).Row Endrow = ws2.Range("B" & Rows.Count).End(xlUp).Row
For Each c In ws1.Range("B5:B" & LastRow) For Each r In ws2.Range("B2:B" & Endrow) If r.Value >= c.Value And r.Value < c.Offset(0, 1).Value Then c.Offset(0, 2).Value = c.Offset(0, 2).Value + 1 End If Next Next
End Sub
(三太郎) 2020/05/18(月) 12:45
↓
B列 C列 B列 C列
10:00 10:30 → 2020/5/18 10:00 2020/5/18 10:30
10:30 11:00 → 2020/5/18 10:30 2020/5/18 11:00
(三太郎) 2020/05/18(月) 12:47
まず注意すべきことは、時刻データには2進数誤差が含まれていることです。
このため「日付+時刻」と「単なる時刻」を比べる場合、 そもそも日付部分(=整数部分)が余分である上に、さればと 「日付+時刻」から日付を取って時刻部分(小数部分)同士で比較できるかと言うと、 そうでもないのです。
何故なら、日付部分でデータ精度が食いつぶされているので、 残った小数部分の精度は、純然たる時刻の精度より劣るのです。
なので、比較は同じ精度にしてから実施するのが安全です。
以下は一案です。
> If r.Value >= c.Value And r.Value < c.Offset(0, 1).Value Then ↓ If Format(r.Value, "h:nn") * 1 >= Format(c.Value, "h:nn") * 1 And _ Format(r.Value, "h:nn") * 1 < Format(c.Offset(0, 1).Value, "h:nn") * 1 Then
(半平太) 2020/05/18(月) 13:19
(三太郎) 2020/05/18(月) 14:05
参考HPです。
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html
(OK) 2020/05/18(月) 14:16
Function 後者が大(arg1, arg2)
If Format(arg1, "yyyy/m/d") < Format(arg2, "yyyy/m/d") Then 後者が大 = True: Exit Function If Format(arg1, "yyyy/m/d") > Format(arg2, "yyyy/m/d") Then 後者が大 = False: Exit Function If Format(arg1, "h:n") < Format(arg2, "h:n") Then 後者が大 = True: Exit Function If Format(arg1, "h:n") > Format(arg2, "h:n") Then 後者が大 = False: Exit Function End Function
(mm) 2020/05/18(月) 15:46
↓ If (後者が大(c.Value, r.Value) = True Or 後者が大(c.Value, r.Value) = "") And 後者が大(r.Value, c.Offset(0, 1).Value) Then
実行してみましたが、0件でした。
(三太郎) 2020/05/18(月) 17:17
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.