[[20200518105423]] 『日付の比較』(三太郎) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『日付の比較』(三太郎)

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

訂正:
対象が0件になってしまいます。

処理件数が0件になってしまいます。

 >時間帯を対象の日付毎に合わせてから
→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

時間帯と対象のデータをシリアル値に変換してから比較するという事でしょうか?
(三太郎) 2020/05/18(月) 12:11

 どういう集計方法で集計したのか説明がないと
 こちらは何が問題なのか分からないです。

 読み返したら、手掛かりはありましたね。
         ↓
 >EXCELのVBAにて集計を行っています。 

 なら、そのコードをアップしてください。

(半平太) 2020/05/18(月) 12:20


現在のコードです。
この処理を行う前に時間帯に対象のデータの日付を付けています。
(Sheet1)
時間帯
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 11:00 2020/5/18 11:30

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 11:00 2020/5/18 11:30


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


頂いたコードを追加してみましたがエラーが出てしまい、出来ませんでした。
エラー:
「実行時エラー 13 型が一致しません」

(三太郎) 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


If (後者が大(c.Value, r.Value) = True Or 後者が大(c.Value, r.Value) = "") And 後者が大(r.Value, c.Offset(0, 1).Value) Then

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 r.Value >= c.Value And r.Value < c.Offset(0, 1).Value Then
   ↓
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.