在Outlook 2013模块中将此测试程序与其他帖子拼凑在一起,其中应显示一个弹出框,然后在3秒后自动关闭。问题是它永远不会关闭。
Sub MessageBoxTimer()
Dim AckTime As Integer, InfoBox As Object
Set InfoBox = CreateObject("WScript.Shell")
AckTime = 3
Select Case InfoBox.Popup("Click OK (this window closes automatically after 3 seconds).", _
AckTime, "This is your Message Box", 0)
Case 1, -1
Exit Sub
End Select
End Sub
答案 0 :(得分:6)
一些研究表明,这可能是某些MS Office应用程序中的错误。我的理由是,this和this似乎没有说任何暗示您以错误的方式使用命令的事实,this显示其他用户已经设法准确地使用此代码。
我在使用Office 365运行Excel的Windows PC上对此进行了测试,并且遇到了与您相同的问题 - 显示了消息框,但未关闭。我找到了一个建议的解决方法here,您可能会对该页面上的讨论感兴趣(特别是一位用户尝试向Microsoft提交有关VBA的错误报告)。由用户提出的解决方案是通过声明外部函数来调用本机user32.dll - this页面提供了一些如何使用VBA调用C dll的示例.MessageBoxTimeout据说微软没有记录这个函数,但是你可以找到很多关于它的函数here。
另一个对我有用的选项是使用mshta.exe运行对Shell.Popup的vbscript调用:
Function Test()
Dim Shell
Set Shell = CreateObject("WScript.Shell")
Shell.Run "mshta.exe vbscript:close(CreateObject(""WScript.shell"").Popup(""Test"",3,""Message""))"
End Function
要使其能够处理更复杂的消息,您可能需要转义一些字符。还有另一个SO问题here,它显示了mshta在shell /控制台中执行vbscript的能力的其他用途。
最后,正如一个用户所建议的那样,您可以简单地创建一个自定义用户表单,其中包含一个向下计数然后自行关闭的doevents循环。
答案 1 :(得分:1)
是的,我可以确认结果:WsShell.Popup功能上的'Timeout'不再在Office中运行。
我花了一段时间才注意到,因为带有“取消”按钮的弹出式对话框似乎受影响较小。所以这可能是一个可用的解决方法:
Dim msg AS String
Dim Title as String
msg ="Click 'Ok' or 'Cancel' (this window closes automatically after 3 seconds)."
Title = Application.name & ": Message Box test"
Select Case InfoBox.Popup(msg, AckTime, Title, vbQuestion + vbOkCancel)
如果这不起作用,您将需要a much longer explanation:使用API计时器回调重新实现'超时'。作为这个答案的作者,我应该警告你,这是在使用大锤在试图完成长期海军轰炸任务后破解坚果。
答案 2 :(得分:1)
WScript.Shell .Popup在Office VBA中似乎受到打击或错过。
如果您正在寻找可在Office VBA中使用并支持超时的MsgBox,我发布了另一种使用 Windows API 调用的方法。它支持超时,回车和返回值。 You can find the code at this link。我不认为在这里再次张贴是不适当的礼节。
请注意,@ Orphid提到的 mshta 方法不支持回车,并且始终在主监视器上显示该消息。