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

我们在制作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 学习)