2017-08-15 325 views
0

我有一些vba代碼,需要一分鐘左右才能在excel中運行,並且我試圖添加進度條或某種類型的等待屏幕以更好地向用戶顯示代碼仍然正確運行。我意識到ProgressBar只能在特定類型的代碼中顯示真實進度,而我認爲這些代碼不適用。在VBA中循環ProgressBar加載器

但是,我想知道是否有一種方法讓ProgressBar只是循環,一旦它完成,它從頭再次開始,直到我的代碼完成;與手機插入時的充電圖標類似。因此,激活我的代碼後,UserForm1將彈出並顯示一個重複的ProgressBar,並在完成我的代碼後,UserForm將Unload。

任何建議將有所幫助。

謝謝!

回答

0

enter image description here

我用一個用戶窗體上的進度條下面。它由框架內的標籤組成;在開始時,標籤的寬度爲零,然後加寬,以100%完成填充框架。該標籤沒有文字,但它有一個BackColor屬性設置爲條形。框架右側還有第二個progressText標籤。要調用此函數,請使用如i = i + 1pctCompl = 100 * i/iTotalNum這樣的循環,然後將其包含在循環中:progress pctCompl, "listing files",並且完成後,使進度條不可見:progress -1。您隨時可以使用pctCompl = 0將其重置爲0。

Sub progress(pctCompl As Integer, Optional msg As String) 
Dim increment As Double, i As Integer 
If pctCompl < 0 Then 
    If progressBar.Width < 0.9 * progressFrame.Width Then 
    progressBar.Width = progressFrame.Width 
    Application.Wait (Now + TimeValue("0:00:01")) 
    End If 
    progressText.Visible = False 
    progressFrame.Visible = False 
    Exit Sub 
Else 
    progressText.Visible = True 
    progressFrame.Visible = True 
End If 
progressText.Caption = pctCompl & "% " & msg 
progressBar.Width = progressFrame.Width * pctCompl/100 
DoEvents 
End Sub 

Private Sub UserForm_Activate() 
    progressFrame.Visible = False 
    progressText.Visible = False 
end Sub 
+0

而不是等待,您可以doevents,或label.zorder 0,或將標籤放在一個相同大小的框架和frame.repaint中。也可以使用double而不是整數,因爲vba不會對四捨五入數字和max'es感到困惑(如果你沒有試試?1000 * 1000左右,在即時窗口中,小數字,但你會發生溢出錯誤)。爲了避免代碼變慢,我經常使用如果我mod 3 = 0然後affProgress,例如,但你可以改變值3來相應地調整它。 –