2016-01-16 121 views
2

您好我在Excel VBA下面的代碼,VBA - 關閉或單擊確定在MSGBOX從另一個工作簿,

Sub A() 
    Workbooks.open ("A.xls") 
    ActiveWorkbook.Worksheets("1").Select 
    ActiveSheet.CommandButton1.value = true 
End Sub 

我打開另一個工作簿(內部保護的代碼,所以我不能修改工作簿「B」),然後單擊工作表上的運行按鈕,並返回帶有OK按鈕的MsgBox。

我想知道我該如何使用VBA來關閉這個MSGBOX或單擊「確定」 ......我試圖用,

`application.DisplayAlert = false` 

打開工作簿「B」之前,但這個不起作用。 。

感謝您的幫助!

回答

1

可能有一種方法使用SendKeys - 但SendKeys是臭名昭着的氣質。這裏是一個更可靠的方法:

1)如果你不已經擁有了它舉辦這樣的,有按鈕的點擊事件處理程序1行子,看起來像:

Private Sub CommandButton1_Click() 
    Process 
End Sub 

其中Process是實際承擔繁重工作的子。總的來說,我認爲讓事件處理程序主要用作調度員來執行這個操作是個好主意。

2)更改Process代碼(或任何你選擇將它命名),以下列方式:

一)修改的第一行看起來像

Sub Process(Optional Verbose As Boolean = True) 

b)如果Process有像

MsgBox "Processed!" 

通過

更換

3)在代碼你上述給,更換線

ActiveSheet.CommandButton1.value = true 

由線

Application.Run "A.xls!Process", False 

這種方法將完全繞過按鈕並運行該按鈕通常觸發碼,但在靜音模式下運行它。

開編輯:要使用SendKeys您可以執行以下操作。放線

Application.SendKeys "~" 

前行

ActiveSheet.CommandButton1.value = True 

~Enter字符快捷方式。 SendKeys本身不會發送按鍵,而是將某些內容放在Windows Message Queue上。 VBA沒有任何直接控制此消息的處理時間。在這種情況下,缺乏控制是一種好處。VBA解釋器移到下一行,觸發MsgBox。在處理SendKeys消息時,消息框上的默認按鈕Okay具有焦點,因此接收到輸入密鑰。這甚至可能在盒子被塗上之前發生,使得MsgBox似乎永遠不會存在 - 但是在你有時間看到它之前,最好把它看作是被破壞的。

之所以需要在單擊該按鈕的行之前有SendKeys行,是因爲一旦出現消息框,它就會導致VBA解釋器等待它關閉 - 因此調用代碼將暫停其直到消息框關閉後才執行,因此SendKeys只有在不再需要時纔會被處理。我不太相信SendKeys。我懷疑有時當你運行代碼時,會出現消息框之前,新激活的工作表中的A1將收到回車鍵(將選擇從A1轉移到A2)。我不確定是否會發生這種情況,但是如果解決辦法可能是將SendKeys移動到VBScript程序。在點擊按鈕之前啓動該程序(使窗口最小化並且不等待返回)。 VBScript程序在使用SendKeys之前可以暫停0.5秒。該腳本將在不同的線程中運行,因此它不會被消息框阻止。

+0

嘿,約翰,我生成MsgBox的「B」文件就像一個黑盒子,我無法控制它,我只從該文件調用一個小函數,因爲輸出將用在我的主文件中擅長其他一些功能。它只是當「B」文件調用完成後,它給了我一個惱人的MsgBox彈出告訴我,過程完成..我想自動點擊「確定」繼續前進...... – lukieleetronic

+0

哇,我找到了一個如果我在調用VBA函數之前發送application.sendkeys「〜」,MsgBox永遠不會出現......但爲什麼? – lukieleetronic

+0

@lukieleetronic我添加了我認爲是正在發生的事情的解釋。 SendKeys解決方案很少令人滿意,但有時它們是不可避免的。 –

相關問題