2016-11-22 286 views
1

所以,我正在使用一個相當大的Excel工作表。我創建了很多功能,因爲它非常複雜。當我告訴它執行它需要相當長的時間。我已經創建了(在圖片上所示),一個計時器,講述了一個如何將票價的過程中就已經到來:在Excel VBA中暫停/恢復循環(點擊)

Screenshot of Counter

現在。我非常想製作一個暫停按鈕。我曾嘗試過:

Private Sub PauseButton_Click() 
Application.Wait Now() + TimeValue("00:00:20") 
End Sub 

究竟哪個實際上暫停了這個過程。我最初的想法是輸入一個非常大的數字,然後點擊按鈕恢復。不幸的是我無法恢復(DoEvents)這個過程,因爲Excel似乎完全凍結了輸入的時間段。

如果您對如何解決這個問題有任何想法,他們將大大appriciated。

+0

要「暫停」並不是一件容易的事,你可能會想。首先:'Application.Wait'將始終凍結應用程序(如您所注意到的)。要做到這一點,你需要跳過/結束子,並重新開始恢復。擁有一個或多個(全局/靜態)變量來告訴過程何處「恢復」(簡單地說不是從頭開始)會給人一種暫停的「感覺」。但是這需要你改變代碼中更大的部分......你可以用一個'DoEvents'循環來模擬暫停,但是如果你試圖用一個新的開始結束從0% –

回答

2

好吧,關於我們沒有窗體代碼的視圖,您可以嘗試聲明一個公共布爾值b_pause,它告訴您是否已暫停。並寫這樣的事:

public b_pause as boolean 

sub RunMe 
    b_pause = True 
    Do While b_pause 
     DoEvents 
    Loop 
End sub 

Sub StopMe() 
    b_pause = False 
End Sub 
+1

感謝您的回答!這很有道理,我可以在我的兩個大循環中添加條件,並在每次迭代後檢查它的值。但是,我在哪裏聲明瞭一個公共布爾值?在一個新的模塊中作爲一個子(fx sub declarePublics)? – bgaard

+0

公共變量在函數和子外部聲明。根據你編碼的方式,創建一個模塊,你只需聲明公共變量,在那裏沒有任何子和函數,這可能是一個好主意。 – Vityata

+1

它就像一個魅力!雖然RunMe函數實際上在StopMe恢復時暫停程序。不知道爲什麼,但我三重檢查了一切,老實說重要的是它的工作原理。所以非常感謝你!如果有人需要這篇文章,那麼布爾必須被定義爲'public b_pause as Boolean'。儘管如此 – bgaard