2017-10-20 72 views
0

我需要檢查,如果時間落在下午3時31分00秒和上午6時29分○○秒檢查,如果時間範圍落在之間不工作

這是在即時窗口什麼時候返回我調試之間。

?TimeValue(TEMP.Cells(i, tAssgnStart)) >= WorksheetFunction.Min(TimeValue("15:31:00"), TimeValue("06:29:00")) 
False 
?TimeValue(TEMP.Cells(i, tAssgnStart)) 
02:00:00 
?WorksheetFunction.Min(TimeValue("15:31:00"), TimeValue("06:29:00")) 
0.270138888888889 
?cdate(WorksheetFunction.Min(TimeValue("15:31:00"), TimeValue("06:29:00"))) 
06:29:00 

?TimeValue(TEMP.Cells(i, tAssgnStart)) <= WorksheetFunction.Max(TimeValue("15:31:00"), TimeValue("06:29:00")) 
True 
?TimeValue(TEMP.Cells(i, tAssgnStart)) 
02:00:00 
?WorksheetFunction.Max(TimeValue("15:31:00"), TimeValue("06:29:00")) 
0.646527777777778 
?cdate(WorksheetFunction.Max(TimeValue("15:31:00"), TimeValue("06:29:00"))) 
15:31:00 

我嘗試了很多東西,但由於某種原因我無法正確理解它。 任何人都可以告訴我我在做什麼錯在這裏?

回答

0
Sub Tester() 

    Dim t, x 
    For x = 1 To 23 
     t = TimeValue(Format(x, "00") & ":00:00") 
     Debug.Print Format(t, "hh:mm:ss"), t > TimeValue("15:31:00") Or _ 
              t < TimeValue("06:29:00") 
    Next x 

End Sub 

輸出:

01:00:00  True 
02:00:00  True 
03:00:00  True 
04:00:00  True 
05:00:00  True 
06:00:00  True 
07:00:00  False 
08:00:00  False 
09:00:00  False 
10:00:00  False 
11:00:00  False 
12:00:00  False 
13:00:00  False 
14:00:00  False 
15:00:00  False 
16:00:00  True 
17:00:00  True 
18:00:00  True 
19:00:00  True 
20:00:00  True 
21:00:00  True 
22:00:00  True 
23:00:00  True 
1

你的方法在概念上是錯誤的。在Excel(VBA)中,有一天是一個整數。 Debug.Print CLng(Date)會給你今天的整數。明天將是今天+1。今天開始於00:00,並將於24:00結束。因此,每小時等於1/24,每分鐘1/24/60,每秒1/24/60/60等等。時間是Double值,可以非常精確。更粗略地說,43028.5是表示2017年10月20日中午12點的日期/時間值。

顯然15:31(0.646527777777778)晚於06:29(0.270138888888889)。如果你想指定明天的06:29,你將不得不添加一天,例如1.270138888888889或43029.270138888888889。要確定時間是否在43028.646527777777778和43029.270138888888889之間不會對您造成問題,還是將它?

Debug.Print CDbl(Now)會爲您提供當前日期和時間的日期/時間值。 Cdbl(TIMEVALUE( 「15:31」))將返回時間值的一小部分1.

0

Variatus給出的時間和日期值是如何很好的概述存儲在Excel中。爲了僅比較一些任意值的時間值,我會做類似於下面的操作,其中減去您使用的值的整數部分將確保只比較變量的時間部分。

Function isBetweenTimes(fromTime As Date, toTime As Date, timeToCheck As Date) As Boolean 
    Dim f As Double, t As Double, c As Double 

    f = CDbl(fromTime): f = f - Int(f) 
    t = CDbl(toTime): t = t - Int(t) 
    c = CDbl(timeToCheck): c = c - Int(c) 

    isBetweenTimes = CBool(c >= f And c <= t) 
End Function 

Sub testFunction() 
    Dim fromTime As Date, toTime As Date, timeToCheck As Date 

    fromTime = #6:29:00 AM# 
    toTime = #3:31:00 PM# 
    timeToCheck = #2:00:00 PM# 

    Debug.Print isBetweenTimes(fromTime, toTime, timeToCheck) 
End Sub 

如果您還在意哪些日期的值,你顯然不需要做減法。

+0

但這似乎是一點點努力說實話。 Tim的答案有什麼問題嗎? – Rohan

+0

@Rohan呃,我不喜歡用日期作爲字符串來處理,這是'timevalue'的作用。如果您將它們作爲實際日期值處理,您將很少機會格式化導致問題。此外,他的方法只顯示了一堆代碼,這違背了stackoverflow的原則 - 公平地說,問題並沒有那麼複雜,但我仍然覺得至少有一個簡單的解釋,你爲什麼要做你的答案一切順利。 – eirikdaude

+0

@Rohan在這個答案中顯示的函數也可以插入到你想要使用的任何宏中,並且對它的功能很自我描述 - 在Tim的答案中閱讀代碼並不那麼容易。我也有一些關於他沒有聲明他的變量和類似的類型的小小挑剔,但是這些更多的是關於良好的編碼標準:P – eirikdaude