目录
题
码
TextBox控件和ListBox控件
ListBox控件的ListFiIIRange属性和List属性
ListBox控件的多列显示
ListBox控件的值
模糊查询下拉列表
控件的选用
ListBox和ComboBox控件
在Excel中,可以使用数据有效性创建下拉列表。当列表项目较多时,数据有效性所创建的下拉列表就很难快速并准确地定位。如图所示,该表为某公司客户一览,现准备建立查询表,希望在查询表的客户列中建立下拉列表,并允许输入关键字后显示匹配该关键字的所有客户的列表。
客户 |
浙江天星药业有限公司 |
重庆天邓制药有限责任公司 |
浙江华丽生物科技有限公司 |
天津华顺药业有限公司 |
宁波宝石有限公司 |
北京盛华有限公司 |
莱新技术有限公司 |
上海创新有限公司 |
浙江邦华有限公司 |
浙江汉顺生物有限公司 |
浙江华府制药有限公司 |
上海倚天有限公司 |
上海天华有限公司 |
在工作表中添加两个ActiveX控件:一个文本框(TextBox)和一个列表框(ListBox)。使用SelectionChange事件控制两个控件的显示和隐藏,并添加文本框的Change事件,查找“客户名称”表中包含文本框中所示文本的所有项目,并添加至列表框中。最后添加列表框的
Click事件,将列表框的值赋值给单元格,并隐藏控件。
Option Explicit
Private Sub Worksheet_Activate()
Me.TextBox1.Visible = False
Me.ListBox1.Visible = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.TextBox1.Visible = False
Me.ListBox1.Visible = False
If Target.Count = 1 Then
If Target.Column = 1 And Target.Row > 1 Then
With Me.TextBox1
.Visible = True
.Top = Target.Top
.Left = Target.Left
.Height = Target.Height
.Width = Target.Width
.Value = "*"
.Value = ""
.Activate
End With
With Me.ListBox1
.Visible = True
.Top = Target.Top + Target.Height
.Left = Target.Left
.Height = 200
.Width = Target.Width
End With
End If
End If
End Sub
Private Sub TextBox1_Change()
Dim sKey As String '模糊查找关键字
Dim arrData '数据数组
Dim arrResult '查找结果数组
Dim countResult As Long '结果数量
Dim sData As Variant '遍历数据元素的变量
'获取关键字
sKey = Me.TextBox1.Text
'获取原始数据
With Sheet1
arrData = .Range("A2:A" & .Range("A1").CurrentRegion.Rows.Count).Value
End With
countResult = 0
ReDim arrResult(1 To 1)
For Each sData In arrData
'若模糊匹配成功,则添加至结果数组中
If sData Like "*" & sKey & "*" Then
countResult = countResult + 1
ReDim Preserve arrResult(1 To countResult)
arrResult(countResult) = sData
End If
Next sData
Me.ListBox1.List = arrResult
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ActiveCell.Value = Me.ListBox1.Text
Me.TextBox1.Visible = False
Me.ListBox1.Visible = False
End Sub
TextBox控件是一个文本框,其中可以供用户输入或修改文本,其属性Value以及Text表示在文本框内显示的文字。文本框是一个非常简单的ActiveX控件,它主要提供了文字输入的功能。由于在编辑单元格时,系统将会禁用一切VBA程序的运行,因而当需要在某个输入时,希望通过值的变化而触发某个程序的运行,则通常使用文本框及其Change事件。
ListBox控件是一个列表框,其中可以创建任何列表项目供选择。用户只能从列表框中选择其中的项目,而不能自由输入。列表框中的列表来源可以为工作表中某个区域的数据,也可以由其Addltem方法添加或者由List属性所指定。
ListBox控件的ListFillRange属性和List属性都可以表示ListBox控件的列表项目来源。
ListFillRange属性接受文本类型的表达式,表示某个工作表中的单元格引用(如:Sheet1!(A1:A20)。当设置ListFillRange之后,ListBox控件的所有列表项目为其所表示的单元格的引用。如需要改变列表的值,只能通过更改所引用的单元格的值。
List属性可以接受一个一维数组或者二维数组。当使用一维数组时,则该数组中的所有项目为列表项目。当使用二维数组时,则其第一个维度的每个不同的值表示一个列表项目。如数组Arr (20,3):Arr(1,1)和Arr(1,2)由于其第一个维度的下标相同,表示同一个
列表项:Arr(2,1)和Arr(1,2)由于其第一个维度的下标不同,表示不同的列表项。
当ListBox控件已经赋值并具备列表项时,可以使用List属性来访问其中的各个项目。为便于理解,可以把List属性当作一个以0为下限的二维数组,如List(2,0)表示第3个选项的数据。
当需要显示多列项目时,可以将ListBox控件的ColumnCount属性设置为大于1的数值,同时需要改变ColumnWidth属性来改变其列宽。当需要使用标题时,应将ColumnHeader属性设置为True。
ColumnCount接受一个长整型变量,可以为大于或等于-1的数字。当该值为-1时,则表示显示的列数与数据源相同,当该值为0时,不显示任何内容,当该值大于0时,表示显示的列数。
ColumnWidth属性可以接受一个文本字符,表示各列的列宽,其中各列之间的列宽数字由分号(;)隔开(如:20;30;40)。
ColumnHeader属性为逻辑值,当为True时,显示列表的列标题。该属性只有当使用ListFillRange属性为控件添加列表项目时有效。其所显示的标题为ListFillRange所引用的单元格区域中上一行的单元格区域,如图所示。当ListFillRange以第一行为起点时,
则以列标作为标题。
一般地,可以通过ListBox控件的List属性返回列表项目中的任意值。当需要返回当前选中的项目时,则可以使用Value属性或者Column属性返回。
Value属性可以返回当前选中的项目默认列的值,该默认列可以通过BoundColumn属性进行改变。BoundColumn属性可以为大于1的一个数字,表示所返回的值的列数。
Column属性可以返回选中项目指定列的数据,如Column(1)表示第2列的值(以0开始)。
一般情况下,Value属性返回的值为选中的项目的序列号(该序列号以第1个项目为0,第N个项目为N-1)。若要返回其选项的文本显示,则应使用Text属性。本例即利用Text属性返回选中的项目。
对于本例而言,用户需要输入指定的文本,并根据该文本模糊查找源数据后生成下拉列表。该过程可以描述为一个动态过程,列表项目随着输入或者删除字符而不断变化。由于在单元格编辑状态下无法运行VBA程序,因而只能采用TextBox进行输入。该模糊下拉列表可以分为以下几个部分操作。
(1)当打开工作表时隐藏控件。
(2)当单击指定的单元格或者双击单元格时,显示TextBox和ListBox控件,并将光标转入文本框中。此时,列表框显示所有的项目。
(3)当在文本框中输入字符时,根据所输入的文字在源数据区域进行模糊查找,并将筛选后的列表作为ListBox的列表。
(4)当单击或双击列表框的项目时,将所选的项目的值赋值给单元格,并同时隐藏控件。
(5)当选择非指定的单元格时,隐藏控件。
为以上操作选择事件程序如下。
步骤1 使用工作表的Activate事件,在其中添加隐藏控件的代码。
步骤2 使用工作表的SelectionChange事件或者BeforeDoubleClick事件,将控件显示并调整位置,然后使用TextBox的Activate方法进入其编辑状态。在此步骤中,一般可以将TextBox的大小和位置与单元格设置成完全一致,即完全遮挡单元格。
步骤3 使用TextBox控件的Change事件,在事件中根据TextBox当前的值对原始数据区域进行模糊查找,并将筛选后的列表赋值给数组,然后将数组赋值给ListBox的List属性。此处未使用ListFillRange属性指定数据源,是为了避免造成原始数据的破坏。开发者也可以选择将原始数据区域筛选后赋值给一个临时的单元格区域,并使用ListFillRange属性指定该临时区域。
步骤4 使用ListBox控件的Click事件或者DblClick事件,将选定的ListBox的值赋值给单元格。
步骤5使用工作表的SelectionChange事件隐藏工作表。本步骤可以和步骤2合并,使用相同的事件,即只需使用分支判断Target参数即可。
本例使用了两个控件用以完成所需实现的功能。实际上,控件的选用并非是事先就决定的。当需要实现某个功能时,首先应描述实现该功能所需进行的各个操作,即根据功能描述将实现的步骤进行一一描述。然后根据步骤选择可以完成功能的相应控件。
ListBox控件和ComboBox控件的使用方法基本相同,ComboBox控件可以使用与ListBox控件相同的方法添加或删除其选项。