2012-11-29 69 views
3

我有一個VBA子程序,用於調用其他人寫入的子程序。偶爾,另一個子打開一個確定按鈕的MsgBox。另一個小組需要很長時間才能運行,我稱它爲數百次,所以我希望能夠在一夜之間運行。不幸的是,我找不到一種方法來自動在MsgBox上單擊「確定」。從VBA中的另一個子程序中取消MsgBox

我已經試過

Application.DisplayAlerts = False 

但這不會取消消息框。

有沒有辦法做到這一點?

謝謝

+0

對此問題的回答可能會幫助您:http://stackoverflow.com/a/682732/493055 –

+0

難道你不能編輯其他的子刪除msgbox調用嗎? –

+0

它受密碼保護。我想我可以問一下,弄清楚是誰寫的。 – Eric

回答

2

這樣做的一種方法是稍微修改原始子代碼。你將需要有堅韌的必要權限...

  • 通過在年底額外optinal參數投擲的默認值設置爲True修改原始子的頭。這將導致類似Sub OriginalSubName(原設定的參數, Optional ShowMessages = True)
  • 在其中MSGBOX被稱爲點,修改代碼是這樣的:

    If showMessages = True Then 'The = True part is important here - see below. 
    showMessages is a Variant type 
        'The original statement that calls the msgBox 
    End If 
    
  • 保留原始分不變的代碼的其餘部分

  • 通過將False作爲額外參數進行修改,修改您稱之爲原始子項的行。這導致OriginalSubName您的一組參數, False。這種方式默認情況下不禁止對話框,但是當你在你的sub中使用它的時候你會這樣做。

不知道爲什麼我使用可選的Variant類型參數?

  • 可選部分:這就避免了其他現有潛艇從當它們調用的修改後的子
  • VARIANT類型部分崩潰:任選參數是總是變型。這也是爲什麼你需要使用If showMessages = True Then而不是僅僅是If showMessages Then
+2

@ Bart:可選參數並不總是必須是Variant類型。他們通常是變體的原因是因爲你可以使用ISMISSING()函數來測試調用過程是否已經傳遞了可選參數的值。如果可選參數是Variant以外的類型,那麼不能使用ISMISSING()(它總是返回FALSE)。 –

相關問題