Excel 无循环的进度条

Excel 无循环的进度条,excel,vba,Excel,Vba,我想我已经在整个互联网上搜索了一个简单的progressbar,但是我找不到一个在函数/子函数完成后能够取得进展的 我将在下面的代码中演示我想要什么。我在VBA方面的知识就是做这样的事情 我有一个表单,有一个按钮,当我点击按钮时,他应该执行以下操作: Sub program() progressbarform.show Call function1 "set progressbar to 20%" Call funcion2 "set progressbar to 40%" Call f

我想我已经在整个互联网上搜索了一个简单的progressbar,但是我找不到一个在函数/子函数完成后能够取得进展的

我将在下面的代码中演示我想要什么。我在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

您的示例代码可以工作

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

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


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

制作一个带有2个
标签的表单,第一个是进度的颜色,另一个是xx%


现在,在脚本进行的每一步中,都会更改两个
标签的宽度
,这样左侧的
标签
会变宽,右侧的
标签
的左侧位置会移动相同数量的像素,并更新第二个标签的标题。当您达到左侧标签的100%时,请在右侧保留足够的空间。您可以使用委派来完成此操作。进度条与函数1、2和3的执行是分开的,因此您应该尝试在进度条表单中执行。调用表单后。显示表单具有焦点,函数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
然后可以从progressbar表单中执行函数。您可以通过将调用它的窗体设置为对象来公开您的函数,或者只在进度条窗体中存储函数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

如果您需要帮助设置,请问我任何问题。

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

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
我认为为了使用Userform,你必须先在这里放置一些东西来激活Userform,所以probar-----(第二个子项的名称)在这里激活这个Userform。代码如下所示:

Private Sub UserForm_Activate()

progbar

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


看看你是否可以调整一个现有的代码解决方案来满足你的需要——调用函数1:ProgressBar1.Value=25调用函数2:ProgressBar1.Value=40等等。我已经试过了,但没有用,也许我做得不对你在打开关注的表单后调用了你的函数,查看我的答案并让我知道您的想法:)查看一个关于如何在工作表上使用的示例。好主意,我理解它,但我不确定我是否可以对其进行编程。您可以具体说明您遇到的问题吗?当您有进度条控件可用时,我会尝试避免使用标签。蓝色,例如,我在列表中没有该控件,它是默认控件吗?它叫什么?右键单击控件框或转到工具>其他控件。您可以在Microsoft 6.0版的ProgressBar控件下找到它。它使用MsComCtl.ocx作为参考,可在所有使用Office 2000及更高版本的Pc上使用。嘿,谢谢你的回答,我马上就去试试。需要帮助时我会发表评论我在UpdateProgress0、sub或function上遇到错误未定义,但我将函数代码粘贴到了同一个用户Formit我的代码粘贴得很糟糕,UpdateProgress和整数之间没有空格,请立即尝试。还有一个问题。。如果我想更新一个函数中另一个模块的进度,怎么做?nvm我找到了。只需添加“userFrom1.Update…”调用
UserForm1.Show
在调用
function1,2,3
的同一个函数中,并重新绘制不会像UserForm1那样工作。Show将重点放在执行上,随后的
Call function1
在关闭或隐藏
UserForm1
之前不会执行@Blue:是的,所以我编辑了答案并添加了要显示的vbModeless参数:-)。现在将其设置为无模式更好。在Excel VBA中,这将只是UserForm1.Show False+1:)@Blue:是的,它也适用于'False',但使用常量更准确,代码更明显。Show方法有一个可选参数“modal”,可以是vbModal或vbModeless(VBA.FormShowConstants枚举)。如果使用“False”,则隐式转换会将“False”转换为与vbModeless相等的“0”。但是UserForm1.Show True不起作用,因为'True'被转换为'-1',而这不等于vbModal。但是模态是默认的,所以Show不需要用'True'调用。。。这将失败。所以我认为使用constatnt命名的值更好。@Blue:我不知道Excel 2010中存在这样的问题。谢谢你的信息!