Excel VBA 编程基础 — 日期与时间(一)- 日期(一)
日期与时间是一个比较复杂的话题,我们要分几期才能讲完。
Excel 和 VBA 分别有自己的日期与时间函数,我们这里只讨论 VBA 中的日期与时间。
今天先从日期开始讲起。VBA 中有好几个 Date,我们先从厘清这几个 Date 开始。
VBA 中表示日期/时间的数据类型称为 Date,实际内部表示为一个双精度浮点数(Double),整数部分表示日期(date),小数部分表示时间(time)。
日期范围:公元 100 年 1 月 1 日 至 公元 9999 年 12 月 31 日。
时间范围:00:00:00 至 23:59:59。0.0 表示午夜 0 点,0.5 表示正午 12 点。
负数表示 1899 年 12 月 30 日以前的日期,正数表示 1899 年 12 月 30 日以后的日期,1899 年 12 月 30 日表示为 0。
VBA 中使用 # 号括起来的常量表示日期/时间,如:
#4 /15/2026# 表示 2026年4月15日。
时间表示,既可以用 12 小时制,也可以用 24 小时制。如:
#11 :20 AM# 表示上午 11 点 20 分。
#11 :20:00 PM# 表示下午 11 点 20 分,也可以表示为 #23 :20:00#。
建议不要使用 Date/Time 语句来设置系统的日期与时间。Windows 系统有一个时间同步的设施,可以用来与世界上的时间服务器进行同步,如图1:
VBA 的 Date 函数用来获取你机器里的系统日期,用法如下:
Dim myDate As Variant myDate = Date ()
Date 函数返回 Variant 类型的当前系统日期。Date 函数返回的只有日期部分,不含有时间部分。如果想返回日期和时间,则使用 Now 函数。
VBA 的 Now 函数返回你机器中的系统日期和时间,用法如下:
Dim myDate As DatemyDate = Now()Debug .Print myDate ' 2026 -04 -15 13 :09 :31
Now 函数返回 Date 类型的系统日期和时间。
FormatDateTime 函数用来格式化日期和时间,返回以字符串形式表示的日期和时间,用法如下:
Dim myDate As Date Dim myDateStr As String Dim myTimeStr As String myDate = Now () myDateStr = FormatDateTime (myDate, vbShortDate) myTimeStr = FormatDateTime (myDate, vbLongTime)
FormatDateTime 函数的一般形式如下:
FormatDateTime( DateExpression [, NamedFormat ] )
其中,DateExpression 是一个日期时间表达式,如果是 Now 函数的结果,则其中包含日期和时间,如果是 Date 函数的结果,则只包含日期,时间部分为 0。
NamedFormat 是一个数字形式表示的日期/时间格式,是 FormatDateTime 函数的可选参数,如果没有指定,则其值为0。NamedFormat 取值如下表所示:
其中的长短格式的具体样式是在 Windows 控制面板的区域设置中指定的。样例如下:
Debug.Print FormatDateTime (Now() , vbGeneralDate) ' 2026-04-15 13:50:03
DateAdd(interval, number, date)
DateAdd 函数是将一定量的数(其意义由 interval 指定)加到 date 上,返回 Date 类型的新值。
其中,interval 可以是年、月、日,也可以是时、分、秒。number 可以是正数,表示未来的某个日期/时间,也可以是负数,表示过去的某个日期/时间。
Dim myDate As Date myDate = DateAdd ("d" , 10 , Date ())
这里,interval 是 “d”,表示其后的 10 是天数。这个赋值语句的意思是将当前日期增加 10 天,并将增加后的日期赋给 myDate,这个语句执行完后,myDate 的值就是 10 天后的日期。譬如,当前日期是 2026-04-15,则 myDate 的值就是 2026-04-25。
myDate = DateAdd("n" , 100 , Now())
这个赋值语句的意思是:在当前时间的基础上增加 100 分钟(interval 的 “n” 表示分钟),返回新的日期/时间赋给 myDate。如果 Now() 的值是 2026-04-15 14:25:39,那么,语句执行后,myDate 中的值将是 2026-04-15 16:05:39。
myDate = DateAdd("q" , 1 , Date())
myDate = DateAdd("ww" , 1 , Date())
myDate = DateAdd("m" , -1 , Date())
由于月的不规则性(大月、小月、闰月),使得日期的算术操作非常繁难,DateAdd 为我们屏蔽了这些麻烦的操作,使得日期、时间的增、减变得易如反掌。