
学习资源:《Excel VBA从入门到进阶》第43集 by兰色幻想
一、日期返回
1 返回当前日期、时间(指本机系统设置的日期和时间)
(1)返回当前日期 Date
Debug.Print Date
返回结果:2020/5/10
(2)返回当前时间 Time
Debug.Print Time
返回结果:17:09:15
(3)返回当前日期+时间 Now
Debug.Print Now
返回结果:2020/5/10 17:09:15
2 格式化显示日期 Format
其实Format在上一节也讲过,就直接上例子啦。
Debug.Print Format(Now, "yyyy-mm-dd")
返回结果:2020-05-10
Debug.Print Format(Now, "yyyy年mm月dd日")
返回结果:2020年05月10日
Debug.Print Format(Now, "yyyy年mm月dd日 h:mm:ss")
返回结果:2020年05月10日 17:34:24
Debug.Print Format(Now, "d-mmm-yy")
返回结果:10-May-20(mmm表示英文月份的简称)
Debug.Print Format(Now, "d-mmmm-yy")
返回结果:10-May-20(mmmm是表示英文月份的全称,因为May的简写和全称是一样的,所以这个返回结果和上面没区别,但如果是四月,mmm就会显示Apr,mmmm显示April。)
Debug.Print Format(Now, "aaaa")
返回结果:星期日
Debug.Print Format(Now, "ddd")
返回结果:Sun(ddd表示英文星期前三个字母)
Debug.Print Format(Now, "dddd")
返回结果:Sunday(dddd表示英文星期完整显示)
3 根据年月日返回日期 DateSerial
VBA.DateSerial(yyyy, mm, dd)
Debug.Print VBA.DateSerial(2011, 10, 1)
返回结果:2011/10/1
4 根据小时分种返回时间
VBA.TimeSerial(hh, nn, ss)
Debug.Print VBA.TimeSerial(1, 2, 1)
返回结果:1:02:01
5 返回年月日小时分秒
Sub t5()
Dim d
d = "2011-10-28 01:10:03"
Debug.Print Year(d) & "年"
Debug.Print Month(d) & "月"
Debug.Print Day(d) & "日"
Debug.Print Hour(d) & "时"
Debug.Print VBA.Minute(d) & "分"
Debug.Print Second(d) & "秒"
End Sub

二、日期和时间计算
1 计算两个日期相隔天数,月数,年数,小时,分种,秒
DateDiff()函数返回两个日期之间的时间。
DateDiff( interval, date1, date2 [ , firstdayofweek [ , firstweekofyear ]] )
interval 时间间隔类型,必填。比如年"yyyy",月"m",天"d"等等,要注意的是分钟不是minute的m,而是用n,为了和月区分。
date1, date2 间隔的起始时间和结束时间,必填。
Firstdayofweek 可选,指定一个星期的第一天的常数。 如果未予指定, 则以星期日为第一天。
firstweekofyear 可选,指定一年的第一周的常数。 如果未予指定, 则以包含1 月 1 日的星期为第一周。
示例:
Sub tt1()
Dim d1, d2 As Date
d1 = #11/21/2011#
d2 = #12/1/2011#
Debug.Print "相隔" & (d2 - d1) & "天"
Debug.Print "相隔" & DateDiff("d", d1, d2) & "天"
Debug.Print "相隔" & DateDiff("m", d1, d2) & "月"
Debug.Print "相隔" & DateDiff("yyyy", d1, d2) & "年"
Debug.Print "相隔" & DateDiff("q", d1, d2) & "季"
Debug.Print "相隔" & DateDiff("w", d1, d2) & "周"
Debug.Print "相隔" & DateDiff("h", d1, d2) & "小时"
Debug.Print "相隔" & DateDiff("n", d1, d2) & "分种"
Debug.Print "相隔" & DateDiff("s", d1, d2) & "秒"
End Sub

2 计算两时间的差 Timer - t
Timer 函数:返回一个 Single,代表从午夜开始到现在经过的秒数。
个人认为加粗的那三行代码,基本可以直接背下来套用。
Sub tt2()
Dim t, x
t = Timer '把系统的时间赋给变量t
For x = 1 To 10000000 '让x从1到10000000循环
Next x
Msgbox Timer - t '利用消息框显示现在的时间减去前面设置的时间,得到代码运行时间
'或者写成Debug.Print Timer - t在立即窗口显示也行。
End Sub

3 日期时间加减
DateAdd()函数
DateAdd(interval, number, date)
interval 时间间隔类型,必填。比如年"yyyy",月"m",天"d"等等,要注意的是分钟不是minute的m,而是用n,为了和月区分。
number 相加减数,必填。正数表示相加,得到未来的日期;负数表示相减。
date 必要,计算日期的起始值。
示例:
Sub tt3()
Dim d1, d2 As Date
d1 = "2001-10-1 00:00:00"
Debug.Print VBA.DateAdd("d", 10, d1) '加上10天
Debug.Print VBA.DateAdd("m", 10, d1) '加上10个月
Debug.Print VBA.DateAdd("yyyy", 10, d1) '加上10年
Debug.Print VBA.DateAdd("yyyy", -10, d1) '减少10年
Debug.Print VBA.DateAdd("h", 10, d1) '加上10小时后的时间
Debug.Print VBA.DateAdd("n", 10, d1) '加上10分种后的时间
Debug.Print VBA.DateAdd("s", 10, d1) '加上10秒后的时间
End Sub

三、计时器 ontime
使用ontime函数在指定时间运行程序。
Application.OnTime(EarliestTime、 Procedure、 LatestTime、 Schedule)

例:在0点运行程序A。
Sub ttt1()
Application.OnTime TimeValue("00:00:00"), "A"
End Sub
使用Now + TimeValue(time)可安排在一段特定时间 (从现在开始计数) 开始运行的操作。使用 TimeValue(time) 可安排某个过程只运行指定的时间。
例:两秒之后运行A程序。
Sub ttt2()
Application.OnTime Now + TimeValue("00:00:02"), "A"
End Sub
但这个程序有个bug,就是容易陷入死循环,因为永远都有"两秒后"。
所以得使用下面这行代码来转让控制权,允许别的程序一起运行,来打破死循环。
x = DoEvents
例:制作时钟。
Sub 时间显示()
Dim x
If k = 1 Then
k = 0
End
End If
Range("a1") = Format(Now, "h:mm:ss")
Application.OnTime Now + TimeValue("00:00:01"), "时间显示"
x = DoEvents
End Sub

如果想结束的话,就运行以下程序,让k=1.
Sub 结束时间显示()
k = 1
End Sub

以上~晚安。