VBA 日期为整数

Posted

技术标签:

【中文标题】VBA 日期为整数【英文标题】:VBA Date as integer 【发布时间】:2012-01-09 23:28:02 【问题描述】:

有没有办法在 VBA 中获取 Date 函数的底层整数?我指的是 Excel 存储的整数,以天数来描述内存中的日期(当包含时间时,它可能是一个浮点数,我猜)。我只对整数部分感兴趣。是否还有其他功能?

例如,对于 today(),我希望能够取回 40877..

【问题讨论】:

【参考方案1】:

在 VB(A) 中,日期不是整数,而是双精度数。

您可以通过将 Date 值传递给 CDbl() 来获取它。

CDbl(Now())      ' 40877.8052662037 

来自documentation:

1900 年日期系统

在 1900 日期系统中,支持的第一天是 1 月 1 日, 1900. 输入日期时,日期转换为序列号,表示从 1 开始的经过天数 1900 年 1 月 1 日。例如,如果您输入 1998 年 7 月 5 日,Excel 将日期转换为序列号 35981。

因此,在 1900 系统中,40877.805... 表示 1900 年 1 月 1 日(2011 年 11 月 29 日)之后的 40,876 天,以及一天的约 80.5%(约 19:19h)。 Excel 中有一个基于 1904 的系统的设置,使用时数字将关闭(这是每个工作簿的设置)。

要获取整数部分,请使用

Int(CDbl(Now())) ' 40877

这将返回一个没有小数位的 LongDouble(即 Floor() 在其他语言中会做什么)。

使用CLng()Round() 会导致舍入,当中午12:00 之后调用时将返回“未来的一天”,所以不要这样做。

【讨论】:

Int(CDbl(Now())) 不返回 long,而是返回 double。 double 的值恰好代表一个整数,但它的数据类型仍然是 double。 @phoog: TypeName(VarType(Int(CDbl(Now())))) = "Long" 在我的系统上 @Tomalek 当然,因为VarType(Int(CDbl(Now()))) 返回5,这是vbDouble 的值,但它本身是Long。试试TypeName(Int(CDbl(Now()))) 如果您使用Date 而不是Now,所有这些部分日问题都会消失 - Date(函数不是数据类型)返回没有时间组件的日期。 @JonEgerton 更不用说 OP 首先询问的是 Date 函数,而不是 Now 函数。【参考方案2】:

您可以对 mdate 和 Now() 等日期字符串使用波纹管代码示例,例如 toDay,您还可以计算两个日期之间的差异,例如 Aging

Public Sub test(mdate As String)
    Dim toDay As String
    mdate = Round(CDbl(CDate(mdate)), 0)
    toDay = Round(CDbl(Now()), 0)
    Dim Aging as String
    Aging = toDay - mdate
    MsgBox ("So aging is -" & Aging & vbCr & "from the date - " & _
    Format(mdate, "dd-mm-yyyy")) & " to " & Format(toDay, "dd-mm-yyyy"))
End Sub

注意:使用CDate 将日期字符串转换为有效日期

我在 Office 2007 中使用它:)

【讨论】:

【参考方案3】:
Public SUB test()
    Dim mdate As Date
    mdate = now()
    MsgBox (Round(CDbl(mdate), 0))
End SUB

【讨论】:

【参考方案4】:

只需使用CLng(Date)

请注意,您需要为此使用Long 而不是Integer,因为当前日期的值是> 32767

【讨论】:

确实我没有想到 Long/Integer 问题!谢谢! CLng 会将下午的值四舍五入到第二天。 @phoog。我用过Date 而不是NowDate 没有时间成分,因此CLng 很好且安全。 @JonEgerton 当然。我忽略了这一点。我没有投反对票,所以我不能删除它:(但是我确实添加了一个赞成票:) @phoog:别担心,这让我净+8!

以上是关于VBA 日期为整数的主要内容,如果未能解决你的问题,请参考以下文章

如何实现VBA 判断单元格内数据是不是为整数,是则无影响,否则出现消息框,单元格清空?

如何在 Excel VBA 中将整数转换为字符串?

在 VBA 中睡觉(整数溢出!!)

VBA 中涉及两个整数和一个长整数的溢出错误

访问VBA参数查询将整数更改为字符串

如何在 Netezza 中将整数字段转换为日期?