在第一个错误条件下选择案例停止

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 &lt;value&gt; 语句将作为 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指的是保存函数退出时返回值的变量。在您使用它的第一点,它没有被分配任何值,因此它具有默认值。

以上是关于在第一个错误条件下选择案例停止的主要内容,如果未能解决你的问题,请参考以下文章

如何停止加载标签栏项目选择的视图?

错误:停止的锻炼会话无法重新开始

错误:停止的锻炼会话无法重新开始

在第一个字符匹配时停止? [复制]

pytest 运行命令

SQL - 在某些条件下选择查询的问题