单项下拉菜单可以用数据有效性,那么如何制作可以多选下拉菜单? |
您所在的位置:网站首页 › 下拉列表框的测试 › 单项下拉菜单可以用数据有效性,那么如何制作可以多选下拉菜单? |
电子表格单项下拉菜单可以利用数据有效性(数据验证)制作,但是每个单元格只能选中/输入一个内容。 演示如果要一个单元格输入多个内容,可以利用列表框的功能,如下图所示: 一次性输入多个字段内容,每个字段可用不同的分隔符分隔开来(这里用的是换行符,也可以改为逗号、分号等)。 也可以展示多列内容,供辅助选择。 筛选项就是下拉需要选择的内容,这里我们需要单独整理一份,放在单独的一个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 |