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
而不是Now
。 Date
没有时间成分,因此CLng
很好且安全。
@JonEgerton 当然。我忽略了这一点。我没有投反对票,所以我不能删除它:(但是我确实添加了一个赞成票:)
@phoog:别担心,这让我净+8!以上是关于VBA 日期为整数的主要内容,如果未能解决你的问题,请参考以下文章