乐于分享
好东西不私藏

Excel VBA 编程基础 — 日期与时间(一)- 日期(一)

Excel VBA 编程基础 — 日期与时间(一)- 日期(一)

日期与时间是一个比较复杂的话题,我们要分几期才能讲完。
Excel 和 VBA 分别有自己的日期与时间函数,我们这里只讨论 VBA 中的日期与时间。
今天先从日期开始讲起。VBA 中有好几个 Date,我们先从厘清这几个 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。
Date/Time 常量表示法
VBA 中使用 # 号括起来的常量表示日期/时间,如:
#4/15/2026# 表示 2026年4月15日。
注意:常量日期的表示法是 #月/日/年#。
也可以用 #年-月-日# 格式表示:#2026-4-15#。
时间表示,既可以用 12 小时制,也可以用 24 小时制。如:
#11:20 AM# 表示上午 11 点 20 分。
#11:20:00 PM# 表示下午 11 点 20 分,也可以表示为 #23:20:00#。
Date/Time 语句
VBA 用 Date 语句来设置系统日期,如:
Date = #2025-10-2#
VBA 用 Time 语句来设置系统时间,如:
Time = #11:20 AM#
建议不要使用 Date/Time 语句来设置系统的日期与时间。Windows 系统有一个时间同步的设施,可以用来与世界上的时间服务器进行同步,如图1:
图1 Windows 的时间同步
这个同步设施保证你能得到正确的日期与时间。
有关 Date 的函数
1. Date 函数
VBA 的 Date 函数用来获取你机器里的系统日期,用法如下:
Dim myDate As VariantmyDate = Date()
Date 函数返回 Variant 类型的当前系统日期。Date 函数返回的只有日期部分,不含有时间部分。如果想返回日期和时间,则使用 Now 函数。
2. Now 函数
VBA 的 Now 函数返回你机器中的系统日期和时间,用法如下:
Dim myDate As DatemyDate = Now()Debug.Print myDate    ' 2026-04-15 13:09:31
Now 函数返回 Date 类型的系统日期和时间。
3. FormatDateTime 函数
FormatDateTime 函数用来格式化日期和时间,返回以字符串形式表示的日期和时间,用法如下:
Dim myDate As DateDim myDateStr As StringDim myTimeStr As StringmyDate = Now()myDateStr = FormatDateTime(myDate, vbShortDate)myTimeStr = FormatDateTime(myDate, vbLongTime)
FormatDateTime 函数的一般形式如下:
FormatDateTime( DateExpression [, NamedFormat ] )
其中,DateExpression 是一个日期时间表达式,如果是 Now 函数的结果,则其中包含日期和时间,如果是 Date 函数的结果,则只包含日期,时间部分为 0。
NamedFormat 是一个数字形式表示的日期/时间格式,是 FormatDateTime 函数的可选参数,如果没有指定,则其值为0。NamedFormat 取值如下表所示:
图2 NamedFormat 的取值
其中的长短格式的具体样式是在 Windows 控制面板的区域设置中指定的。样例如下:
Debug.Print FormatDateTime(Now(), vbGeneralDate)' 2026-04-15 13:50:03
4. DateAdd 函数
该函数的一般形式是:
DateAdd(interval, number, date)
DateAdd 函数是将一定量的数(其意义由 interval 指定)加到 date 上,返回 Date 类型的新值。
其中,interval 可以是年、月、日,也可以是时、分、秒。number 可以是正数,表示未来的某个日期/时间,也可以是负数,表示过去的某个日期/时间。
样例如下:
Dim myDate As DatemyDate = DateAdd("d"10Date())
这里,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。
Interval 参数的取值如下表所示:
图3 interval 的值以及意义
如果我们要求得下个季度的今天,则可以用如下代码:
myDate = DateAdd("q"1, Date())
如果要求得下周的今天,则使用如下代码:
myDate = DateAdd("ww"1, Date())
同样,如要求得上个月的今天,则:
myDate = DateAdd("m", -1, Date())
由于月的不规则性(大月、小月、闰月),使得日期的算术操作非常繁难,DateAdd 为我们屏蔽了这些麻烦的操作,使得日期、时间的增、减变得易如反掌。
(未完待续)