2016-01-11 44 views
1

爲OnTime方法的一部分:SendKeys語句失敗,我使用下列步驟來執行

Public Sub Countdown() 
    ThisWorkbook.Activate 
    SendKeys ("{ESC}") 
    ThisWorkbook.Close False 
End Sub 

這裏的想法是要關閉工作簿,一旦某個時間段過去;並且如果工作簿處於編輯模式,則「SendKeys(」{ESC}「)」語句應該停用編輯模式。問題是它不這麼做!一旦我手動按下「ESC」按鈕,只有這樣我的程序纔會運行。 如果您能幫助我瞭解我在這裏做錯了什麼,我將不勝感激。

UPDATE: 繼@Jeeped的建議,我已經通過添加DoEvents線更新上面的代碼:

Public Sub Countdown()   
    ThisWorkbook.Activate 
    SendKeys ("{ESC}") 
    DoEvents 
    ThisWorkbook.Close False 
End Sub 

我所注意到的是,此過程的工作(而在編輯模式下)只有我只需按下創建的窗體控件按鈕即可手動運行它。 爲什麼不作爲代碼的一部分運行是我無法理解的。

+1

問題在於,當您處於編輯模式時,OnTime程序不會運行,因此它是Catch22。 – Rory

+0

@Rory,謝謝你把這個帶給我。我不知道!而且我很厭倦了這些Catch 22的東西......) 有沒有任何你知道的周而復始的方式? –

+1

您將需要Windows計時器 - 類似於Jaafar在此處發佈的代碼:http://www.mrexcel.com/forum/excel-questions/392397-problems-running-clock-worksheet-cell.html#post1956353 – Rory

回答

3

有時您需要允許應用程序處理其消息隊列。在SendKeys ("{ESC}")ThisWorkbook.Close False之間插入DoEvents

Public Sub Countdown() 
    ThisWorkbook.Activate 
    SendKeys ("{ESC}") 
    DoEvents 
    ThisWorkbook.Close False 
End Sub 
+0

感謝您的回覆,並建議使用DoEvents。不幸的是,這並不能幫助我解決問題。我仍然無法讓我的程序自動按下「ESC」按鈕來取消激活編輯模式... –

+1

在這種情況下,可能只是(在設計上)'代碼不會從任何內部進程運行'。這由'ThisWorkbook'表示。在您的其他代碼之前安排它作爲VBA中的獨立VBS WScript運行。 – Jeeped

+0

再次感謝!但我不得不承認,我並不真正瞭解VBS WScript是什麼,並希望瞭解如何在我的過程中實現這些內容的任何細節。 –