有效利用VBA中OnTime方法实现倒计时设计

哈喽,大家好,上次我们利用了OnTime方法实现了数码管时钟的设计,感觉它还是蛮神奇的,不是吗?呵呵,当时我在视频里就说过,我准备利用这个方法继续推出有关倒计时的作品。鉴于对OnTime方法的痴迷,我设计了本期的倒计时作品,希望能够给予各位粉丝技术上的帮助,同时也是为了抛砖引玉哦,更感谢大家的厚爱哦!

好了,不废话了,我们还是以干货的形式给大家分享吧!

一、倒计时前端界面设计

倒计时黑屏幕、两个表单按钮。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图1 倒计时界面

二、倒计时后台窗体界面

插入6个组合框选择列表控件和2个命令按钮。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图2 后端窗体界面

三、倒计时功能代码实现

1、模块1代码:

Public TimeOn As Double ‘公有全局变量TimeOn为当前的瞬时时间,便于回传数据

Public flag As Boolean ‘公有全局变量flag为是否卸载关闭窗体的标志,便于回传数据

Public da_str, yr ‘公有全局变量da_str、yr分别为取得的日期串、取得的年号,便于回传数据

Sub main()

On Error Resume Next

Application.OnTime TimeOn, “开始倒计时”, , False

On Error GoTo 0

SelectDate_Time_Form.Show

If flag = False Then ‘凡是经过窗体点击了确定后,都强制性将flag置为False造成假象窗体未关闭

开始倒计时

Else

Exit Sub

End If

End Sub

Sub 开始倒计时()

Dim da As Date

da = VBA.CDate(da_str) ‘未来日期时间da

If da < Now Then ‘未来时间比当前时间早,则报错,终止程序运行

MsgBox “未来时间” & Format(da, “yyyy-m-d hh:mm:ss”) & “小于或迟于当前时间” & Now & “的错误,退出!”, vbInformation, “提示”

display_str = “距离 —-年–月–日【世界杯】运动会还有: – 年 — 个月 — 天” & Chr(10) & “剩余时间[–:–:–]” & Chr(10) & “当前时间:—-年–月–日 –:–:–“

Cells(1, 1) = display_str

Exit Sub

Else

TimeOn = Now + TimeSerial(0, 0, 1)

s = DateDiff(“s”, Now, da) ‘s首先取得在这个时间差内,以秒为单位的所有秒数

y = Int(s / 31536000) ‘一年按照365天换算算是【31536000】秒,取整强烈建 _

议用Int(s / 31536000)纯粹去小数非四舍五入的的整除而非s31536000这种纯 _

粹去小数非四舍五入的的整除,原因是s31536000容易发生数据溢出,以下类似

s = s – y * 31536000 ‘取得即将取“月”数所用的秒数

mon = Int(s / 2592000) ‘一月按30天换算算是【2592000】秒,非四舍五入取整得到月数mon

s = s – mon * 2592000 ‘取得即将取“天”数所用的秒数

d = Int(s / 86400) ‘一天换算是【86400】秒,非四舍五入取整得到天数d

s = s – d * 86400 ‘取得即将取“小时”数所用的秒数

h = s 3600 ‘一小时换算是【3600】秒,非四舍五入取整”s3600″(“s3600” _

针对短数据可以这样非四舍五入的整除)得到小时数h,以下解释类似

s = s – h * 3600 ‘取得即将取“分钟”数所用的秒数

m = s 60 ‘一分钟换算是【60】秒,非四舍五入取整得到分钟数m

s = s – m * 60 ‘取得最后零头“秒”数s

If y = 0 And mon = 0 And d = 0 And h = 0 And m = 0 And s = 0 Then

MsgBox “时间到!”, vbInformation, “提醒”

Cells(1, 1) = Format(da, “yyyy年”) & “世界杯欢迎您!”

Exit Sub

Else

h = IIf(h < 10, “0” & h, h)

m = IIf(m < 10, “0” & m, m)

s = IIf(s < 10, “0” & s, s)

display_str = “距离 ” & Format(da, “yyyy年m月d日”) & “【世界杯】运动会还有:” _

& y & ” 年 ” & mon & ” 个月 ” & d & ” 天” & Chr(10) & “剩余时间[” & h & “:” _

& m & “:” & s & “]” & Chr(10) & “当前时间:” & Format(Now, “yyyy年m月d日 hh:mm:ss”)

Cells(1, 1) = display_str

Application.OnTime TimeOn, “开始倒计时”, , True

End If

End If

End Sub

Sub 停止倒计时()

On Error Resume Next

Application.OnTime TimeOn, “开始倒计时”, , False

display_str = “距离 —-年–月–日【世界杯】运动会还有: – 年 — 个月 — 天” & Chr(10) & “剩余时间[–:–:–]” & Chr(10) & “当前时间:—-年–月–日 –:–:–“

Cells(1, 1) = display_str

On Error GoTo 0

End Sub

‘If y Mod 400 = 0 Or (y Mod 100 <> 0 And y Mod 4 = 0) Then 闰年–2月29天,否则平年–2月28天

Function Is_LeepYear(y) As Boolean ‘判断是否是闰年Leep year

If y Mod 400 = 0 Or (y Mod 100 <> 0 And y Mod 4 = 0) Then

Is_LeepYear = True ‘闰年

Else

Is_LeepYear = False ‘平年

End If

End Function

2、窗体代码:

Private Sub UserForm_Initialize() ‘窗体启动初始化

flag = False

year_ComboBox.Style = fmStyleDropDownList

month_ComboBox.Style = fmStyleDropDownList

day_ComboBox.Style = fmStyleDropDownList

hour_ComboBox.Style = fmStyleDropDownList

minute_ComboBox.Style = fmStyleDropDownList

second_ComboBox.Style = fmStyleDropDownList

month_ComboBox.Enabled = False

day_ComboBox.Enabled = False

hour_ComboBox.Enabled = False

minute_ComboBox.Enabled = False

second_ComboBox.Enabled = False

year_ComboBox.Clear

day_ComboBox.Clear

hour_ComboBox.Clear

minute_ComboBox.Clear

second_ComboBox.Clear

For i = 1900 To 9999 ‘年份选择列表初始化

year_ComboBox.AddItem i

Next

year_ComboBox.Value = 2025 ‘设定默认年份,并将选择焦点定格在年份选择列表

year_ComboBox.SetFocus

End Sub

‘窗体卸载关闭事件

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

flag = True

Cancel = False

End Sub

Private Sub ConfirmBtn_Click() ‘确定参数选择

yr = year_ComboBox.Value

mon = month_ComboBox.Value

dy = day_ComboBox.Value

h = hour_ComboBox.Value

h = IIf(h = “”, 0, h)

m = minute_ComboBox.Value

m = IIf(m = “”, 0, m)

s = second_ComboBox.Value

s = IIf(s = “”, 0, s)

If yr = “” Or mon = “” Or dy = “” Then

MsgBox “日期中“年、月、日”少选或未选,请重新选定!”, vbInformation, “提示”

year_ComboBox.Clear

For i = 1900 To 9999 ‘年份选择列表初始化

year_ComboBox.AddItem i

Next

month_ComboBox.Clear

day_ComboBox.Clear

hour_ComboBox.Clear

minute_ComboBox.Clear

second_ComboBox.Clear

year_ComboBox.Value = 2025

year_ComboBox.SetFocus

Else

da_str = yr & “-” & mon & “-” & dy & ” ” & h & “:” & m & “:” & s

Unload SelectDate_Time_Form

flag = False ‘强制性将flag置为False造成假象窗体未关闭

End If

End Sub

Private Sub CancelBtn_Click() ‘取消操作

Unload SelectDate_Time_Form

Exit Sub

End Sub

Private Sub year_ComboBox_Change() ‘选择年的时候,月份选择列表跟随初始化

month_ComboBox.Enabled = True

month_ComboBox.Clear

For i = 1 To 12

month_ComboBox.AddItem i

Next

End Sub

Private Sub month_ComboBox_Change() ‘选择月的时候,天数选择列表跟随初始化

i = month_ComboBox.Value

day_ComboBox.Enabled = True

Select Case i

Case 1, 3, 5, 7, 8, 10, 12: days_31

Case 4, 6, 9, 11: days_30

Case 2: days_29_Or_28

End Select

End Sub

Private Sub day_ComboBox_Change() ‘选择日的时候,小时选择列表跟随初始化

hour_ComboBox.Enabled = True

hour_ComboBox.Clear

For i = 0 To 23

hour_ComboBox.AddItem i

Next

End Sub

Private Sub hour_ComboBox_Change() ‘选择小时的时候,分选择列表跟随初始化

minute_ComboBox.Enabled = True

minute_ComboBox.Clear

For i = 0 To 59

minute_ComboBox.AddItem i

Next

End Sub

Private Sub minute_ComboBox_Change() ‘选择分的时候,秒选择列表跟随初始化

second_ComboBox.Enabled = True

second_ComboBox.Clear

For i = 0 To 59

second_ComboBox.AddItem i

Next

End Sub

Sub days_31() ‘月大–31天

day_ComboBox.Clear

For i = 1 To 31

day_ComboBox.AddItem i

Next

End Sub

Sub days_30() ‘月小–30天

day_ComboBox.Clear

For i = 1 To 30

day_ComboBox.AddItem i

Next

End Sub

Sub days_29_Or_28() ‘闰年2月份29天,平年2月份28天(例如2020年就是闰年)

day_ComboBox.Clear

If Is_LeepYear(yr) Then ‘闰年2月份天数

For i = 1 To 29

day_ComboBox.AddItem i

Next

Else ‘平年2月份天数

For i = 1 To 28

day_ComboBox.AddItem i

Next

End If

End Sub

四、倒计时运行测试界面

1、启动倒计时功能:点击“启动倒计时”按钮后,弹出选择日期时间的对话框选择。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图3 启动倒计时

2、选择日期时间:选择日期时间参数后点击“确定”命令按钮。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图4 日期时间参数选择

3、点击“确定”后的效果:执行确定命令后,开始倒计时。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图5 确定参数后的效果

4、时间到提示:时间到了会自然提示“时间到!”提示。如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图6 时间到提醒

5、点击上图的“确定”后,前端界面提示如下图所示。

有效利用VBA中OnTime方法实现倒计时设计

图7 倒计时到的前端提示

五、关键技术小结

1、判断闰年和平年的方法:If y Mod 400 = 0 Or (y Mod 100 <> 0 And y Mod 4 = 0) Then 闰年–2月29天,否则平年–2月28天

2、实现窗体上各组合框选择列表的跟随智能变化:类似如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图8 各组合框选择列表的跟随智能变化

3、充分利用Select Case语句实现各个月份天数的设定:如下图所示

有效利用VBA中OnTime方法实现倒计时设计

图9 各月份天数设定

好了,倒计时的完整设计的头条文章就分享到这里,希望大家多多点评和关注(“头条号:跟我学office高级办公”)哦!

来源:跟我学Office高级办公

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年7月1日
下一篇 2019年7月1日

相关推荐