乐于分享
好东西不私藏

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

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

我们前面用四篇文章,基本上把 VBA 的日期类型说清楚了,接下来我们来看时间。
由于一天 24 小时总是固定的,因此时间没有日期那么复杂,我们争取用一篇文章说清楚。
VBA 有 Time 函数和 Time 语句。Time 函数用来获取机器上的当前系统时间,Time 语句则用来设置机器上的系统时间。
1. Time 函数和 Time 语句
Dim t As Variantt = Time()Debug.Print TypeName(t)  ' DateDebug.Print FormatDateTime(t, vbLongTime) ' 16:02:57Debug.Print CDbl(t)  ' 0.668715277777778Time = #3:00:00 PM#  ' 设置系统时间为下午 3 点
VBA 中,时间没有自己特定的类型,日期与时间都归入 Date 类型。我们说过,Date 类型的内部表示是双精度浮点数,整数部分表示日期,小数部分表示时间。Time 函数获取的只有时间部分,所以,时间 16:02:57 对应的内部表示就是浮点数 0.668715277777778。
同 Date 语句一样,一般不要使用 Time 语句去设置系统时间,而是用 Windows 控制面板中的时间同步功能与时间服务器同步,来校正自己机器上的系统时间。
2. TimeSerial
可以将 TimeSerial 看作为时间构造函数,通过时、分、秒三个参数来构造时间。其一般格式如下:
TimeSerial(hour, minute, second)
其中,hour 为时,范围为 0 – 23;minute 为分,范围为 0 – 59;second 为秒,范围为 0 – 59。
TimeSerial 的返回值:
  • 类型:Variant (Date)
  • 意义:时间
虽然上面给出了 hour、minute、second 的取值范围,但时、分、秒都可以是相对值,只要不超过 Integer 的表示范围。
例1.
Dim t As Variantt = TimeSerial(02500)Debug.Print t    ' 4:10:00
在这个例子中,minute 部分是 250,转换为时间时,算法如下:
  • h = 0 + 250 \ 60 = 0 + 4 = 4
  • m = 250 Mod 60 = 10
  • s = 0
因此,最后的结果是 4:10:00。
例2.
Dim t As Variantt = TimeSerial(10025030)Debug.Print t    ' 1900-01-03 8:10:30
这个例子的转换算法如下:
  • h = 100 + 250 \ 60 = 100 + 4 = 104
  • m = 250 Mod 60 = 10
  • s = 30
  • d = h \ 24 = 4
  • h = h Mod 24 = 8
因此,最后的结果是 1900-01-03 8:10:30。其中 d = 4 表示 1900-01-03。我们在讨论日期时说过,0 表示 1899-12-30,1 表示 1899-12-31,2 表示 1900-01-01,依此类推。
上面的符号 \ 是 VBA 中的整数除法,符号 / 是小数除法。用法如下:
Debug.Print 104 \ 24    ' 4Debug.Print 104 / 24    ' 4.33333333333333
3. TimeValue
这个可以认为是时间转换函数,就是将字符串形式的时间转换为 Date 类型的时间。其一般格式如下:
TimeValue(expr)
其中,expr 是字符串形式的时间表示,但其中可以含有日期部分,TimeValue 在转换过程中会舍弃日期部分,但如果 expr 中的日期部分不是合法的日期,则 TimeValue 在转换过程中会出错。
VBA 文档中说:如果 expr 含有 Null,则 TimeValue 返回 Null。这种说法有误。实际上,如果 expr 为 Empty 或 Null 或含有 Null,TimeValue 都会出错。
TimeValue 的返回值:
  • 类型:Variant (Date)
  • 意义:时间
例1. 
Dim t As Variantt = TimeValue("4:30 PM")Debug.Print t   ' 16:30:00t = TimeValue("16:30")Debug.Print t    ' 16:30t = TimeValue(#4:30:10 PM#)Debug.Print t    ' 16:30:10
例2.
Dim t As Variantt = TimeValue("100-10-1 4:30:10 PM")Debug.Print t  ' 16:30:10t = TimeValue("100-20-1 4:30:10 PM")  ' ERROR !
100-20-1 是一个非法日期,因此最后一行出错!
4. Hour、Minute、Second 函数
这三个函数分别取时间中的时、分、秒,返回 Variant (Integer) 类型的结果。
例1.
Dim t As VariantDim h As IntegerDim m As IntegerDim s As Integer= Time()= Hour(t)= Minute(t)= Second(t)
例2.
Dim h, m, sh = Hour(#4:30:10 PM#)Debug.Print h    ' 16m = Minute(#4:30:10 PM#)Debug.Print m    ' 30s = Second(#4:30:10 PM#)Debug.Print s    ' 10
例3.
Dim h, m, sh = Hour("4:30:10 PM")Debug.Print h    ' 16m = Minute("4:30:10 PM")Debug.Print m    ' 30s = Second("4:30:10 PM")Debug.Print s    ' 10
以上的例子说明了 Hour、Minute、Second 的三个函数的参数可以是 Date 类型、时间常量、字符串形式的时间表示,也就是说,只要能够合法地转换为 Date 类型,都可以。
相关阅读
Excel VBA 编程基础 — 日期与时间(一)- 日期(一)
Excel VBA 编程基础 — 日期与时间(二)- 日期(二)
Excel VBA 编程基础 — 日期与时间(三)- 日期(三)
Excel VBA 编程基础 — 日期与时间(四)- 日期(四)