【VBA研究】VBA中⽇期和时间相关的计算
作者:iamlaosong
VBA中取当前⽇期的函数是Date,当前时间的函数是Time,当前⽇期和时间⼀起取是Now。⽇期转换成年⽉⽇的函数分别是:Year、Month、Day,参数可以⽤Date或Now取出的值。时间转换成时分秒的函数分别是:Hour、Minute、Second,参数可以⽤Time或Now取出的值。
例如:
MsgBox "当前时间:" & Now & Chr(10) & _
"时:" & Hour(Now) & Chr(10) & _
"分:" & Minute(Now) & Chr(10) & _
"秒:" & Second(Now)
MsgBox "当前⽇期:" & Now & Chr(10) & _
"年:" & Year(Now) & Chr(10) & _
"⽉:" & Month(Now) & Chr(10) & _
"⽇:" & Day(Now)
1、⽇期转换
很简单,直接⽤转换函数就可以了,例如:CDate("2012-12-31")
2、⽇期之间的天数
⽤datediff函数,注意,⼯作表单元格中⽤的函数名称是datedif,少了⼀个f,⽽且参数顺序也不⼀样
(=DATEDIF(A2,B2,"d"))。例如:
dt = Cells(2, 1)    ' 单元格内容:2013-1-1 09:35:08
dd = DateDiff("D", CDate("2012-12-31"), dt)
其中的“D”也可以换成其他字母,以便计算其它时间差(年⽉⽇时分秒等),⽐如“W”表⽰计算两个⽇期之间周
数,“H”表⽰计算两个⽇期之间的⼩时数数,具体见本⽂最后的附录。
⽇期之间的天数最简单的就是直接相减,如果⽇期中包含时间,相减是两个⽇期时间值相减,结果是个浮点数(时间差),计算天数需要⽤datevalue转换(相当于去掉⼩数部分的取整)后才能计算,例如:
dt = Cells(2, 1)    ' 单元格内容:2013-1-1 09:35:08
dd = DateValue(dt) - CDate("2012-12-31")
实际上,DateValue函数的值就是被转换⽇期距1900-1-1的天数加1,也就是说⽇期1900-1-1的DateValue函数值就是1,在此⽇期之前的⽇期Excel是不认的。⽇期时间本质就是⼀个浮点数,整数部分是⽇期,⼩数部分是时间。
3、时间差计算
时间差计算⼀般⽤TimeValue()函数将时间转换成时间值,然后计算。例如:
dt2 = Cells(2, 1)    ' 单元格内容:2013-1-1 09:35:08
dt3 = Cells(3, 1)    ' 单元格内容:2013-1-1 11:55:18
interval=TimeValue(dt3)-TimeValue(dt2)
int函数与round函数
TimeValue的值在0-1之间,表⽰0-24⼩时,实际上就是当前时间占24⼩时的⽐例。利⽤这个值可以⼲很多事,例如,⽤时间值乘以24再取整就是时间从0点开始的⼩时值,乘以24*60再取整就是时间从0点开始的分钟值,乘以24*60*60就是时间从0点开始的秒值。再⽐如,以10分钟作为间隔,⼀天的间隔数就是144,那么任意⼀个时间值乘以24*6再取整就得到从0点开始这个间隔的数量。
注意:TimeValue的数据类型是Single,如果单元格中只输⼊时间,也是给Single类型变量赋值。例如:
tt = Cells(2, 1)    ' 单元格内容:12:00:00,赋值后tt的值是0.5
我们计算两个时间差,也就是计算两个浮点数之差,⽐如程序的运⾏时间,将这个差值乘以24就是时间差以⼩时为单位,乘以24*60就是以分为单位,乘以24*60*60就是以秒为单位。
时间之间的也可以直接相减,但数据类型必须正确,效果和使⽤TimeValue函数⼀样。
4、关于取整
INT(12.56)=12:直接取整数部分,CInt(12.56)=13:⼩数部分四舍五⼊;
Ceiling(12.56,1)=13:向上进,只要有⼩数,整数部分都加1,Ceiling(12.05,1)=13,当然,这个函数功能⽐较强⼤,取整只是⼀个应⽤;
round(12.56,0)=13:⼩数部分四舍五⼊,同样,该函数有两个参数,取整只是⼀个应⽤。
5、关于Round函数进⾏四舍五⼊
Round函数进⾏四舍五⼊并不是逢5就⼊,例如:round(0.5)=0、 round(1.5)=2 、 round(2.5)=2 、round(3.5)= 4 、round(4.5)=4 ,难到还分奇偶?答案是确实分奇偶,在VBA中Round函数是采⽤“银⾏家舍⼊”,建议⼤家在VBA中慎重使⽤Round函数来四舍五⼊。什么是“银⾏家舍⼊”呢,定义如下:
“四舍六⼊五考虑,五后⾮零就进⼀,五后为零看奇偶,五前为偶应舍去,五前为奇要进⼀”。这个四舍五⼊法是⼀个国际标准,⼤部分的编程软件都使⽤的是这种⽅法,据说国际上⼀般都是⽤这种⽅法的。
如果在Excel VBA中进⾏四舍五⼊处理,也可以直接调⽤Excel⼯作表函数,达到直接四舍五⼊的⽬
的Application.Round(A,B)
===============================
附:DateDiff 函数⽤法
DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]])
返回⼀个Variant(long) 的值,表⽰两个指定⽇期间的时间间隔数⽬
interval:设定两个⽇期之间的期间计算之单位。譬如 >interval="m" 表⽰计算的单位为⽉。 >interval 的设定值如:
yyyy > Year 年
q Quarter 季
m Month ⽉
d Day ⽇
w Weekday 星期
h Hour 时
n Minute 分
s Second 秒
Date1 ,Date2:计算期间的两个⽇期表达式,若 >date1 较早,则两个⽇期之间的期间结果为正值;若 >date2 较早,则结果为负值。firstweekofyear:设定每周第⼀天为星期⼏,若未设定表⽰为星期天。 >FW 的设定值如下:
0 使⽤ >API 的设定值。
1 星期天
2 星期⼀
3 星期⼆
4 星期三
5 星期四
6 星期五
7 星期六
firstweekofyear:设定⼀年的第⼀周,若未设定则表⽰⼀⽉⼀⽇那⼀周为⼀年的第⼀周。 >FY 的设定
值如下:
0 使⽤ >API 的设定值。
1 ⼀⽉⼀⽇那⼀周为⼀年的第⼀周
2 ⾄少包括四天的第⼀周为⼀年的第⼀周
3 包括七天的第⼀周为⼀年的第⼀周
⽰例如下:
计算两个⽇期的相隔⽉数.
DiffMonthL = DateDiff("M", DATE_start, DATE_end)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。