未公开的秘密花园--VBA中实现自动关闭消息框

用于显示提示信息,并且可以根据用户的不同选择执行不同的后续操作 。例如:使用如下消息框获取用户选择,如果点击“是”,则继续执行程序,如果点击“否”,则结束程序执行 。
但是这将带来一个问题,显示消息框时 , 代码过程将处于暂停状态 , 如果用户没有进行选择,后续代码无法执行 。
如果消息框只是提醒用户,并不需要获取用户的输入,那么使用可以自动关闭的消息提示框,可以避免程序暂停挂起,无法继续执行的问题,但是VBA中提供的无法实现自动关闭的功能 。下面介绍一个未公开的 API函数,可以完美实现自动关闭的消息框 。
示例代码如下:
#If VBA7 And Win64 ThenPrivate Declare PtrSafe Function MessageBoxTimeout Lib "user32" _Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, _ByVal lpText As String, _ByVal lpCaption As String, _ByVal wType As Long, _ByVal wlange As Long, _ByVal dwTimeout As Long) As Long#ElsePrivate Declare Function MessageBoxTimeout Lib "user32" _Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, _ByVal lpText As String, _ByVal lpCaption As String, _ByVal wType As Long, _ByVal wlange As Long, _ByVal dwTimeout As Long) As Long#End IfSub Demo1()' 只有确定按钮MessageBoxTimeout 0, "3 秒后自动关闭", "DEMO1", 0, 0, 3000MsgBox "VBA消息框", vbOKOnly, "DEMO1-VBA"End SubSub Demo2()' 三个按钮,第二按钮为默认MessageBoxTimeout 0, "3 秒后自动关闭", "DEMO2", 275, 0, 3000MsgBox "VBA消息框", vbDefaultButton2 + vbCritical + vbYesNoCancel, "DEMO2-VBA"End Sub
运行Demo1 , 依次显示如下两个消息框,第1个消息框3 秒后自动关闭 。
运行Demo2,依次显示如下两个消息框,第1个消息框3 秒后自动关闭 。
【代码解析】
第1~17行代码声明API函数 。

未公开的秘密花园--VBA中实现自动关闭消息框

文章插图
第2~8行代码是适用于64位系统的声明函数 。
第10~16行代码是适用于32位系统的声明函数 。
API函数的参数看似复杂,其实和VBA中的函数时类似的 。
参数含义对应参数
hwnd
窗口句柄
消息框提示信息
消息框标题
title
wType
消息框类型
函数扩展,通常为0
延迟关闭时间 , 单位毫秒
第25行代码中wType参数值为275 , 相当于下面三个VBA常量值的和 。
VBA常量常量值
256
16
在 VBA使用此API函数时,可以直接使用这些常量值,代码如下:
【未公开的秘密花园--VBA中实现自动关闭消息框】MessageBoxTimeout 0, "3 秒后自动关闭", "DEMO2", vbDefaultButton2 + vbCritical + vbYesNoCancel, 0, 10000