HOUR函数作为公式使用,但不作为24:00的VBA代码

时间:2016-03-22 16:10:07

标签: excel vba excel-vba

所以我有一个程序,我认为上次检查它时工作但显然不是。我遇到的问题是24:00和小时检查。是的,显然是一个经典问题。当进入24:00并且我使用=小时(A1),其中A1有24:00,我得到0的答案,那部分我很好。我甚至还有一些其他的代码,如果timehour = 0,那么timehour = 24,我继续从那里开始,一切都很好。

今天当我进入24:00并在VBA中使用小时功能时,它返回了运行时错误“13”:类型不匹配而不是0。

设置

excel中的单元格E4和E5具有经过验证的数据列表,供用户在01:00,02:00,03:00,...,24:00的下拉列表中进行选择。全部格式化为文本。如果用户在设置中选择了12小时时钟,则时间列在凌晨1:00,凌晨2:00,凌晨3:00,......,11:00 PM,12:00 AM。

CODE

Private Sub Set_Work_Hours()
    Dim setStartHour As Integer
    Dim setEndHour As Integer
    Dim sht As Worksheet

    'setting the worksheet to be working with
    Set sht = ThisWorkbook.Worksheets("Daily")
    sht.Activate

    'hardcode location of start and end times from daily sheet
    setStartHour = Hour(Cells(4, 5).Value)
    setEndHour = Hour(Cells(5, 5).Value)

    Call Display_Work_Hours(setStartHour, setEndHour)

End Sub

当我从列表中选择24:00时,我在setStartHour或setEndHour处收到错误。 在电子表格的另一个单元格中,我有公式= HOUR(E4)和= HOUR(E5),并且当选择24:00时它们都返回0。

为什么HBA的VBA版本没有返回零?

澄清问题。 为什么我从excel公式到VBA函数得到两个不同的结果?

我的工作

Private Sub Set_Work_Hours()
    Dim setStartHour As Integer
    Dim setEndHour As Integer
    Dim sht As Worksheet

    'setting the worksheet to be working with
    Set sht = ThisWorkbook.Worksheets("Daily")
    sht.Activate

    'hardcode location of start and end times from daily sheet
    If Cells(4, 5).Value = "24:00" Then
        setStartHour = 0
    Else
        setStartHour = Hour(Cells(4, 5).Value)
    End If
    If Cells(5, 5).Value = "24:00" Then
        setEndHour = 0
    Else
        setEndHour = Hour(Cells(5, 5).Value)
    End If

    Call Display_Work_Hours(setStartHour, setEndHour)

End Sub

2 个答案:

答案 0 :(得分:1)

只是扩展我的评论。 Excel将日期和时间存储为序列号。序列号的整数部分是自19/1/19以来的天数,小数部分是小时数。

当您将小时数用作字符串(例如“24:00”)时,Excel会将其转换为序列号,在本例中为1.01/1/1900 0:00。 VBA不会隐式转换这样的无效时间,这就是您看到错误的原因。在VBA中表示"24:00"的正确方法是"00:00"

答案 1 :(得分:0)

作为一般性建议,为什么不在UNIX后的UNIX时间运行所有DateTime变量,只需转换为电子表格上的用户可读日期?

这种方式没有错误!!

从人类可读日期转换为纪元

DateDiff("s", "01/01/1970 00:00:00", time field)

如何获取当前的纪元时间

DateDiff("s", "01/01/1970 00:00:00", Now())