2

我想我已经在整个互联网上搜索了一个简单的进度条,但我找不到在功能/子完成后取得进展的进度条。

我将在下面的代码中演示我想要的。我在 VBA 方面的知识是基本的也可以制作这样的东西。

我有一个带有按钮的表单,当我单击该按钮时,他应该执行以下操作:

Sub program()

progressbarform.show

Call function1
"set progressbar to 20%"

Call funcion2
"set progressbar to 40%"

Call function3
"set progressbar to 100%"

"Unload progressbar form"

End Sub
4

5 回答 5

6

您可以使用委托来完成这项工作。您的进度条与您执行功能 1、2 和 3 的形式不同,因此您应该尝试在进度条形式中执行。调用 form.Show 后,表单具有焦点,函数 1,2 和 3 在表单关闭之前不会运行。

在您的进度条表单中(假设它有一个标签和一个进度条控件)放置一个将更新您的进度条的函数:

Public Sub UpdateProgress(intProgress As Integer, Optional strMessage As String)

    If Not IsMissing(strMessage) Then
        lbl_Progress.Caption = strMessage
    End If
    pb_Progress.Value = intProgress
    Call Me.Repaint

End Sub

然后,您可以从进度条表单中执行您的功能。您可以通过将调用它的表单设置为对象来公开您的函数或仅将函数 1,2 和 3 存储在进度条表单中来做到这一点。

Sub RunFunctions()

    UpdateProgress 0, "Starting functions"    

    UpdateProgress 10, "Begin function1"    
    Call function1
    UpdateProgress 30, "Finished function1"  

    UpdateProgress 50, "Begin function2"    
    Call function2
    UpdateProgress 70, "Finished function2"  

    UpdateProgress 90, "Begin function3"    
    Call function3
    UpdateProgress 100, "Finished function3"

    UpdateProgress 100, "Finished All Functions"

End Sub

如果您需要帮助进行设置,请向我提问。

于 2013-03-15T14:28:48.883 回答
2
Sub program()

UserForm1.ProgressBar1.Min = 0
UserForm1.ProgressBar1.Max = 100
UserForm1.ProgressBar1.Value = 0

UserForm1.Show vbModeless

Call function1
UserForm1.ProgressBar1.Value = 20

Call funcion2
UserForm1.ProgressBar1.Value = 40

Call function3
UserForm1.ProgressBar1.Value = 100

End Sub
于 2013-03-15T14:59:49.973 回答
1

您的示例代码将起作用。

当您执行您的子程序时,代码会按顺序运行。所以当function1被调用时,下面的代码在完成之前不会执行function1,所有其他函数也是如此。

最大的问题可能是在表单上添加进度条控件。我试过(很快),但由于图书馆没有注册,它不会让我添加一个。

您可以使用标准控件创建一个虚假的进度条。

于 2013-03-15T14:10:47.763 回答
1

我不知道我的回答是否有帮助,但我在我的主 vba 中制作了进度条,我没有任何循环。希望这能有所帮助。

我认为为了使用用户表单,您必须先在此处放置一些东西来激活用户表单,所以 probar-----(第二个子的名称)在这里激活此用户表单。代码如下:

Private Sub UserForm_Activate()

progbar

End Sub

第二个 sub 完全是空的,只有 sub 和 end sub,我把它放在模块 1 中,这是一个空白模块。

Sub probar()
' leave this macro blank.

End Sub

最后,在您的主 vba 中,您可以选择百分比是多少以及要显示条形的时间,而不是循环,您只需自己更改百分比和条形长度,将代码放在这些百分比之间,这就是我让它工作。

Public Sub Mainprogram()

'your code Part 1 blah blah blah

UserForm1.Text.Caption = "10% Completed"
UserForm1.bar.Width = 20
UserForm1.Show vbModeless
DoEvents

'your code Part 2 blah blah blah

UserForm1.Text.Caption = "50 % Completed"
UserForm1.bar.Width = 100
Application.Wait (Now + TimeValue("0:00:01"))
DoEvents

'your code Part 3 blah blah blah

UserForm1.Text.Caption = "100 % Completed"
UserForm1.bar.Width = 200
Application.Wait (Now + TimeValue("0:00:01"))
DoEvents

End Sub
于 2018-07-12T04:40:16.850 回答
0

用 2 制作一个表格Labels,第一个是进度的颜色,另一个是 xx%

现在,在您的脚本进行的每一步中,都会更改两者的宽度,Labels因此左侧Label变得更宽,而右侧Label的左侧位置以相同数量的像素移动,并更新第二个标签的标题。当你在左边达到 100% 时,在右边保持足够的空间Label

于 2013-03-15T14:19:49.893 回答