VBA编程——日期与时间

VBA中的日期和时间统一使用Date类型处理,代码中可以使用一对#符号直接定义日期和时间数据,如下面的代码。

VBA
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()函数。下面的代码演示了如何使用这些函数获取当前系统的日期和时间。

VBA
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。表示星期几的值和常量如下表。

常量说明
0vbUseSystem 使用 NLS API 设置。
1vbSunday 周日(默认)
2vbMonday 星期一
3vbTuesday 星期二
4vbWednesday 星期三
5vbThursday 星期四
6vbFriday 星期五
7vbSaturday 星期六

此外,获取月份名称和星期名称可以分别使用MonthName()和WeekdayName()函数。下面的代码演示了月份名称和星期信息的获取。

VBA
Sub Main()
    Dim d, t
    d = Date
    Debug.Print (MonthName(1)) '一月
    Debug.Print (WeekdayName(Weekday(d)))
End Sub

请注意,MonthName()和WeekdayName()函数返回的月份和星期名会依赖于系统当前区域和语言设置,如设置为简体中文时,月份会显示一月、二月、三月、……,星期名会显示星期日、星期一、星期二、……。

此外,还可以使用DateSerial()函数创建日期数据,其参数分别年、月、日;TimeSerial()函数创建数据,其参数分别是时、分、秒。

日期和时间计算

首先来看如何计算两个日期点之间的间隔,如下面的代码。

VBA
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指定计算间隔的类型,其值如下表。

字符说明
yyyy
q季度
m
y每年的某一日
d
w工作日
ww
h小时
n分钟
s

参数date1和date2设置计算间隔的两个日期和时间值。参数firstdayofweek设置一周的第一天是哪一天,参数firstweekofyear设置一年当中第一周的判断方式,如果没有特殊要求,这两个参数应使用默认设置。下面的代码演示了DateDiff()函数的应用。

VBA
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

对日期进行推算时,还可以使用数值指定间隔,如下面的代码。

VBA
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),其中:

  • interval参数指定添加的时间间隔类型的字符串。其值参见上文中DateDiff()函数中interval参数设置。
  • number参数指定要添加的时间间隔数的数值,正数表示向后推算,负数表示向前推算。
  • date参数指定基准日期。

下面的代码演示了DateAdd()函数的应用。

VBA
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。

下面的代码演示了时间的推算。

VBA
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()函数,下面的代码演示了相关应用。

VBA
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类型也可以和数值类型互相转换。下面的代码演示了相关应用。

VBA
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参数的可值如下表。

常量说明
0vbGeneralDate默认值。如果存在日期部分则显示为短日期,如果存在时间部分则显示为长时间。
1vbLongDate计算机区域设置中指定的长日期格式显示日期。
2vbShortDate计算机区域设置中指定的短日期格式显示日期。
3vbLongTime计算机区域设置中指定的时间格式显示时间。
4vbShortTime使用24小时格式显示时间 (hh:mm)。

下面的代码演示了日期和时间长格式的显示。

VBA
Sub Main()
    Debug.Print (FormatDateTime(Now(), vbLongDate))
    Debug.Print (FormatDateTime(Now(), vbLong))
End Sub

代码会显示系统当前日期和时间的长格式,如中文日期格式就是“xxxx年x月x日”