如果程序执行时间较长,使用进度条能让用户知道程序执行到何种程度,大约需等待多长时间,可以使界面显得友好。
方法1、使用进度条控件
使用窗体加进度条控件(ProgressBar)制作进度条是最常用的方法。
在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个进度条控件,调整为合适的大小。
在工作表中添加一个命令按钮,双击后写入下面的代码。
#001 Private Sub CommandButton1_Click()
#002 Dim i As Integer
#003 UserForm1.Show 0
#004 With UserForm1.ProgressBar1
#005 .Min = 1
#006 .Max = 10000
#007 .Scrolling = 0
#008 For i = 1 To 10000
#009 Cells(i, 1) = i
#010 .Value = i
#011 UserForm1.Caption = "正在运行,已完成" & i / 100 & "%,请稍候!"
#012 Next
#013 End With
#014 Unload UserForm1
#015 Columns(1).ClearContents
#016 End Sub
代码解析:
工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。
第3行代码,使用Show方法显示进度条控件所在的窗体,并且设置为无模式显示。
第5、6行代码,设置进度条控件的最小值和最大值,应与第8行代码中的循环计数器的start参数和End参数相一致。
第7行代码,设置进度条控件显示为有间隔的。如果将Scrolling属性设置为1则显示为无间隔的。
第9行代码,在单元格中进行无意义的填充数据以演示进度条。在实际应用中可以将进度条嵌入到程序的循环中。
第11行代码,在窗体的标题栏中显示已完成的百分比。
第14行代码,使用Unload 语句卸载窗体。
Unload 语句从内存中删除一个对象,语法如下:
Unload object
参数object参数是必需的,一个有效的对象。
第19行代码,清空A列填充的数据。
单击工作表中的命令按钮,填充单元格并显示进度条。
方法2、使用标签控件
在窗体中使用标签可以制作双色的进度条。
步骤1,在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个框架控件,在框架控件中添加两个标签控件。
步骤2,在控件的属性窗口中将框架的BackColor 属性设为&H000000FF&,使框架的背景色为红色。将标签1的BackColor属性设为&H0000C000&,使标签1的背景色为绿色。将标签2的BackStyle属性设为fmBackStyleTransparent,使标签2的背景为透明,并把它们的Caption属性全部设置为空白。
步骤3,将窗体和控件调整为合适的大小。
步骤4,在VBE中双击窗体,写入下面的代码。
#001 Private Declare Function DrawMenuBar Lib "user32" (ByVal Hwnd As Long) As Long
#002 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
#003 Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#004 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#005 Private Const GWL_STYLE As Long = (-16)
#006 Private Const GWL_EXSTYLE = (-20)
#007 Private Const WS_CAPTION As Long = &HC00000
#008 Private Sub UserForm_Initialize()
#009 Dim IStyle As Long
#010 Dim Hwnd As Long
#011 If Val(Application.Version) < 9 Then
#012 Hwnd = FindWindow("ThunderXFrame", Me.Caption)
#013 Else
#014 Hwnd = FindWindow("ThunderDFrame", Me.Caption)
#015 End If
#016 IStyle = GetWindowLong(Hwnd, GWL_STYLE)
#017 IStyle = IStyle And Not WS_CAPTION
#018 SetWindowLong Hwnd, GWL_STYLE, IStyle
#019 DrawMenuBar Hwnd
#020 UserForm1.Height = 28
#021 End Sub
代码解析:
窗体的初始化事件,在窗体加载时使用API函数去除其标题栏。
第1行到第7行代码,API函数的声明。
第11行到第15行代码,获取窗口句柄。
第16行到第19行代码,去除窗体标题栏。
第20行代码,设置窗体的高度。
步骤5,在工作表中添加一个命令按钮,双击后写入下面的代码。
#001 Private Sub CommandButton1_Click()
#002 Dim n As Integer
#003 Dim i As Integer
#004 n = 10000
#005 With UserForm1
#006 .Show 0
#007 For i = 1 To n
#008 Cells(i, 1) = i
#009 .Label1.Width = i / n * .Frame1.Width
#010 .Label2.Caption = "已完成" & Round(i / n * 100, 0) & "%"
#011 .Label2.Left = .Label1.Width - 50
#012 DoEvents
#013 Next
#014 End With
#015 Unload UserForm1
#016 Range("A1:A" & n).ClearContents
#017 End Sub
代码解析:
工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。
第4行代码,设置循环最大值,可根据实际需要设置。
第6行代码,使用Show方法显示窗体,并且设置为无模式的。
第8行代码,在单元格中进行无意义的填充数据以演示进度条。
第9行代码,根据程序运行程度动态设置标签1的宽度,使之达到进度条的效果。
第10行代码,标签2显示已完成百分比。
第11行代码,根据标签1的宽度动态设置标签2的Left属性,使已完成百分比跟随标签1移动。
第12行代码,使用DoEvents函数转让控制权。DoEvents函数将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys队列中的所有键也都已送出之后,返回控制权。如果不使用DoEvents函数转让控制权,进度条不能正常显示。
第15行代码,使用Unload 语句卸载窗体。
单击工作表中的命令按钮,填充单元格并显示进度条。