在第一个错误条件下选择案例停止
Posted
技术标签:
【中文标题】在第一个错误条件下选择案例停止【英文标题】:select case stop at the first false condition 【发布时间】:2020-06-06 17:16:31 【问题描述】:问题如下:
TOut = 11:00:00 PM
TCheckIn = 10:00:00 PM
在我的代码中,选择case,在第一个条件处停止,结果是-1:00:00(我用ABS函数计算出来)。
这里是代码:
Public Function TIMECOMPARE(TIn As Date, TOut As Date, TCheckIn As Date, TCheckOut As Date) As Double
Dim Hours As Integer
Select Case TIMECOMPARE
Case Hour(TOut) < Hour(TCheckIn)
Hours = Hour(TCheckIn) - Hour(TOut)
TIMECOMPARE = TimeSerial(Hours, 0, 0)
Case Hour(TIn) > Hour(TCheckOut)
Hours = Hour(TIn) - Hour(TCheckOut)
TIMECOMPARE = TimeSerial(Hours, 0, 0)
Case Hour(TIn) < Hour(TCheckIn) And Hour(TOut) < Hour(TCheckOut)
Hours = Hour(TOut) - Hour(TCheckIn)
TIMECOMPARE = TimeSerial(Hours, 0, 0)
End Select
End Function
有人可以帮助我理解我不理解的东西吗? 应该停止的情况是第三个......
【问题讨论】:
您能否更清楚地说明您的经历以及预期的行为?它是否会在第一个条件评估为“假”时停止,并且您不希望这样,还是相反? 它在第一个条件下停止,我不希望出现这种行为......我以为是因为条件不匹配而前进。 【参考方案1】:要了解这种行为,您必须了解三件事:select case 语句的工作原理、变量初始化的工作原理以及比较中的隐式转换如何工作。
选择案例
Select Case <value>
语句将作为 value 提供的值与按顺序评估每个 Case
条件并使用匹配值执行第一个条件的结果进行比较。
变量初始化
VBA 中的所有变量类型都有一个默认值。对于对象类型,它是Nothing
,对于布尔型,它是False
,对于数字类型,它是0,对于日期,它是任何对应于支持值0的东西。(日期存储为以天为单位的偏移量到一个基准日期,我认为是 1900-01-01,编码为 Double。)
因此,你的函数的返回值就是Double 0对应的日期。
比较和隐式转换
当 VBA 必须比较两个不同类型的值时,它会使用其规范中指定的隐式转换方案。在 Date 和 Boolean 的情况下,它会将两者都转换为 Double 并比较值。
把它放在一起
要与您指定的比较值是TIMECOMPARE
,尚未为其分配任何值。因此,您与对应于双 0 的日期进行比较。您的所有案例条件都是布尔值,因此如果条件评估为 False
,则与 0 进行比较;如果条件评估为 True
,则与 -1
进行比较。因此,将执行条件评估为False
的第一个 Case 块中的代码。
【讨论】:
谢谢你的解释,还是试着去理解一些东西... TIMETOCOMPARE 也许不是最好的函数名,它应该像GetTime。预期的行为应该是评估为假 Hour(TOut) 你这么说是什么意思:因此,你的函数的返回值是Double 0对应的日期。?我有 Tin = 07:00 P.M.兜售=11:00 P.M. TCheckIn= 10:00 P.M, TCheckOut=12:00 A.M(我写为 24:00) 当我写 TIMECOMPARE = TimeSerial(Hours, 0, 0) 我期望函数返回 11:00 和 10 之间的差异:00 当大小写匹配时(值应该是双 1/24)。我有很多问题......。 我也不明白这句话:“你所有的 Case 条件都是布尔值,所以你比较 0,如果条件评估为 False,如果条件评估为 True,则比较 -1。”在我看来,如果条件为假,则为-1,然后大小写不匹配.... 您似乎从根本上误解了 Select-Case 语句的工作原理。请看一下它的documentation。 请注意,在函数TIMECOMPARE
内部,不带参数的标识符TIMECOMPARE
指的是保存函数退出时返回值的变量。在您使用它的第一点,它没有被分配任何值,因此它具有默认值。以上是关于在第一个错误条件下选择案例停止的主要内容,如果未能解决你的问题,请参考以下文章