2017-08-15 322 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来相应地调整它。 –