100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Excel用ListBox多选下拉带选择框

Excel用ListBox多选下拉带选择框

时间:2019-01-23 01:00:58

相关推荐

Excel用ListBox多选下拉带选择框

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下载 附件链接

针对不可用的请按下图点击》启用内容。就可以使用了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。