VBA中的日期和时间统一使用Date类型处理,代码中可以使用一对#符号直接定义日期和时间数据,如下面的代码。
Sub Main() Debug.Print (#1/13/2026#) '2026/1/13 Debug.Print (#1/13/2026 12:00:00 PM#) '2026/1/13 12:00:00 Debug.Print (#12:15:33 PM#) '12:15:33 End Sub
输入日期和时间直接量时可以按我们习惯的格式,如“年-月-日 时:分:秒”,但VBA环境会自动改变格式,如代码中显示的格式。
Date()函数获取系统当前日期,Time()函数获取系统当前时间,Now()函数获取系统的当前日期和时间。获取日期和时间中的具体信息可以使用Year()、Month()、Day()、Hour()、Minute()、Second()函数。下面的代码演示了如何使用这些函数获取当前系统的日期和时间。
Sub Main() Dim d, t d = Date t = Time Debug.Print (d) Debug.Print (year(d)) Debug.Print (Month(d)) Debug.Print (Day(d)) Debug.Print (t) Debug.Print (Hour(t)) Debug.Print (Minute(t)) Debug.Print (Second(t)) Debug.Print (Now()) End Sub
获取星期数据时使用Weekday()函数,定义为Weekday(date,[firstdayofweek]),其中,date参数指定日期数据,firstdayofweek指定一周的第一天是星期几,默认为vbSunday。表示星期几的值和常量如下表。
此外,获取月份名称和星期名称可以分别使用MonthName()和WeekdayName()函数。下面的代码演示了月份名称和星期信息的获取。
Sub Main() Dim d, t d = Date Debug.Print (MonthName(1)) '一月 Debug.Print (WeekdayName(Weekday(d))) End Sub
请注意,MonthName()和WeekdayName()函数返回的月份和星期名会依赖于系统当前区域和语言设置,如设置为简体中文时,月份会显示一月、二月、三月、……,星期名会显示星期日、星期一、星期二、……。
此外,还可以使用DateSerial()函数创建日期数据,其参数分别年、月、日;TimeSerial()函数创建数据,其参数分别是时、分、秒。
首先来看如何计算两个日期点之间的间隔,如下面的代码。
Sub Main() Dim d1, d2 d1 = DateValue("2026-1-3") d2 = DateValue("2026-2-1") Debug.Print (d2 - d1) End Sub
代码首先使用DateValue()函数生成了两个日期值,然后通过减法计算了两个日期之间的距离,计算结果会返回29,即两个日期相差的天数。计算d1-d2会返回-29,同样是相差29天,但根据结果的正负可以判断哪个日期更早或更晚。
计算日期和时间间隔时还可以使用DateDiff()函数,其定义如下:
DateDiff(interval, date1, date2, [firstdayofweek, [firstweekofyear]])
其中,参数interval指定计算间隔的类型,其值如下表。
参数date1和date2设置计算间隔的两个日期和时间值。参数firstdayofweek设置一周的第一天是哪一天,参数firstweekofyear设置一年当中第一周的判断方式,如果没有特殊要求,这两个参数应使用默认设置。下面的代码演示了DateDiff()函数的应用。
Sub Main() Dim d1, d2 d1 = #1/3/2026 1:00:00 PM# d2 = #1/13/2026 1:00:00 AM# Debug.Print (DateDiff("h", d1, d2)) '228 End Sub
对日期进行推算时,还可以使用数值指定间隔,如下面的代码。
Sub Main() Dim d1 d1 = #1/3/2026 1:00:00 AM# Debug.Print (d1 + 10.5) '2026/1/13 13:00:00 End Sub
代码中,变量d1的日期和时间值加上10.5,表示加上了10天又12小时,执行结果会显示日期"2026/1/13 13:00:00"。
DateAdd()函数可以进行更加丰富的推算,定义DateAdd(interval, number, date),其中:
下面的代码演示了DateAdd()函数的应用。
Sub Main() Dim d1, d2 d1 = #1/3/2026# d2 = DateAdd("d", 10, d1) Debug.Print (d2) '2026/1/13 End Sub
DateAdd()函数中,第一个参数指定相加的为天数,第二个参数指定加10天,第三个参数指定基准日期为d1变量的值;执行代码会显示2026/1/13。
下面的代码演示了时间的推算。
Sub Main() Dim t1, t2 t1 = #12:30:50 AM# t2 = DateAdd("h", 3, t1) '3:30:50 Debug.Print (t2) End Sub
本例,t1变量定义的时间实际为0点30分50秒,通过DateAdd()函数进行推算。代码会在0:30:50时点加上3小时,执行结果会显示3:30:50。
前面的示例中使用了DateValue()函数和TimeValue()函数,分别将文本格式的日期和时间转换为VBA中的Date类型。代码中判断一个表达式是否可以转换为Date类型时还可以使用IsDate()函数,将表达式转换为Date类型时可以使用CDate()函数,下面的代码演示了相关应用。
Sub Main() Dim d, t, s s = "2016-7-33" Debug.Print (IsDate(s)) ' False s = "2026-1-13" Debug.Print (IsDate(s)) 'True Debug.Print (CDate(s)) '2026/1/13 s = "2026-1-13 15:30:16" Debug.Print (IsDate(s)) 'True Debug.Print (CDate(s)) '2026/1/13 15:30:16 s = "15:30:16" Debug.Print (IsDate(s)) 'True Debug.Print (CDate(s)) '15:30:16 End Sub
实际应用中,Date类型也可以和数值类型互相转换。下面的代码演示了相关应用。
Sub Main() Dim d d = #1/13/2026 12:00:00 PM# Debug.Print (CDbl(d)) '46035.5 Debug.Print (CDate(46035.5)) '2026/1/13 12:00:00 d = #12:00:00 PM# Debug.Print (CDbl(d)) '0.5 Debug.Print (CDate(0.5)) '12:00:00 End Sub
实际上,可以看到,当Date类型数据转换为Double类型时,其值和Excel中的转换结果是一致的,在VBA中,使用数值表示日期和时间,同样是整数部分表示距离标准时点的天数,小数部分表示时间在当天时间的比例,如0.5就是中午12点。
FormatDateTime ()函数定义为FormatDateTime (Date,[ NamedFormat ]),可以将日期和时间值按系统设置中的标准格式输出,NamedFormat参数的可值如下表。
下面的代码演示了日期和时间长格式的显示。
Sub Main() Debug.Print (FormatDateTime(Now(), vbLongDate)) Debug.Print (FormatDateTime(Now(), vbLong)) End Sub
代码会显示系统当前日期和时间的长格式,如中文日期格式就是“xxxx年x月x日”