检查时间是否介于不工作的范围之间

时间:2017-10-20 06:04:24

标签: vba excel-vba datetime excel

我需要检查时间是否在下午3:31:00到6:29:00之间

这是我在调试时在立即窗口中返回的内容。

?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 

我尝试了很多东西,但由于某些原因我无法做到。 谁能告诉我我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

你的方法在概念上是错误的。在Excel(VBA)中,一天是整数。 Debug.Print CLng(Date)将为您提供今天的整数。明天将是今天+ 1.今天开始于00:00,将于24:00结束。因此,每小时等于1/24,每分钟1/24/60,每秒1/24/60/60,依此类推。时间是双倍值,可以非常精确。更粗略地说,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的分数返回时间值。

答案 1 :(得分:1)

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

答案 2 :(得分: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

如果您还关心这些值的日期,您显然不需要进行减法。