比较从Now()函数获取的日期和时间值

时间:2016-02-01 22:42:17

标签: excel vba excel-vba

我有一张桌子,用户可以记录他们对实验室仪器的使用。对于记录当前使用的最基本功能,我有一个错误检查,通过一个参考仪器使用的开始和结束时间的列。

基本上,我想将仪器使用的当前时间和结束时间与先前提交的预约/当前仪器使用进行比较。如果代码检测到当前用户输入会干扰预订,则会将 "strCheckTime" 的字符串值从 "ok" 更改为 "error" 即可。

然后在后面的If Then语句中注册并向用户提示一个消息框。

下面列出了代码。

到目前为止,我还没有开始工作。无论Now()返回以及当前存在什么预留,它都将通过If Then语句运行,并从 "strCheckTime" <更改 "ok" 的字符串值/ strong>至 "error"

欢迎任何帮助!

'Defines and sets variables for current use/reservation check
Dim shtInstrument As Worksheet
Set shtInstrument = Worksheets(strShtName)
shtInstrument.Activate
Dim intCountEntries As Integer
intCountEntries = shtInstrument.Cells(shtInstrument.Rows.Count, "B").End(xlUp).Row
Dim CurrentTime As Date
Dim StartDate As Date
Dim StartTime As Date
Dim EndDate As Date
Dim EndTime As Date
Dim rngStart As Range
Dim rngEnd As Range
Dim strCheckTime As String
strCheckTime = "Ok"

'Checks if desired instrument use falls in time frame of current use or reservation

For Each rngStart In shtInstrument.Range("H9:H" & intCountEntries)
StartDate = DateValue(rngStart.Value)
StartTime = TimeValue(rngStart.Value)
EndDate = DateValue(rngStart.Offset(0, 1).Value)
EndTime = TimeValue(rngStart.Offset(0, 1).Value)
If StartDate <= Date <= EndDate Then
    If StartTime <= Now() <= EndTime Then
        strCheckTime = "Error"
    ElseIf StartTime <= CurrentTime + TimeSerial(0, txtSample.Text * txtTime.Text, 0) <= EndTime Then
        strCheckTime = "Error"
    Else
        strCheckTime = "Ok"
    End If
Else
    'Do nothing
End If
Next rngStart

1 个答案:

答案 0 :(得分:0)

问题出在这一行:

 If StartTime <= Now() <= EndTime Then

函数“Now()”返回整个日期,包括时间。该值本质上总是大于仅表示时间的StartTime变量。

第二个问题(你在评论中发现并提到)是你不能使用这样的相等运算符。

声明:

  If x <= y <= z 

将按此评估:

  If (x <= y) <= z

所以这将被评估为:

  If (TRUE/FALSE) <= z Then

但是TRUE = -1且FALSE = 0,所以只要z大于z(在你的情况下总是如此),你的函数将返回true。您需要拆分语句(再次,根据您的评论)。

你需要使用:

If StartTime <= Time() AND Time() <= EndTime Then

 If StartTime <= TimeValue(Now()) AND TimeValue(Now()) <= EndTime Then

更好的是,您不需要单独使用日期和时间:

StartTime = [cell where date and time are located]
EndTime = [cell where date and time are located]

If StartTime <= Now()  AND Now() <= EndTime Then 'both time variables are defined by both the date and time

请注意,要找出这样的问题,最好使用以下行:

 debug.print StartTime
 debug.print Now()
 debug.print EndTime
 debug.print (StartTime <= Now() <= EndTime)

确定问题所在。

另外一个注释是,如果您使用诸如整个代码中的时间之类的东西,则在代码运行时评估时间函数。因此,如果你有一个需要大量时间的程序,并且在开始时检查时间与某些东西,然后在最后使用时间/日期函数来获取记录某个地方的时间,这些值将是不同的。防止这种情况的最好方法是在代码的开头创建一个变量(或者在你想要检查时间的地方创建一个变量:

  currTime = Now()

然后在整个代码中使用此变量。在这种特殊情况下,差异将极其微不足或不存在,因为检查在同一行代码中,但在其他情况下可能是一个问题。

编辑***包括无法使用此类等同的其他问题。