带有userform的Excel VBA进度条

时间:2018-01-01 10:07:32

标签: excel vba

我正在尝试学习如何使用带有用户表单的进度条。

我的代码问题是,它在运行循环后显示进度条;它应该在显示进度条时运行循环,而不是像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

3 个答案:

答案 0 :(得分:2)

我认为标准VBA中没有包含真正的状态栏(没有引用),但是您可以滥用标签控件。请注意,此方法为了用户清晰度而交换性能(用户可以看到应用程序正在运行,但它比没有状态栏的同一应用程序慢)

只需添加三个标签,一个用于状态文本,一个用于实际移动条,一个用于完整条形边框。并格式化它们以适合您的应用程序(见下图):image visualizing the VBA progress bar setup

以下代码:

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

更多信息herehere

答案 2 :(得分:0)

VBA有一个进度条控件,可以添加到表单中。在学习的过程中,您只需将此控件添加到表单中,然后在执行有用表单功能的循环期间更新该控件。进度条控件包括有用的属性,例如min和max。

如果您在表单中执行多项操作,则可以更新标签以告知用户正在进行的操作以及进度。

[更高级]在我以前的一些工作中,我已经设置了VBA例程以在后台运行并使用事件创建了一个进度条表单。这允许使用进度语句以及百分比运行的更复杂的视图。但这种形式的基础仍然是进度条控制。虽然使用事件更复杂,但它允许我创建一个可以由我的任何vba函数使用的更通用的进度条形式,然后这些函数不受我对表单所做的任何更改的影响,因为事件充当了一种标准接口