VBA代码---毫秒级时间记录_vba now 毫秒
这是 最基础的一个计时用法 ,这次主要针对入门级同学 的学习,大神请放过 。也算是给我自己复习一遍吧。本次写了 三个案例 ,就不逐一演示了,特别是超越24小时的案例。
在V BA中计算代码运行时长的核心逻辑是:记录代码开始执行的时间→运行目标代码→记录代码结束执行的时间→计算时间差。
如果你也喜欢,请帮忙点个爱心,让更多的人学到这么有趣的文章。
需要课件的同学,可以 截图需要的课件 发私信, 留下邮箱 。不必理会Ai的回复信息。
效果如视频所示:
一、核心方法
VBA中常用两种时间函数记录时间戳,适用于不同精度需求:
1. Timer
函数(推荐,毫秒级精度)
- 功能
:返回从“当天午夜”到当前时刻的 秒数 (单精度浮点数,包含小数部分,精确到毫秒级)。
- 适用场景
:代码运行时间较短(如毫秒~小时级),需高精度计时
2. Now
函数(秒级精度)
- 功能
:返回当前系统的 日期和时间 (日期+时间,精确到秒,无毫秒部分)。
- 适用场景
:代码运行时间较长(如小时~天级),对毫秒精度无要求。
二、完整示例代码
以下示例使用 Timer
函数实现高精度计时,包含“开始时间记录→代码运行→结束时间记录→时间差计算→结果格式化输出”全流程。
示例1:基础版(计算代码运行总秒数)
Sub 计算代码运行时长_基础版
Dim startTime As Single ' 开始时间(秒数,Timer返回值)
Dim endTime As Single ' 结束时间(秒数)
Dim duration As Single ' 总时长(秒数)
' 1. 记录开始时间
startTime = Timer
' 2. 【运行目标代码】(这里用循环模拟耗时操作)
Dim i As Long
For i = 1 To 1000000 ' 循环100万次,模拟耗时
' 目标代码(替换为实际需要计时的代码)
Next i
' 3. 记录结束时间
endTime = Timer
' 4. 计算时间差(秒数,含毫秒)
duration = endTime - startTime
' 5. 输出结果(秒数+毫秒)
MsgBox "代码运行总时长:" & duration & " 秒" & vbCrLf & _
"(精确到毫秒:" & Format(duration, "0.000") & " 秒)", vbInformation
End Sub
Sub 计算代码运行时长_基础版
Dim startTime As Single ' 开始时间(秒数,Timer返回值)
Dim endTime As Single ' 结束时间(秒数)
Dim duration As Single ' 总时长(秒数)
' 1. 记录开始时间
startTime = Timer
' 2. 【运行目标代码】(这里用循环模拟耗时操作)
Dim i As Long
For i = 1 To 1000000 ' 循环100万次,模拟耗时
' 目标代码(替换为实际需要计时的代码)
Next i
' 3. 记录结束时间
endTime = Timer
' 4. 计算时间差(秒数,含毫秒)
duration = endTime - startTime
' 5. 输出结果(秒数+毫秒)
MsgBox "代码运行总时长:" & duration & " 秒" & vbCrLf & _
"(精确到毫秒:" & Format(duration, "0.000") & " 秒)", vbInformation
End Sub
示例2:进阶版(格式化输出为“时:分:秒.毫秒”)
上述基础版返回“总秒数”,可读性较差。进阶版通过计算将秒数转换为“小时:分钟:秒.毫秒”格式,更直观:
Sub 计算代码运行时长_格式化输出
Dim startTime As Single, endTime As Single, duration As Single
Dim hours As Long, minutes As Long, seconds As Long, milliseconds As Long
' 1. 记录开始时间
startTime = Timer
' 2. 【运行目标代码】(替换为实际需要计时的代码)
Dim i As Long
For i = 1 To 2000000 ' 模拟耗时操作(循环200万次)
Next i
' 3. 记录结束时间并计算总时长(秒数)
endTime = Timer
duration = endTime - startTime
' 4. 处理跨午夜情况(若代码运行超过24小时,Timer返回值会重置,需修正)
If duration 86400秒 = 24小时
' 5. 转换为“时:分:秒.毫秒”格式
hours = Int(duration / 3600) ' 小时数(总秒数 ÷ 3600)
minutes = Int((duration - hours * 3600) / 60) ' 剩余分钟数(总秒数 - 小时×3600后 ÷ 60)
seconds = Int(duration - hours * 3600 - minutes * 60) ' 剩余秒数
milliseconds = Int((duration - Int(duration)) * 1000) ' 毫秒数(小数部分×1000取整)
' 6. 输出格式化结果
MsgBox "代码运行总时长:" & vbCrLf & _
hours & "小时 " & minutes & "分钟 " & seconds & "秒 " & milliseconds & "毫秒", vbInformation
End Sub
Sub 计算代码运行时长_格式化输出
Dim startTime As Single, endTime As Single, duration As Single
Dim hours As Long, minutes As Long, seconds As Long, milliseconds As Long
' 1. 记录开始时间
startTime = Timer
' 2. 【运行目标代码】(替换为实际需要计时的代码)
Dim i As Long
For i = 1 To 2000000 ' 模拟耗时操作(循环200万次)
Next i
' 3. 记录结束时间并计算总时长(秒数)
endTime = Timer
duration = endTime - startTime
' 4. 处理跨午夜情况(若代码运行超过24小时,Timer返回值会重置,需修正)
If duration
' 5. 转换为“时:分:秒.毫秒”格式
hours = Int(duration / 3600) ' 小时数(总秒数 ÷ 3600)
minutes = Int((duration - hours * 3600) / 60) ' 剩余分钟数(总秒数 - 小时×3600后 ÷ 60)
seconds = Int(duration - hours * 3600 - minutes * 60) ' 剩余秒数
milliseconds = Int((duration - Int(duration)) * 1000) ' 毫秒数(小数部分×1000取整)
' 6. 输出格式化结果
MsgBox "代码运行总时长:" & vbCrLf & _
hours & "小时 " & minutes & "分钟 " & seconds & "秒 " & milliseconds & "毫秒", vbInformation
End Sub
示例3:使用 Now
函数(适合长时运行代码)
若代码运行时间超过几小时, Now
函数更易读(直接返回日期时间),但精度仅到秒级:
Sub 计算代码运行时长_Now函数
Dim startTime As Date, endTime As Date
Dim duration As Double ' 时间差(单位:天,1天=24小时)
' 1. 记录开始时间(日期+时间)
startTime = Now
' 2. 【运行目标代码】(模拟长时间运行,如等待3秒)
Application.Wait Now + TimeValue("00:00:03") ' 等待3秒
' 3. 记录结束时间并计算时间差
endTime = Now
duration = endTime - startTime ' 时间差(单位:天,此处为 3秒/86400秒/天 = 3.4722e-5 天)
' 4. 转换为“时:分:秒”格式(无毫秒)
MsgBox "代码运行总时长:" & _
Format(duration, "hh小时mm分钟ss秒"), vbInformation ' 输出:00小时00分钟03秒
End Sub
Sub 计算代码运行时长_Now函数
Dim startTime As Date, endTime As Date
Dim duration As Double ' 时间差(单位:天,1天=24小时)
' 1. 记录开始时间(日期+时间)
startTime = Now
' 2. 【运行目标代码】(模拟长时间运行,如等待3秒)
Application.Wait Now + TimeValue("00:00:03") ' 等待3秒
' 3. 记录结束时间并计算时间差
endTime = Now
duration = endTime - startTime ' 时间差(单位:天,此处为 3秒/86400秒/天 = 3.4722e-5 天)
' 4. 转换为“时:分:秒”格式(无毫秒)
MsgBox "代码运行总时长:" & _
Format(duration, "hh小时mm分钟ss秒"), vbInformation ' 输出:00小时00分钟03秒
End Sub
二、关键说明
1. 为什么优先推荐 Timer
函数?
- 精度更高
:
Timer
返回毫秒级时间(如52200.123
秒 = 14:30:00.123),而Now
仅到秒级(无毫秒)。 - 计算简单
:直接用
结束时间 - 开始时间
得到总秒数,无需处理日期转换。
2. 跨午夜问题处理
Timer
函数在“当天午夜”会重置为 0
(例如23:59:59时返回 86399.999
,00:00:00时返回 0
)。若代码运行跨午夜(如23:59开始,00:01结束), endTime - startTime
会出现负数,需通过 duration = duration + 86400
修正(86400秒=24小时)。
3. 结果输出方式
-
MsgBox
弹窗:适合手动运行代码,直观查看结果