检查,如果时间范围落在之间不工作
问题描述:
我需要检查,如果时间落在下午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
我尝试了很多东西,但由于某种原因我无法正确理解它。 任何人都可以告诉我我在做什么错在这里?
答
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
答
你的方法在概念上是错误的。在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.
答
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
如果您还在意哪些日期的值,你显然不需要做减法。
但这似乎是一点点努力说实话。 Tim的答案有什么问题吗? – Rohan
@Rohan呃,我不喜欢用日期作为字符串来处理,这是'timevalue'的作用。如果您将它们作为实际日期值处理,您将很少机会格式化导致问题。此外,他的方法只显示了一堆代码,这违背了stackoverflow的原则 - 公平地说,问题并没有那么复杂,但我仍然觉得至少有一个简单的解释,你为什么要做你的答案一切顺利。 – eirikdaude
@Rohan在这个答案中显示的函数也可以插入到你想要使用的任何宏中,并且对它的功能很自我描述 - 在Tim的答案中阅读代码并不那么容易。我也有一些关于他没有声明他的变量和类似的类型的小小挑剔,但是这些更多的是关于良好的编码标准:P – eirikdaude