穿越星空(Across the Stars)分享 http://blog.sciencenet.cn/u/aweng

博文

Excel制作下拉复选框

已有 20809 次阅读 2022-2-17 00:50 |个人分类:学习|系统分类:教学心得

一、准备

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

在录入表中准备好需要录入的单元格。

在选项表中准备好选项列表,以纵列形式排列。

image.png

image.png


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

image.png


二、复选框设置

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

image.png

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

image.png

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

image.png

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

image.png

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

按字母序

image.png


按分类序

image.png


设置的项目一样的。

数据分类中的ListStyle选1-fmListStyleOption

行为分类中的MultiSelect选1-fmMultiSelectMulti

杂项分类中的ListFillRange填写复选选项的位置,如在这里是选项表!A2:A9

选好之后是这样的

image.png

这样复选框就出现了。


image.png


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


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

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

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

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

image.png


三、编写VBA代码

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

image.png

先设置ListBox1的代码。

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

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

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 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 = 1 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 = 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


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

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

现在是这样的

image.png


我们要录入的时候,点A2单元格,会是这样的

image.png

勾选复选框后是这样的

image.png

选好之后,选中任意其他单元格(除了A、B这两列设置过复选框输入的列之外),就输入成功了。

image.png

B列也选择之后是这样的

image.png

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






https://blog.sciencenet.cn/blog-485-1325649.html

上一篇:ArcGIS学习笔记(6)利用卫星照片配准AutoCAD矢量图
下一篇:Excel中制作单级下拉框输入
收藏 IP: 58.100.15.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-26 17:55

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部