单项下拉菜单可以用数据有效性,那么如何制作可以多选下拉菜单?

您所在的位置:网站首页 下拉列表框的测试 单项下拉菜单可以用数据有效性,那么如何制作可以多选下拉菜单?

单项下拉菜单可以用数据有效性,那么如何制作可以多选下拉菜单?

2023-03-26 08:20| 来源: 网络整理| 查看: 265

电子表格单项下拉菜单可以利用数据有效性(数据验证)制作,但是每个单元格只能选中/输入一个内容。

演示

如果要一个单元格输入多个内容,可以利用列表框的功能,如下图所示:

一次性输入多个字段内容,每个字段可用不同的分隔符分隔开来(这里用的是换行符,也可以改为逗号、分号等)。

也可以展示多列内容,供辅助选择。

准备筛选项

筛选项就是下拉需要选择的内容,这里我们需要单独整理一份,放在单独的一个sheet里面,这里我将它放到了Sheet1这个插页里面,如下图所示:

A列是要选择的内容,B列是辅助选择的内容(可以删除)。

当然,这里可以存放多列内容,下拉列表输入的字段也可以调整,这个后面再说。

注意这是插入到Sheet2界面,跟“准备筛选项”不是同一个sheet

插入列表框

点击“开发工具”选项卡,点击【插入】,选择ActiveX控件下方的第四个按钮列表框;拖入到Excel界面当中去,大小随便设置,接着点击 开发工具选项卡上面的【设计模式】,取消设计状态。

需要注意的是,首次插入列表框,它的名字叫做“ListBox1”,这个在Excel左上角可以看到,如果不是的话,说明你之前插入过一个列表框了,要把它的名字修改了哈。

插入VBA代码块

完成以上步骤后,打开VBE界面,进入到刚才插入列表框的sheet内,这里我是Sheet2插入,粘贴以下代码(模板表详见文末):

代码解读

Worksheet_SelectionChange表示当工作表鼠标选择内容发生变化时执行以下语句;

ListBox1就是我们插入的列表框,可以设置他的高度、宽度、是否显示标题行、等等设置;

其它解读详见模板表里备注。

注意事项

1、下拉默认选择的是筛选项插页的第一列,就是A列的内容,如果你要变动列的话,比如改到B列,只需要修改这句【strMy = strMy & vbCrLf & .List(i, 0)】最后的数字“0”;

0代表A列,1代表B列,2代表C列...

索引是从0开始的。

2、多选分隔符代码里面用的是换行符“vbCrLf”,可以将它换成其它的,比如顿号、分号等等。

完整代码如下所示

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Column 1 Or Target.Row < 2 Then ListBox1.Visible = False: Exit Sub

'如果选中的单元格不是第1列,或者小于1行,也就是不在目标范围内,则退出程序

If Target.Columns.Count > 1 Or Target.Rows.Count > 1 Then ListBox1.Visible = False: Exit Sub '如果选中的单元格大于1个,则退出程序

Dim r

With Sheets("Sheet1")

lists = .UsedRange.Value

End With

With ListBox1 '调整位置到单元格处

.Top = Target.Top 'listbox的顶端位置

.Left = Target.Left + Target.Width 'listbox的左端位置

.Width = 250 '宽度

.Height = 150 '高度

.Visible = True '可见

.ColumnHeads = False '不显示标题行

'.ColumnCount = 1 '一共显示列,不设置全部显示

'.ColumnWidths = "100;100" '可以设置每列的宽度,用分号隔开

.List = lists '数据来源

.MultiSelect = fmMultiSelectMulti '允许通过鼠标点击的方式进行多选

.ListStyle = fmListStyleOption '选项按钮设置为方形

End With

End Sub

Private Sub ListBox1_Change()

Dim i As Long, strMy As String

With ListBox1

If .Selected(0) = True Then .Selected(0) = False '选取标题行,取消

For i = 1 To .ListCount - 1 '遍历listbox的记录,如果被选中则按换行符合并

If .Selected(i) = True Then

strMy = strMy & vbCrLf & .List(i, 0) '取list的第1列,索从索引0开始的

'vbCrLf是换行符,可以将它修改成其它链接符号,比如逗号、冒号、顿号等等

End If

Next

End With

ActiveCell.Value = Mid(strMy, 3) '前面有个换行符,剔除

End Sub



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3