分享

VBA常用代码解析(第三十七讲)

 wdmexcel 2015-09-23

正文开始前,还是广告,扫一扫二维码,正版视频教材和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(i1) = 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(i1) = i

.Value = i

UserForm1.Caption = '正在运行,已完成' & i / 100 & '%,请稍候!'

Next

EndWith

UnloadUserForm1

Columns(1).ClearContents

End Sub

代码解析:

工作表中命令按钮的单击事件,在给工作表A1A10000单元格赋值的同时使用进度条显示其运行速度。

3行代码,使用Show方法显示进度条控件所在的窗体,并且设置为无模式显示,请参阅▲132

56行代码,设置进度条控件的最小值和最大值,应与第8行代码中的循环计数器的start参数和End参数相一致。

7行代码,设置进度条控件显示为有间隔的。如果将Scrolling属性设置为1则显示为无间隔的。

9行代码,在单元格中进行无意义的填充数据以演示进度条。在实际应用中可以将进度条嵌入到程序的循环中。

11行代码,在窗体的标题栏中显示已完成的百分比。

14行代码,使用Unload语句卸载窗体。

Unload 语句从内存中删除一个对象,语法如下:

Unload object

参数object参数是必需的,一个有效的对象。

19行代码,清空A列填充的数据。单击工作表中的命令按钮,填充单元格并显示进度条。

133-2 使用标签控件

在窗体中使用标签可以制作双色的进度条。

步骤1,在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个框架控件,在框架控件中添加两个标签控件。

步骤2,在控件的属性窗口中将框架的BackColor属性设为&H000000FF&,使框架的背景色为红色。将标签1BackColor属性设为&H0000C000&,使标签1的背景色为绿色。将标签2BackStyle属性设为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 LongByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib'user32' Alias 'SetWindowLongA' (ByVal Hwnd As LongByVal nIndex As LongByVal dwNewLongAs Long) As Long

Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' (ByVal lpClassName As StringByVal 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(HwndGWL_STYLE)

IStyle= IStyle And Not WS_CAPTION

SetWindowLongHwndGWL_STYLEIStyle

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(i1) = i

.Label1.Width = i / n * .Frame1.Width

.Label2.Caption = '已完成' & Round(i / n * 1000) & '%'

.Label2.Left = .Label1.Width - 50

DoEvents

Next

EndWith

UnloadUserForm1

Range('A1:A'& n).ClearContents

End Sub

代码解析:

工作表中命令按钮的单击事件,在给工作表A1A10000单元格赋值的同时使用进度条显示其运行速度。

4行代码,设置循环最大值,可根据实际需要设置。

6行代码,使用Show方法显示窗体,并且设置为无模式的。

8行代码,在单元格中进行无意义的填充数据以演示进度条。

9行代码,根据程序运行程度动态设置标签1的宽度,使之达到进度条的效果。

10行代码,标签2显示已完成百分比。

11行代码,根据标签1的宽度动态设置标签2Left属性,使已完成百分比跟随标签1移动。

12行代码,使用DoEvents函数转让控制权。DoEvents函数将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys队列中的所有键也都已送出之后,返回控制权。如果不使用DoEvents函数转让控制权,进度条不能正常显示。

15行代码,使用Unload语句卸载窗体。单击工作表中的命令按钮,填充单元格并显示进度条。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多