[[20180601105633]] 『時間の早延判定』(ます) ページの最後に飛ぶ

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

 

『時間の早延判定』(ます)

お世話になっております。今回、掲題の件についてご教授をお願いしたく。

ある配送業務の店着時間について、早延を判定するマクロを作成しています。
ルールは以下の通りです。

・時刻は24時間表記
・既定の基準時間と実際の店着時間を比較する
・±1時間の範囲は判定結果を出さない

例 基準時間が3:00の場合

到着時間2:00→判定は"早"で結果は非表示
到着時間5:00→判定は"遅"で結果を表示
到着時間23:00→判定は"早"で結果を表示

3つめは日付を跨いでいるかの判定が必要なので、基準時間と近い方をとって計算。
(上記の例で基準時間が20:00などであれば、日付は跨いでいないという判定になる)

以前は前作成者の方が数式で計算していて、あまりにも長くファイルが重くなったため、今回はそれを何とかマクロに落とし込んでみたのですが…合ってたり合ってなかったりと非常に不安定になってしまいます。

参考のため、作成したマクロと元々の数式を貼ります。
(変数やセルの名前は分かりやすいように変えてあります)

マクロ

If 到着時間 - 基準時間 - TimeValue("12:00") > 0 Then

   protTime = Abs(到着時間 - 基準時間 - TimeValue("23:59"))
Else
   If 到着時間 - 基準時間 + TimeValue("12:00") < 0 Then
      protTime = Abs(allData(i, p) - allData(i, 1) + TimeValue("23:59"))
   Else
      protTime = Abs(到着時間 - 基準時間)
   End If
End If
If 到着時間 - 基準時間 > 0 Then
   timeFlg = 0
Else
   timeFlg = 1
End If
If protTime > TimeValue("1:00") And timeFlg = 1 Then
   判定 = 1 '早い
ElseIf protTime > TimeValue("1:00") And timeFlg = 0 Then
   判定 = 2 '遅い
End If

数式(3セル分使用)

セルG2
=IF(到着時間="","",IF(到着時間-基準時間-TIMEVALUE("12:00")>0,ABS(到着時間-基準時間-TIMEVALUE("23:59")),IF(到着時間-基準時間+TIMEVALUE("12:00")<0,ABS(到着時間-基準時間+TIMEVALUE("23:59")),ABS(到着時間-基準時間))))

セルF2
=IF(到着時間="","",IF(IF(到着時間-基準時間-TIMEVALUE("12:00")>0,(到着時間-基準時間-TIMEVALUE("23:59")),IF(到着時間-基準時間+TIMEVALUE("12:00")<0,(到着時間-基準時間+TIMEVALUE("23:59")),(到着時間-基準時間)))>0,"","-"))

判定セル
=IF(G2="","",IF(G2<TIMEVALUE("1:00"),"",IF(F2="-","早","遅")))

マクロについて、修正点などがありましたらご意見を頂きたいです。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Sub test()
    Const cdtm基準時刻 As Double = 0.125    '3:00
    Dim dtm到着時刻 As Double
    Dim d As Double
    Dim vProm As Variant

    dtm到着時刻 = Range("A1").Value2
    d = dtm到着時刻 - cdtm基準時刻
    If d > 0.5 Then d = d - 1
    Select Case True
        Case Abs(d) <= 0.041667: vProm = Empty
        Case d > 0: vProm = "遅"
        Case d < 0: vProm = "早"
    End Select
    Range("B1").Value = vProm
End Sub

時間は1日(=24時間)が、数値の1だから、
12時間は0.5になります。
なのでとりあえず差を出してその差が0.5より大きくなるなら、それから1(1日分)をさらに引けば
良いと思います。
あとは、1時間以内なのか判断して、その条件に漏れたら、
正負を見ればよいかと思いました。

(まっつわん) 2018/06/01(金) 13:53


まっつわんさん

ご丁寧な説明をして頂いて、ありがとうございます。
難しく考えていたようで、最初よりずっと綺麗なコードで結果が出るようになりました!
ありがとうございます!

ただ、一つだけ問題が…

基準時刻を22:00、到着時間を1:00とした時、判定では"遅"になるはずが、"早"となってしまいます。

基準時刻の日付 > 到着時間の日付では正しく判定されます。
逆のパターンをマクロ側で認識させ、判定する場合の条件式がピンと来ず…
もしお分かりになりましたら、教えて頂けますでしょうか。
(ます) 2018/06/01(金) 15:04


Sub test()
    Const cdtm基準時刻 As Double = 0.125  
    Dim dtm到着時刻 As Double
    Dim d As Double
    Dim vProm As Variant
    dtm到着時刻 = Range("A1").Value2
    d = dtm到着時刻 - cdtm基準時刻

    If d > 0.5 Then
        d = d - 1
    ElseIf d < -0.5 Then
        d = d + 1
    End With

    Select Case True
        Case Abs(d) <= 0.041667: vProm = Empty
        Case d > 0: vProm = "遅"
        Case d < 0: vProm = "早"
    End Select
    Range("B1").Value = vProm
End Sub

逆のパターンもありますしたか^^;
差が-0.5より下なら+1ですかね。
シート上で色々入力してセルの書式設定を時間にしたり標準にしたりして、
眺めてたらわかりそうな気がしますが。。。。
なんかもう少しスマートに計算できそうな気がしてますが、
考えがまとまらないので、この辺で逃げておきます。

(まっつわん) 2018/06/01(金) 15:14


まっつわんさん

迅速に返信を頂き、ありがとうございます。

四苦八苦の中、VBAでの時間の扱い方について良い参考サイトを見つけたので、
それで少し勉強して自分なりに手直し出来るようにしていきたいと思います。

親切に対応頂き、ありがとうございました!

(ます) 2018/06/01(金) 16:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.