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性,用于指定填充列表框的工作表区域。 |
|