请查看Randy Birch在microsoft.public.vb.general.discussion线程中的this回复。
他建议在.bas文件中创建一个名为MsgBox的函数。这样做将导致VB调用您的函数而不是内置函数。
然后,您将创建自己的MsgBox表单,并在其中设置定时器以在一定时间后关闭您的表单。他提供了显示如何执行此操作的链接。
他还讨论了一种显式调用内置MsgBox函数的方法,以防需要执行此操作。
注意:我从未这样做过,但我发现Randy Birch是一个知识渊博的资源。
MsgBox不能被编程关闭,因此关闭起来比较困难。如果你发现自己的设计必须强制关闭一个MsgBox,那么你应该重新评估你的设计。
我曾经有一个简单的答案:使用Windows脚本外壳对象,它具有“Popup”函数 - 一个消息框,就像VBA MsgBox()函数一样,具有“SecondsToWait”参数,可以提供你所需的超时时间。
With CreateObject("Scripting.WsShell")
.Popup "Watch me disappear in 5 seconds", 5, Application.Name & ": test", vbInformation + vbOkCancel
End With
如果您包含一个“取消”按钮,它可能仍然有效:可用的参数是vbOkCancel、vbYesNoCancel和vbRetryCancel。我可能错了,但是MsgBox是一个阻塞调用,创建了一个模态窗体,所以我不认为有一种简单的方法来实现这个选项。你有具体的使用案例吗?
与其从头开始编写替代Access MsgBox的代码,您可以考虑使用(或至少学习)Arvin Meyer的自定义消息框创建器(可在this page上下载)。
我曾经遇到过类似的问题;理论上你可以使用“SendKeys”函数(参见http://msdn.microsoft.com/en-us/library/8c6yea83%28VS.85%29.aspx)。然而,MsgBox会阻塞运行,因此您无法使用该命令。如果您知道它何时弹出,您可以从脚本中运行外部whshell等待一段时间,然后使用SendKeys。但是,如果您知道如何做到这一点,请告诉我(在这里)。另一个类似的可能性是为其打开不同的线程/进程,这将不会被阻止,但我不知道在VBA中是否可能。
消息框旨在向用户展示一些信息。因此,从程序上关闭它并不是一个好的设计,除非您没有自动化某个过程。
您可以使用sendkeys或win APIs。
我知道这是一篇旧文章,但似乎现在有一个新的简单方法来做到这一点:
Sub MessageBoxTimer()
Dim AckTime As Integer, InfoBox As Object
Set InfoBox = CreateObject("WScript.Shell")
'Set the message box to close after 10 seconds
AckTime = 10
Select Case InfoBox.Popup("Click OK (this window closes automatically after 10 seconds).", _
AckTime, "This is your Message Box", 0)
Case 1, -1
Exit Sub
End Select
End Sub
代码示例提供者:Tom Urtis
一个易于使用的基于Win32的答案,实际上是有用的。使用下面的代码,您可以轻松地进行基于计时器的弹出框。我喜欢1/2秒计时器控制,所以2=1秒。在查找此线程的答案时发现了这个答案。以上答案似乎不起作用。当我想要显示快速消息或快速答案时,我想使用它,默认情况下通常是正确的,也可以用于更多。
函数代码通常在模块中:
Declare Function MessageBoxTimeout Lib "user32.dll" Alias "MessageBoxTimeoutA" ( _
ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal uType As Long, _
ByVal wLanguageID As Long, _
ByVal lngMilliseconds As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public Function PopUpBox(Optional stMessage As String _
= "Yes or No? leaving this window for 1 min is the same as clicking Yes.", _
Optional stTitle As String = "PopUp Window", _
Optional HalfSecTimer As Long = 120, Optional lgVBmsgType As Long = vbYesNo) As Long
Dim RetVal As Long
HalfSecTimer = HalfSecTimer * 500
RetVal = MessageBoxTimeout(FindWindow(vbNullString, Title), stMessage, stTitle, lgVBmsgType, _
0, HalfSecTimer)
PopUpBox = RetVal
End Function
调用函数代码
示例:来自我的数据库的实际代码
PopUpBox "Re-Linking and Closing dB", "Closing dB", 3, vbOKOnly
intAnswer = PopUpBox("Software Lock Down Active?", "Security", 10, vbYesNo)
Title
是什么? - Andre