正文开始前,还是广告,扫一扫二维码,正版视频教材和30本电子教材全部拥有!赶紧行动啊! 注:视频在手机上不显示,如需查看请在电脑上输入:https://item.taobao.com/item.htm?id=521212444712 132 调用非模式窗体 在VBA中显示用户窗体需要使用Show方法,Show方法显示窗体对象,语法如下: [object.]Show modal 参数object是可选的,对象表达式。如果省略掉object,则将与活动的窗体模块相关联的窗体当作object。 参数modal是可选的,决定窗体是模态的还是非模式的。Modal参数的设置值如表格所示。 当窗体显示时是模态时,用户在使用应用程序的其它部分之前,必须先对其作出响应。在隐藏或卸载窗体之前,后续代码不会被执行。 比如下面的代码,希望在显示窗体的同时给单元格赋值,但因为窗体显示为模态的,在窗体没有关闭之前,给单元格赋值的代码是不会执行的,所以达不到显示窗体的同时给单元格赋值的目的。 Private Sub CommandButton1_Click() Dimi As Integer Columns(1).ClearContents UserForm1.Show0 Fori = 1 To 1000 Cells(i,1) = i Next End Sub只有在窗体显示为非模式时,后续代码才一出现即被执行。模态下是无法操作工作表的,所以应将第4行代码改成如下的代码,才能在显示窗体的同时给单元格赋值。 UserForm1.Show 0
▲133 进度条的制作 如果程序执行时间较长,使用进度条能让用户知道程序执行到何种程度,大约需等待多长时间,可以使界面显得友好。 133-1 使用进度条控件 使用窗体加进度条控件(ProgressBar)制作进度条是最常用的方法。 在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个进度条控件,调整为合适的大小。 在工作表中添加一个命令按钮,双击后写入下面的代码。 Private Sub CommandButton1_Click() Dimi As Integer UserForm1.Show0 WithUserForm1.ProgressBar1 .Min = 1 .Max = 10000 .Scrolling = 0 For i = 1 To 10000 Cells(i,1) = i .Value = i UserForm1.Caption = '正在运行,已完成' & i / 100 & '%,请稍候!' Next EndWith UnloadUserForm1 Columns(1).ClearContents End Sub 代码解析: 工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。 第3行代码,使用Show方法显示进度条控件所在的窗体,并且设置为无模式显示,请参阅▲132 。 第5、6行代码,设置进度条控件的最小值和最大值,应与第8行代码中的循环计数器的start参数和End参数相一致。 第7行代码,设置进度条控件显示为有间隔的。如果将Scrolling属性设置为1则显示为无间隔的。 第9行代码,在单元格中进行无意义的填充数据以演示进度条。在实际应用中可以将进度条嵌入到程序的循环中。 第11行代码,在窗体的标题栏中显示已完成的百分比。 第14行代码,使用Unload语句卸载窗体。 Unload 语句从内存中删除一个对象,语法如下: Unload object 参数object参数是必需的,一个有效的对象。 第19行代码,清空A列填充的数据。单击工作表中的命令按钮,填充单元格并显示进度条。 133-2 使用标签控件 在窗体中使用标签可以制作双色的进度条。 步骤1,在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个框架控件,在框架控件中添加两个标签控件。 步骤2,在控件的属性窗口中将框架的BackColor属性设为&H000000FF&,使框架的背景色为红色。将标签1的BackColor属性设为&H0000C000&,使标签1的背景色为绿色。将标签2的BackStyle属性设为fmBackStyleTransparent,使标签2的背景为透明,并把它们的Caption属性全部设置为空白。 步骤3,将窗体和控件调整为合适的大小。 步骤4,在VBE中双击窗体,写入下面的代码。 Private Declare Function DrawMenuBar Lib'user32' (ByVal Hwnd As Long) As Long Private Declare Function GetWindowLong Lib'user32' Alias 'GetWindowLongA' (ByVal Hwnd As Long,ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib'user32' Alias 'SetWindowLongA' (ByVal Hwnd As Long,ByVal nIndex As Long,ByVal dwNewLongAs Long) As Long Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' (ByVal lpClassName As String,ByVal lpWindowName As String) As Long Private Const GWL_STYLE As Long = (-16) Private Const GWL_EXSTYLE = (-20) Private Const WS_CAPTION As Long = &HC00000 Private Sub UserForm_Initialize() DimIStyle As Long DimHwnd As Long If Val(Application.Version)< 9 Then Hwnd = FindWindow('ThunderXFrame',Me.Caption) Else Hwnd = FindWindow('ThunderDFrame',Me.Caption) EndIf IStyle= GetWindowLong(Hwnd,GWL_STYLE) IStyle= IStyle And Not WS_CAPTION SetWindowLongHwnd,GWL_STYLE,IStyle DrawMenuBarHwnd UserForm1.Height= 28 End Sub 代码解析: 窗体的初始化事件,在窗体加载时使用API函数去除其标题栏。 第1行到第7行代码,API函数的声明。 第11行到第15行代码,获取窗口句柄。 第16行到第19行代码,去除窗体标题栏。 第20行代码,设置窗体的高度。 步骤5,在工作表中添加一个命令按钮,双击后写入下面的代码。 Private Sub CommandButton1_Click() Dimn As Integer Dimi As Integer n =10000 WithUserForm1 .Show 0 For i = 1 To n Cells(i,1) = i .Label1.Width = i / n * .Frame1.Width .Label2.Caption = '已完成' & Round(i / n * 100,0) & '%' .Label2.Left = .Label1.Width - 50 DoEvents Next EndWith UnloadUserForm1 Range('A1:A'& n).ClearContents End Sub 代码解析: 工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。 第4行代码,设置循环最大值,可根据实际需要设置。 第6行代码,使用Show方法显示窗体,并且设置为无模式的。 第8行代码,在单元格中进行无意义的填充数据以演示进度条。 第9行代码,根据程序运行程度动态设置标签1的宽度,使之达到进度条的效果。 第10行代码,标签2显示已完成百分比。 第11行代码,根据标签1的宽度动态设置标签2的Left属性,使已完成百分比跟随标签1移动。 第12行代码,使用DoEvents函数转让控制权。DoEvents函数将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys队列中的所有键也都已送出之后,返回控制权。如果不使用DoEvents函数转让控制权,进度条不能正常显示。 第15行代码,使用Unload语句卸载窗体。单击工作表中的命令按钮,填充单元格并显示进度条。
|
|