需求是这样的,制作上传模板的时候,有几个字段是需要多选,但是普通的数据校验只能单选下拉,所以需要有个列展示多个选项
由以上要求,需要用到 ActiveX 控件中的 ListBox 控件,逻辑用 vb 编写。本文同样的方法写了两份,方便对比修改。也便于迁移利用。废话少说具体步骤如下。
添加控件 》 添加逻辑 》 调整属性 》 测试调试
插入一个 ActiveX 控件,首先得开启开发工具,打开开发工具步骤是
1 单击文件 》 2 选项 》 3 自定义功能区 》 4 选择开发工具 》 5确定
当我们打开“开发工具”功能后,插入一个 ListBox 控件,
1 插入 》 2 选择其他控件 》 3 选中 Microsoft Forms ListBox 》 4点击确定 》 5 鼠标变成 + 形,随便拖一个矩形。
在 sheet2 的 B2 格到 B8 格开始添加 01.待选A 02.待选B 03.待选C 04.待选D 05.待选E 06.待选F 07.待选G
1 选中 ListBox 》 2 点击属性 》 3 添加数据来源 ‘Sheet!B2:B8’ 》 显示如下图所示。 可以稍后调整样式。
右键【模块1】》 查看代码 》 加入开关listbox的change 变量 ReLoad
Public ReLoad As Boolean '开关listbox的change事件
添加 sheet1 的代码,Change 里控制值的追加,
Worksheet_SelectionChange 控制选中区域是否可以触发事件,调用哪个 ListBox
Private Sub ListBox1_Change()
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()
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)
With ListBox1
'如果列是第 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
With ListBox2
'如果列是第 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
End Sub
调整 ListBox 的属性(样式、单选./多选、特殊效果)
将 sheet2 中的值,在当 sheet2 中的值改变的时候,添加到ListBox 中,其中
Private Sub Worksheet_Change(ByVal Target As Range)
Sheets("Sheet1").ListBox1.ListFillRange = "Sheet2!a1:a" & Cells(1, 1).End(xlDown).Row
Sheets("Sheet1").ListBox1.ListFillRange = "Sheet2!b2:b" & Cells(1, 1).End(xlDown).Row
End Sub
到此完全结束。
可以看到完成 ListBox 下拉,只需要
三个步骤
三个代码片段
另外,有很多问题都是在 http://club.excelhome.net 找到解决方案的。