Excel制作下拉复选框

一,准备Excle

在Excel创建两个sheet,分别命名录入表和选项表,以下以“录入表”和“选项表”为sheet名进行说明

1)在Excel的选项表中准备好选项数据,按照列的格式录入

2)录入数据的表中设置录入选项的数据

如下实例

打开Excel的“开发工具”选项卡。(文件→选项→自定义功能区,在右侧的复选区中勾上“开发工具”选项卡前面的复选框)

二、复选框设置

在录入表中选择需要录入的单元格。

开发工具选项卡→控件选项组→插入→ActiveX控件→列表框(ActiveX控件)

在合适的位置画出复选框所在位置,画好后还可以调整。

在控件选项组里点属性按钮。

可以按字母序,也可以按分类序。

按字母序

按分类序

设置的项目一样的。

数据分类中的ListStyle选1-fmListStyleOption

行为分类中的MultiSelect选1-fmMultiSelectMulti

杂项分类中的ListFillRange填写复选选项的位置,如在这里销售地区是选项表!C2:C6

选好之后是这样的

这样复选框就出现了

记住,这个复选框的名字是ListBox1。

这样,我们就设置好了第一个复选框。

同理,我们可以设置好第二个、第三个……第N个复选框。

我们这里以两个个复选框为例,于是同理设置第二个复选框,名字是ListBox2。

当然,复选框的名字在左上角的空格中可以修改。

三、编写VBA代码

在控件选项组中点查看代码按钮。

先设置ListBox1的代码。

在代码界面中输入以下代码

'--------------------

Private Sub Label1_Click()

End Sub

Private Sub ListBox1_Change()

    '加载ListBox1

    If Reload Then Exit Sub

    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()

    '加载ListBox2

    If Reload Then Exit Sub

    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 ListBox3_Change()

    '加载ListBox3

    If Reload Then Exit Sub

    For i = 0 To ListBox3.ListCount - 1

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

    Next

    ActiveCell = Mid(t, 2)

End Sub
'-------------------

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


'设置ListBox1

With ListBox1

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

     '在这里,ActiveCell.Column是录入位置所在的列,根据需要调整。在本题中为第1列,n=1,就为1。

     '在这里,ActiveCell.Row是录入位置所在的行,根据需要这调整。在本题中录入位置从第2行开始,就为2-1=1。

     If ActiveCell.Column = 100 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


'设置ListBox2

With ListBox2

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

     '在这里,ActiveCell.Column是录入位置所在的列,根据需要调整。在本题中为第2列,n=2,就为2。

     '在这里,ActiveCell.Row是录入位置所在的行,根据需要这调整。在本题中录入位置从第2行开始,就为2-1=1。

     If ActiveCell.Column = 6 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
'设置ListBox3

With ListBox3

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

     '在这里,ActiveCell.Column是录入位置所在的列,根据需要调整。在本题中为第2列,n=2,就为2。

     '在这里,ActiveCell.Row是录入位置所在的行,根据需要这调整。在本题中录入位置从第2行开始,就为2-1=1。

     If ActiveCell.Column = 7 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

从End Sub来看,上面共有三个完整的VBA代码。

第一个End Sub用来加载ListBox1

第二个End Sub用来加载ListBox2

有N个ListBox,就可以复制粘贴出N个,对应N个ListBox

第三个End Sub用来激活ListBox

在这里,从With…End With来看,有两段,每段对应一个ListBox。

需要注意的是,在ListBox1这段中的If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then这句里,前一个1表示录入位置所在的列,后一个1表示从第2列开始录入。可以根据录入位置的不同,修改这两个参数。可以注意到ListBox2这段中就改成了If ActiveCell.Column = 2 And ActiveCell.Row > 1 Then,因为ListBox2要在第2列开始录入。

代码准备好之后,在代码窗口的菜单栏中,调试→编译VBAProject

如果复选框还显示,那么再点一次控件选项组中的设计模式,退出设计模式。

现在是这样的

选好之后,选中任意其他单元格(除了录入数据的列设置过复选框输入的列之外),就输入成功了。

如果要修改,就点要修改的单元格,再重新选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值