106 多个文本框数据相加
在▲102 中,我们在TextBox1、TextBox2中输入完数据后,利用文本框的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 Integer,ByVal Shift As Integer,ByVal X As Single,ByVal Y As Single)
WithMe.CommandButton1
.BackColor = &HFFFF00
.Width = 62
.Height = 62
.Top = 69
.Left = 31
EndWith
End Sub
Private Sub UserForm_MouseMove(ByVal Button AsInteger,ByVal Shift As Integer,ByVal X As Single,ByVal 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( row,column ) [= 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性,用于指定填充列表框的工作表区域。
联系客服