Excel多选下拉带选择框
需求场景用到的具体步骤添加控件添加下拉值组织 VB 逻辑,控制 ListBox 控件效果结束附件下载需求场景
需求是这样的,制作上传模板的时候,有几个字段是需要多选,但是普通的数据校验只能单选下拉,所以需要有个列展示多个选项
可以指定具体某一列,其他类列不影响下拉值从其他 sheet 加载,方便维护修改有 check 框、能多选。有多个多选下拉框
用到的
由以上要求,需要用到 ActiveX 控件中的 ListBox 控件,逻辑用 vb 编写。本文同样的方法写了两份,方便对比修改。也便于迁移利用。废话少说具体步骤如下。
具体步骤
添加控件 》 添加逻辑 》 调整属性 》 测试调试
sheet页右击查看代码,最初始的样子是下图这样
添加控件
插入一个 ActiveX 控件,首先得开启开发工具,打开开发工具步骤是
1 单击文件 》 2 选项 》 3 自定义功能区 》 4 选择开发工具 》 5确定
当我们打开“开发工具”功能后,插入一个 ListBox 控件,
1 插入 》 2 选择其他控件 》 3 选中 Microsoft Forms ListBox 》 4点击确定 》 5 鼠标变成 + 形,随便拖一个矩形。
添加下拉值
在 sheet2 的 B2 格到 B8 格开始添加 01.待选A 02.待选B 03.待选C 04.待选D 05.待选E 06.待选F 07.待选G
1 选中 ListBox 》 2 点击属性 》 3 添加数据来源 ‘Sheet!B2:B8’ 》 显示如下图所示。 可以稍后调整样式。
组织 VB 逻辑,控制 ListBox 控件效果
插入一个模块,并增加一个记录单元格值是否改变的 change 变量右键【模块1】》 查看代码 》 加入开关listbox的change 变量 ReLoad
Public ReLoad As Boolean '开关listbox的change事件
添加 sheet1 的代码,Change 里控制值的追加,
Worksheet_SelectionChange 控制选中区域是否可以触发事件,调用哪个 ListBox
Private Sub ListBox1_Change()If ReLoad Then Exit Sub '见下方说明For i = 0 To ListBox1.ListCount - 1If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)NextActiveCell = Mid(t, 2)End SubPrivate Sub ListBox2_Change()If ReLoad Then Exit Sub '见下方说明For i = 0 To ListBox2.ListCount - 1If ListBox2.Selected(i) = True Then t = t & "," & ListBox2.List(i)NextActiveCell = Mid(t, 2)End SubPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)With ListBox1'如果列是第 1 列 和 单元格大于 1If ActiveCell.Column = 1 And ActiveCell.Row > 1 Thent = ActiveCell.ValueReLoad = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容If InStr(t, .List(i)) Then.Selected(i) = TrueElse.Selected(i) = FalseEnd IfNextReLoad = False.Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框.Left = ActiveCell.Left.Width = ActiveCell.Width.Visible = TrueElse.Visible = FalseEnd IfEnd WithWith ListBox2'如果列是第 2 列 和 单元格大于 1If ActiveCell.Column = 2 And ActiveCell.Row > 1 Thent = ActiveCell.ValueReLoad = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容If InStr(t, .List(i)) Then.Selected(i) = TrueElse.Selected(i) = FalseEnd IfNextReLoad = False.Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框.Left = ActiveCell.Left.Width = ActiveCell.Width.Visible = TrueElse.Visible = FalseEnd IfEnd WithEnd Sub
调整 ListBox 的属性(样式、单选./多选、特殊效果)
将 sheet2 中的值,在当 sheet2 中的值改变的时候,添加到ListBox 中,其中
Private Sub Worksheet_Change(ByVal Target As Range)Sheets("Sheet1").ListBox1.ListFillRange = "Sheet2!a1:a" & Cells(1, 1).End(xlDown).RowSheets("Sheet1").ListBox1.ListFillRange = "Sheet2!b2:b" & Cells(1, 1).End(xlDown).RowEnd Sub
结束
到此完全结束。
可以看到完成 ListBox 下拉,只需要
三个步骤
建文件t添加 ListBox 控件增加 VB 逻辑控制
三个代码片段
Sheet1 负责控制什么条件下触发显示ListBox,和 ListBox 的事件处理Sheet2 负责将字典数据在改变的时候赋值到对应的ListBox控件属性中模块1 放置变量
另外,有很多问题都是在 找到解决方案的。
附件下载
本次实践做成的 xls 文件,请自取 CSDN下载 附件链接
针对不可用的请按下图点击》启用内容。就可以使用了