在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控件和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控件相同的方法添加或删除其选项。
目录题码TextBox控件和ListBox控件ListBox控件的ListFiIIRange属性和List属性ListBox控件的多列显示ListBox控件的值模糊查询下拉列表控件的选用ListBox和ComboBox控件题 在Excel中,可以使用数据有效性创建下拉列表。当列表项目较多时,数据有效性所创建的下拉列表就很难快速并准确地定位。如图所示,该表为某公司客户一览,现准备建立查询表,希望在查询表的客户列中建立下拉列表,并允许输入关键字后显示匹配该关键字..
Excel
多选 下拉 勾选框 VB 有check框 xls xlsx
Excel
多选下拉带选择框需求场景用到的具体步骤添加控件添加下拉值组织 VB 逻辑,控制
ListBox
控件效果结束附件下载
需求是这样的,制作上传模板的时候,有几个字段是需要多选,但是普通的数据校验只能单选下拉,所以需要有个列展示多个选项
可以指定具体某一列,其他类列不影响
下拉值从其他 sheet 加载,方便维护修改
有 check 框、能多选。
有多个多选下拉框
代码案例实现效果:combobox输入内容后,按键盘下方向键或鼠标双击,能
匹配
输入框中
匹配
到的内容
要点:combobox的state设置为"readonly"时,点击combobox输入框处会自动弹出
下拉列表
,
但设置为"readonly"时,combobox无法输入,所以这里我绑定了鼠标左键单击事件,左键单击恢复combobox的state属性为"normal",这样有可以恢复输入了。
匹配
触发动作可以根据自己的需求改,代码案例写的是按方向键小或鼠标左键双击,触发
匹配
动作。
import tk
Excel
利用
VBA
实现
下拉列表
,同时支持输入时
动态
查询,根据输入的不同实现
动态
的查询
先看一下实验效果:
当点击website这一列时会出现所有的网站列表,双击可点击选择数值填入
输入关键字时会只出现包含关键字的结果
在C,D两列选择单元格后会出现仅在此网站下的数据如果网站为空则会自动向上寻找,同时也支持自定义的搜索
接下来为主要的实现方法:
第一部分为工作表选取改变事件,实现的是当有单元格被选定时会自动出现下拉菜单和输入框。首先需要在sheet中
private void Button1_Click(object sender, System.EventArgs e)
if(
ListBox
1.
Visible
==
false
)
SqlConnection conn=new SqlConnection(@"Server="+DB_Host+";D...
以下是一个根据下拉框单元格的值来给特定单元格进行赋值的代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next:
Application.ScreenUpdating =
False
...
在程序开发中,user给了本人一个
excel
,里面有几百个长方形,需要将这些长方形展示在页面中。
首先想到的是需要每个长方形左上角的坐标(x,y)值。这样在页面上就可以画出相对应的图形了。
但是几百个,人工统计坐标的话估计需要十几个小时。
Excel
中sheet如下图:
所以运用
vba
,来快速实现此目标。本人是
vba
小白,通过百度获取相关知识,下面是我的大致步骤,如有错误之处,请同仁不啬赐教。