美文网首页
Excel 单元格下拉复选框(多选项)——VBA 学习

Excel 单元格下拉复选框(多选项)——VBA 学习

作者: 自由而灿烂的神 | 来源:发表于2021-08-09 23:22 被阅读0次

    我们在制作excel表格模板的时候,为了控制用户的输入,会将单元格设置数据验证格式,如下图:

    单选

    但数据验证只支持单选项,无法支持多选,那么,我们如何实现下拉复选框,实现多个选项勾选呢?(如下图)

    下拉复选框

    实验开始:

    环境:Excel 2016

    支持:VBA支持库(没有安装的,需要安装哦)

    第一步:准备数据源

    新建一个Excel表格,sheet1创建4列表头字段,sheet2用来存放选项值,我们以“爱好”、“学习课程”为例来实现下拉复选框

    sheet1 sheet2

    第二步:调出开发工具

    文件 >> 选项 >> 勾选 “开发工具”,点击“确定”。

    第三步:插入列表框控件

    开发工具 >> 插入 >> ActiveX 控件  >> 列表框控件,绘制控件。

    第四步:设置列表框控件属性

    如下图,绘制好的列表框控件名称默认为“ListBox1”,当前为“设计模式”,点击“属性”,进入设置。

    在弹出的属性设置框中,设置好样式、多选、选项值的数据源范围(即sheet2 "爱好"一列的数据,不包括表头)。

    用同样的方法,新添加一个列表框控件,注意第二个列表框为ListBox2,并设置相关属性,多选项的数据源范围为“Sheet2!B2:B8”。

    第五步:启用VBA代码

    在状态栏找到并点击“查看代码”,或是在活动表Sheet1右击,选择“查看代码”,进入VBA编辑器。

    注:如果Excel没有安装VBA支持库的,需要先安装好哦~

    将下方代码复制,并调试编译


    Private Sub ListBox1_Change()

    If Reload Then Exit Sub '加载ListBox1

    For i = 0 To ListBox1.ListCount - 1

    If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)

    Next

    ActiveCell = Mid(t, 2)

    End Sub

    Private Sub ListBox2_Change()

    If Reload Then Exit Sub '加载ListBox2

    For i = 0 To ListBox2.ListCount - 1

    If ListBox2.Selected(i) = True Then t = t & "," & ListBox2.List(i)

    Next

    ActiveCell = Mid(t, 2)

    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    With ListBox1

            '第 2 列 且 单元格大于 1,因为表头的字段不需要进行多选

            If ActiveCell.Column = 2 And ActiveCell.Row > 1 Then

                t = ActiveCell.Value

                Reload = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。

                For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容

                    If InStr(t, .List(i)) Then

                        .Selected(i) = True

                        Else

                        .Selected(i) = False

                    End If

                Next

                Reload = False

                .Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框

                .Left = ActiveCell.Left

                .Width = ActiveCell.Width

                .Visible = True

                Else

                .Visible = False

            End If

        End With

    With ListBox2

            '第 4 列 且 单元格大于 1,因为表头的字段不需要进行多选

            If ActiveCell.Column = 4 And ActiveCell.Row > 1 Then

                t = ActiveCell.Value

                Reload = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。

                For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容

                    If InStr(t, .List(i)) Then

                        .Selected(i) = True

                        Else

                        .Selected(i) = False

                    End If

                Next

                Reload = False

                .Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框

                .Left = ActiveCell.Left

                .Width = ActiveCell.Width

                .Visible = True

                Else

                .Visible = False

            End If

        End With

    End Sub


    调试 >> 编译

    再点击一次“设计模式”,让我们看看效果吧

    超棒!nice!完结,撒花~

    相关文章

      网友评论

          本文标题:Excel 单元格下拉复选框(多选项)——VBA 学习

          本文链接:https://www.haomeiwen.com/subject/qpgtbltx.html