||
一、准备
在Excel中建立两个sheet,分别是录入表和选项表,以下以“录入表”和“选项表”为sheet名进行说明。
在录入表中准备好需要录入的单元格。
在选项表中准备好选项列表,以纵列形式排列。
打开Excel的“开发工具”选项卡。(文件→选项→自定义功能区,在右侧的复选区中勾上“开发工具”选项卡前面的复选框)
二、复选框设置
在录入表中选择需要录入的单元格。
开发工具选项卡→控件选项组→插入→ActiveX控件→列表框(ActiveX控件)
在合适的位置画出复选框所在位置,画好后还可以调整。
在控件选项组里点属性按钮。
可以按字母序,也可以按分类序。
按字母序
按分类序
设置的项目一样的。
数据分类中的ListStyle选1-fmListStyleOption
行为分类中的MultiSelect选1-fmMultiSelectMulti
杂项分类中的ListFillRange填写复选选项的位置,如在这里是选项表!A2:A9
选好之后是这样的
这样复选框就出现了。
记住,这个复选框的名字是ListBox1。
这样,我们就设置好了第一个复选框。
同理,我们可以设置好第二个、第三个……第N个复选框。
我们这里以两个复选框为例,于是同理设置第二个复选框,名字是ListBox2。
当然,复选框的名字在左上角的空格中可以修改。
三、编写VBA代码
在控件选项组中点查看代码按钮。
先设置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
如果复选框还显示,那么再点一次控件选项组中的设计模式,退出设计模式。
现在是这样的
我们要录入的时候,点A2单元格,会是这样的
勾选复选框后是这样的
选好之后,选中任意其他单元格(除了A、B这两列设置过复选框输入的列之外),就输入成功了。
B列也选择之后是这样的
如果要修改,就点要修改的单元格,再重新选择。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-24 01:54
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社