2015-06-30 28 views
3

將此測試過程與其他帖子一起放在Outlook 2013模塊中,應顯示一個彈出框,然後在3秒後自動關閉。問題是它永遠不會關閉。InfoBox.Popup拒絕在計時器到期時關閉

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

看起來問題根本與Outlook沒有關係。 –

+0

請您詳細說明一下嗎? –

+1

我認爲這是所有Office應用程序的常見問題,而不僅僅是Outlook。至少我沒有看到任何涉及Outlook的對象。 –

回答

6

一些研究表明,這可能是一些MS Office應用程序中的錯誤。我基於這樣一個事實,即thisthis似乎沒有說任何暗示您以錯誤的方式使用該命令的事情,而this顯示其他用戶已經設法精確地使此代碼正常工作。

我在運行Office 365的Excel上測試了這一點,並且遇到同樣的問題 - 消息框顯示但未關閉。我發現了一個建議的解決方法here,並且該頁面上的討論可能對您有些興趣(特別是一位用戶對嘗試向Microsoft提交有關VBA的錯誤報告的描述)。這個由用戶提出的解決方案是通過聲明一個外部函數來調用本地user32.dll - this頁面有一些如何用VBA調用C dll的例子。MessageBoxTimeout函數據說是沒有Microsoft的文檔,但你可以找到很多有關它here

另一種選擇,這爲我工作,在運行一個VBScript調用與mshta.exe到Shell.Popup:

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/console中執行vbscript的能力的其他用途。

最後,正如一位用戶所建議的那樣,您可以簡單地使用doevents循環創建一個自定義用戶窗體,該窗體會倒數計算並關閉自身。

0

是的,我可以確認結果:WsShell.Popup函數上的「超時」在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​​計時器回調重新實現「超時」。作爲這個答案的作者,我應該警告你,在試圖用長時間的海軍轟擊任務之後,這是用大錘來攻擊一個堅果