Excel2010VBA⼊门125创建动态智能匹配的下拉列表
⽬录
在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
vba listbox控件详解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
.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控件和ListBox控件
TextBox控件是⼀个⽂本框,其中可以供⽤户输⼊或修改⽂本,其属性Value以及Text表⽰在⽂本框内显⽰的⽂字。⽂本框是⼀个⾮常简单的ActiveX控件,它主要提供了⽂字输⼊的功能。由于在编辑单元格时,系统将会禁⽤⼀切VBA程序的运⾏,因⽽当需要在某个输⼊时,希望通过值的变化⽽触发某个程序的运⾏,则通常使⽤⽂本框及其Change事件。
ListBox控件是⼀个列表框,其中可以创建任何列表项⽬供选择。⽤户只能从列表框中选择其中的项⽬,
⽽不能⾃由输⼊。列表框中的列表来源可以为⼯作表中某个区域的数据,也可以由其Addltem⽅法添加或者由List属性所指定。
ListBox控件的ListFiIIRange属性和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控件的多列显⽰
当需要显⽰多列项⽬时,可以将ListBox控件的ColumnCount属性设置为⼤于1的数值,同时需要改变ColumnWidth属性来改变其列宽。当需要使⽤标题时,应将ColumnHeader属性设置为True。
ColumnCount接受⼀个长整型变量,可以为⼤于或等于-1的数字。当该值为-1时,则表⽰显⽰的列数与数据源相同,当该值为0时,不显⽰任何内容,当该值⼤于0时,表⽰显⽰的列数。
ColumnWidth属性可以接受⼀个⽂本字符,表⽰各列的列宽,其中各列之间的列宽数字由分号(;)隔开(如:20;30;40)。
ColumnHeader属性为逻辑值,当为True时,显⽰列表的列标题。该属性只有当使⽤ListFillRange属性为控件添加列表项⽬时有效。其所显⽰的标题为ListFillRange所引⽤的单元格区域中上⼀⾏的单元格区域,如图所⽰。当ListFillRange以第⼀⾏为起点时,
则以列标作为标题。
ListBox控件的值
⼀般地,可以通过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控件
ListBox控件和ComboBox控件的使⽤⽅法基本相同,ComboBox控件可以使⽤与ListBox控件相同的⽅法添加或删除其选项。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。