分享

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

 wdmexcel 2015-09-14

106 多个文本框数据相加

在▲102 中,我们在TextBox1TextBox2中输入完数据后,利用文本框的Change事件使TextBox3显示其两者相乘的金额,但是如果窗体中有多个文本框,需要在每一个文本框的Change事件中写上相同的重复代码,因此使用类模块可以简化代码。

在附件的窗体有七个文本框,其中六个用来输入数据,一个用来显示其他六个文本框相加后的合计数,首先打开VBE,插入一个类模块建立一个类,类模块的名字就是类的名字修改为“cmds”,在类模块中输入下面的代码:

Public WithEvents cmdAs MSForms.TextBox

代码解析:

使用Public语句声明变量cmd是用来响应由TextBox对象触发的事件的对象变量。

在窗体的Initialize事件中写入下面的代码:

Dim col As New Collection

Private Sub UserForm_Initialize()

Dimi As Integer

Dimmyc As cmds

Fori = 1 To 6

Set myc = New cmds

Set myc.cmd = Me.Controls('TextBox'& i)

col.Add myc

Next

Setmyc = Nothing

End Sub

代码解析:

1行代码在模块顶部声明变量col的类型为集合。

5行到第9行代码,将窗体中的六个文本框赋给col集合。

在类模块中写入下面的代码:

Private Sub cmd_Change()

Dimi As Integer

DimDval As Double

Fori = 1 To 6

Dval = Dval + Val(UserForm1.Controls('TextBox'& i))

UserForm1.TextBox7.Value = Dval

Next

End Sub

代码解析:

窗体中的六个文本框统一的Change事件,当任何一个文本框中的数据发生变化时,所有文本框相加的合计数显示在最后一个文本框中。

运行窗体在文本框中输入数据结果。

107 控件跟随活动单元格

在工作表中使用控件时一般都把控件放在工作表的上部,如果工作表中数据较多,当页面滚动到工作表下面的区域时,控件会离开当前可视区域,这时操作起来很不方便。解决方法除了冻结工作表的第一行放置控件的外,还可以使控件出现在选定的单元格位置,如下面的代码所示。

Private Sub Worksheet_SelectionChange(ByVal TargetAs Range)

WithMe.CommandButton1

.Top = Target.Top

.Left = Target.Left + Target.Width

EndWith

End Sub

代码解析:

工作表的SelectionChange事件,使工作表中的按钮控件出现在选定单元格的右边。

3行代码,设置按钮的Top属性等于选定单元格的Top属性。Top属性设置对象顶端到第一行顶端的距离。

4行代码,设置按钮的Left属性等于选定单元格的Left属性加上选定单元格的宽度,即按钮出现在选定单元格的右边。Left属性设置对象左边界至 A 列左边界的距离。

当单击工作表区域的任一单元格,按钮出现在单元格的右边。

108 高亮显示按钮

为了达到当鼠标掠过按钮时以高亮和凸起显示按钮的效果,可以在窗体和按钮的MouseMove事件中进行模拟,如下面的代码所示。

Private Sub CommandButton1_MouseMove(ByVal ButtonAs IntegerByVal Shift As IntegerByVal X As SingleByVal Y As Single)

WithMe.CommandButton1

.BackColor = &HFFFF00

.Width = 62

.Height = 62

.Top = 69

.Left = 31

EndWith

End Sub

Private Sub UserForm_MouseMove(ByVal Button AsIntegerByVal Shift As IntegerByVal X As SingleByVal Y As Single)

WithMe.CommandButton1

.BackColor = Me.BackColor

.Width = 60

.Height = 60

.Top = 70

.Left = 32

EndWith

End Sub

代码解析:

窗体和按钮的MouseMove事件过程,以高亮和凸起显示按钮。

当用户在窗体中移动鼠标时,分别在窗体和按钮的MouseMove事件设置按钮的BackColor属性值,指定按钮的背景色,当鼠标移动到按钮时以高亮显示,当鼠标移动到窗体时恢复原来的设置。接下来分别设置按钮不同的Width属性、Height属性、Top属性和Left属性值,以模拟按钮凸起的效果。

109 组合框和列表框添加列表项的方法

组合框和列表框是Excel中最常用的控件,可以用来显示工作表中的数据。为组合框和列表框添加列表项的方法有多种,下面以列表框为例演示添加列表项的方法。

109-1 使用RowSource属性添加列表项

使用RowSource属性将列表框直接与工作表上的一个单元格区域相链接,如下面的代码所示。

Private Sub UserForm_Initialize()

DimiRow As Integer

iRow= Sheet1.Range('A65536').End(xlUp).Row

Me.ListBox1.RowSource= 'sheet1!a1:a' & iRow

End Sub

代码解析:

在窗体初始化时使用RowSource属性为列表框添加列表项。

RowSource属性的语法如下:

object.RowSource [=String]

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

参数String是可选的,组合框或列表框列表的来源。

RowSource属性也可以使用单元格地址,第4行代码可以改成下面的代码:

Me.ListBox1.RowSource= Sheet1.Range('A1:A' & iRow).Address(External:=True)

需要注意的是,如果RowSource属性指定的工作表区域不是活动工作表的话,Address属性的External参数是不可缺的,设置为True表示是外部引用,如果缺省此参数或为False,将不能为列表框添加列表项。

RowSource属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,第4行代码可以改成下面的代码:

Me.ListBox1.RowSource= '城市'

对于工作表中的列表框控件或使用窗体添加的列表框控件不能使用RowSource属性,需要使用ListFillRange属性指定填充列表框的工作表区域,如下面的代码所示。

Sub ListFillRange()

DimiRow As Integer

iRow= Sheet1.Range('A65536').End(xlUp).Row

Sheet2.ListBox1.ListFillRange= 'Sheet1!a1:a' & iRow

Sheet2.Shapes('列表框').ControlFormat.ListFillRange = 'Sheet1!a1:a'& iRow

End Sub

代码解析:

ListFillRange过程为工作表中的列表框的填充区域,ListFillRange属性用于指定填充列表框的工作表区域。

对于使用窗体添加的列表框控件需要使用ControlFormat属性来返回窗体控件以后才能设置其ListFillRange属性。

109-2 使用List属性添加列表项

使用List属性为列表框添加列表项,如下面的代码所示。

Private Sub UserForm_Initialize()

DimArr As Variant

DimiRow As Integer

iRow= Sheet1.Range('A65536').End(xlUp).Row

Arr= Sheet1.Range('A1:A' & iRow)

Me.ListBox1.List= Arr

End Sub

代码解析:

在窗体初始化时使用List属性为列表框添加列表项。

List属性的语法如下:

object.List( rowcolumn ) [= Variant]

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

参数row是必需的,取值范围为 0 到列表条目数减 1 之间的数值。

参数column是必需的,取值范围为 0 到总列数减 1 之间的数值。

参数Variant是可选的,列表框中指定条目的内容。

6行代码,使用List属性把数组复制到列表框控件上。

除了使用数组外,List属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,可以改成下面的代码:

Private Sub UserForm_Initialize()

Me.ComboBox1.List= Range('城市').Value

End Sub对于工作表中使用窗体添加的列表框控件使用List属性添加列表项,如下面的代码所示。

Sub List()

DimArr As Variant

DimiRow As Integer

DimmyObj As Object

iRow= Sheet1.Range('A65536').End(xlUp).Row

Arr= Sheet1.Range('A1:A' & iRow)

SetmyObj = Sheet2.Shapes('列表框 10').ControlFormat

myObj.List= Arr

End Sub

代码解析:

List过程设置列表框的List性,用于指定填充列表框的工作表区域。


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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多