我正在尝试学习如何使用带有用户表单的进度条。
我的代码问题是,它在运行循环后显示进度条;它应该在显示进度条时运行循环,而不是像10%...... 20%...... 30%...... 40%...... 100%。
任何人都可以帮我修改我的代码来实现这个目标吗?
'-----Below is loop-----------------------------------------------------
Sub looprange()
Dim r As Range
'----------loop thru 0 to 9 ---------------
For Each r In Sheet6.Range("j2", Range("j" & Rows.Count).End(xlUp))
Sheet6.Range("i2").Value = r.Value
ActiveWindow.ScrollRow = 11
Application.CutCopyMode = False
Call print_jpeg
Next r
MsgBox "done"
End Sub
-
'--------Below is vba code in userform :------------
Private Sub UserForm_Activate()
Dim remainder As Long
Dim i As Long, j As Long
Call looprange
remainder = 0
For i = 1 To 200
UserForm1.Label2.Width = UserForm1.Label2.Width + 1
If i Mod 2 = 0 Then
remainder = remainder + 1
UserForm1.Caption = remainder & ” % complete”
UserForm1.Label2.Caption = remainder & “%”
End If
For j = 1 To 600
DoEvents
Next j
Next i
MsgBox “Loading of program complete.”
Unload UserForm1
End Sub
答案 0 :(得分:2)
我认为标准VBA中没有包含真正的状态栏(没有引用),但是您可以滥用标签控件。请注意,此方法为了用户清晰度而交换性能(用户可以看到应用程序正在运行,但它比没有状态栏的同一应用程序慢)
只需添加三个标签,一个用于状态文本,一个用于实际移动条,一个用于完整条形边框。并格式化它们以适合您的应用程序(见下图):
以下代码:
Private Sub cbStart_Click()
one_percent_bar_width = lLoadBar.Width / 100 'width of one percent of the total loading bar
max_numbers = 1000 'only for demo purpose
Me.lLoadingBar.Visible = True
For i = 0 To max_numbers 'your loop here
'your code here
percentage = i / max_numbers * 100 'calculation of progress, replace i and max_numbers to fit your loop
Me.lStatus.Caption = percentage & "% complete" 'status percentage text
Me.lLoadingBar.Width = percentage * one_percent_bar_width 'width of actual blue bar
DoEvents 'slows down code but only way to make the bar visibly move, tradeoff between user clarity and speed
Next i 'edit to fit your loop
Me.lStatus.Caption = "Complete!" 'adjust status to whatever you want
End Sub
Private Sub UserForm_Initialize()
Me.lLoadingBar.Visible = False 'hide the small blue bar
Me.lStatus.Caption = "Progress not started" 'adjust status to whatever you want
End Sub
答案 1 :(得分:1)
您的代码存在一些问题,但是为了专注于进度条部分,我将分享一种处理Excel中进度条的方法示例(使用内置状态栏)。
这个例子暂停了循环之间的分秒,而不是实际做任何有用的事情,但是在状态栏上报告状态。)希望它会给你一些想法。
Sub ProgressBarTest()
Const LoopsToRun = 500
Dim z As Integer
For z = 1 To LoopsToRun
'put a random number in A1
Range("A1") = Int(Rnd() * 100) + 1
'update status bar
Application.StatusBar = "Progress: " & Format((z / LoopsToRun), "0.0%")
'pause for .3 seconds (instead of pausing, you'd run your actual procedure here)
Pause (0.1)
Next z
Application.StatusBar = "Complete!"
End Sub
Sub Pause(sec As Single)
'pauses for [sec] second
Dim startTime As Single
startTime = Timer
Do While Timer < startTime + sec
DoEvents
Loop
End Sub
答案 2 :(得分:0)
VBA有一个进度条控件,可以添加到表单中。在学习的过程中,您只需将此控件添加到表单中,然后在执行有用表单功能的循环期间更新该控件。进度条控件包括有用的属性,例如min和max。
如果您在表单中执行多项操作,则可以更新标签以告知用户正在进行的操作以及进度。
[更高级]在我以前的一些工作中,我已经设置了VBA例程以在后台运行并使用事件创建了一个进度条表单。这允许使用进度语句以及百分比运行的更复杂的视图。但这种形式的基础仍然是进度条控制。虽然使用事件更复杂,但它允许我创建一个可以由我的任何vba函数使用的更通用的进度条形式,然后这些函数不受我对表单所做的任何更改的影响,因为事件充当了一种标准接口