我用一个用户窗体上的进度条下面。它由框架内的标签组成;在开始时,标签的宽度为零,然后加宽,以100%完成填充框架。该标签没有文字,但它有一个BackColor属性设置为条形。框架右侧还有第二个progressText标签。要调用此函数,请使用如i = i + 1
和pctCompl = 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
而不是等待,您可以doevents,或label.zorder 0,或将标签放在一个相同大小的框架和frame.repaint中。也可以使用double而不是整数,因为vba不会对四舍五入数字和max'es感到困惑(如果你没有试试?1000 * 1000左右,在即时窗口中,小数字,但你会发生溢出错误)。为了避免代码变慢,我经常使用如果我mod 3 = 0然后affProgress,例如,但你可以改变值3来相应地调整它。 –