当您的程序需要很长时间来执行时,有必要使用进度条来显示程序执行的状态。
进度条设计
打开VBE并插入用户表单。
1.在“属性”窗口中,命名用户表单urfProgress。
2.将其ShowModal属性设置为False,这样当用户表单打开时,程序可以继续运行。
3.将用户表单调整到合适的大小(高度110*宽度240)。
经过适当的设置后,表示进度条的当前用户表单如下图1所示。
图1
在用户表单中插入一个标签控件,以显示指示程序状态的文本。在属性窗口中,将其命名为lblCaption。调整标签的大小,以便有足够的空间容纳要显示的文本。这里,将其Width属性设置为174,并将caption属性设置为空(即没有文本)。此时,表示进度条的用户表单如下图2所示。
图2。
接下来,在用户表单中插入一个框架控件。使框架在水平和垂直方向上大致位于用户表单的中心,并在之前添加的标签下方,如下图3所示。
图3。
设置框架的属性。将其命名为fraProgress,将其Caption属性设置为空(即无文本),并将其SpecialEffect属性修改为“2-fmspecial effect dependent”。此时,表示进度条的用户表单如下图4所示。
图4
然后,插入另一个标签。标签中不会显示任何文本,但是随着程序的运行,标签的长度会增加,以填充刚刚创建的框架。
1.插入一个标签并将其放入新创建的框架中,调整大小使其与框架一致,如下图5所示。
图5
2.命名标签lblProgress。
3.将其标题属性修改为空白(即没有文本)。
4.将它的BackColor属性修改为您想要的颜色。
5.将其SpecialEffect属性修改为“1-fmspecialeffectpassed”。
此时,表示进度条的用户表单如下图6所示。
图6
编写程序
隐藏标题栏
在VBE中插入一个标准模块,并使用Windows API输入以下代码来隐藏用户表单的标题栏:
GWL公共警察局_STYLE=-16
公共常量WS_CAPTION=HC00000
#如果VBA7那么
公共声明函数
lib“user 32”别名“GetWindowLongA”(_
ByVal hWnd As Long,_
ByVal nIndex As Long) As Long
公共声明PtrSafe函数SetWindowLong _
lib“user 32”别名“SetWindowLongA”(_
ByVal hWnd As Long,_
ByVal nIndex As Long,_
ByVal dwNewLong As Long) As Long
公共声明函数DrawMenuBar_
lib“user 32”(_
一样长)
公共声明PtrSafe函数FindWindowA_
lib“user 32”(由VallpClassName作为字符串,_
ByVal lpWindowName As String)一样长
#否则
公共声明函数GetWindowLong _
lib“user 32”别名“GetWindowLongA”(_
ByVal hWnd As Long,_
ByVal nIndex As Long) As Long
公共声明函数SetWindowLong _
lib“user 32”别名“SetWindowLongA”(_
ByVal hWnd As Long,_
ByVal nIndex As Long,_
ByVal dwNewLong As Long) As Long
公共声明函数DrawMenuBar _
lib“user 32 ”(
一样长)
公共声明函数FindWindowA _
lib“user 32 ”(ByVal lpclass name As String,_
ByVal lpWindowName As String)一样长
#结束如果
子隐藏标题栏(作为对象)
昏暗的灯光一样长
将lFrmHdl调暗为长
lFrmHdl=FindWindowa(VBnullString,frm。标题)
lngWindow=GetWindowLong(lFrmHdl,GWL_STYLE)
lngWindow=lngWindow And(非WS_CAPTION)
调用SetWindowLong(lFrmHdl,GWL_STYLE,lngWindow)
调用DrawMenuBar(lFrmHdl)
末端接头
用户表单初始化
在用户表单urfProgress中,添加初始化事件代码:
私有子用户表单_初始化()
我。身高=我。高度10
隐藏标题栏。隐藏标题栏我
末端接头
显示进度栏。
本文的示例通过遍历工作表中所有使用过的行来更新进度条:
子演示进度()
模糊如龙
昏暗的灯光和长长的一样
将百分比调成单一
lngLastRow=范围(“A”行)。计数)。结束(xlUp)。排
进度条的宽度从0开始。
URF progress . lblpprogress . width=0
urfProgress。显示
对于i=1至lngLastRow
pct=i/lngLastRow
计算进度条的百分比并增加相应的宽度。
使用urfProgress。LBL选项。标题=行“处理内存”中的行“我”。
. lblpprogress . width=pct *(fraprogress . width)
以…结尾
DoEvents
你可以在这里插入真正想执行操作的程序。
如果进度完成,请卸载用户表单。
如果i=lngLastRow,则卸载曲面进度
接下来我
末端接头
运行程序后的效果如下图7所示。
图7
上面的例子表明,当程序中有一个循环时,进度条会在执行循环过程时显示。但是如果没有循环呢?您还可以模拟程序执行的进度:
子演示进度2()
开始显示进度条。
URF progress . lblpprogress . width=0
urfProgress。显示
模拟完成进度。
最近更新(0)
放置程序代码。
模拟完成进度。
最近数据(0.25)
放置程序代码。
模拟完成进度。
最近数据(0.5)
放置程序代码。
模拟完成进度。
最近数据(0.75)
放置程序代码。
模拟完成进度。
最近(1)
卸载表单,即关闭进度条。
卸载urfProgress
EndSub
子最近(单次完成)
使用urfProgress。LBL caption . caption=pct done * 100%完成。
. lblpprogress . width=pct done *(fraprogress . width)
以…结尾
DoEvents
末端接头
如果过程占用大量资源,您可能会发现进度条没有更新或显示为白色。在这种情况下,您可以在结束于之前添加代码:
urfProgress。重新油漆
强制VBA重新绘制进度条,以便每次更改用户表单时都会更新进度条。