Excel用ListBox多选下拉带选择框

Excel多选下拉带选择框

  • 需求场景
  • 用到的
  • 具体步骤
    • 添加控件
    • 添加下拉值
    • 组织 VB 逻辑,控制 ListBox 控件效果
  • 结束
    • 附件下载

需求场景

需求是这样的,制作上传模板的时候,有几个字段是需要多选,但是普通的数据校验只能单选下拉,所以需要有个列展示多个选项

  • 可以指定具体某一列,其他类列不影响
  • 下拉值从其他 sheet 加载,方便维护修改
  • 有 check 框、能多选。
  • 有多个多选下拉框
    Excel用ListBox多选下拉带选择框_第1张图片Excel用ListBox多选下拉带选择框_第2张图片

用到的

由以上要求,需要用到 ActiveX 控件中的 ListBox 控件,逻辑用 vb 编写。本文同样的方法写了两份,方便对比修改。也便于迁移利用。废话少说具体步骤如下。

具体步骤

添加控件 》 添加逻辑 》 调整属性 》 测试调试

  1. sheet页右击查看代码,最初始的样子是下图这样

Excel用ListBox多选下拉带选择框_第3张图片

添加控件

  1. 插入一个 ActiveX 控件,首先得开启开发工具,打开开发工具步骤是

    1 单击文件 》 2 选项 》 3 自定义功能区 》 4 选择开发工具 》 5确定

Excel用ListBox多选下拉带选择框_第4张图片

当我们打开“开发工具”功能后,插入一个 ListBox 控件,

1 插入 》 2 选择其他控件 》 3 选中 Microsoft Forms ListBox 》 4点击确定 》 5 鼠标变成 + 形,随便拖一个矩形。

Excel用ListBox多选下拉带选择框_第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’ 》 显示如下图所示。 可以稍后调整样式。

Excel用ListBox多选下拉带选择框_第6张图片Excel用ListBox多选下拉带选择框_第7张图片

组织 VB 逻辑,控制 ListBox 控件效果

  1. 插入一个模块,并增加一个记录单元格值是否改变的 change 变量

右键【模块1】》 查看代码 》 加入开关listbox的change 变量 ReLoad

Public ReLoad As Boolean '开关listbox的change事件

Excel用ListBox多选下拉带选择框_第8张图片Excel用ListBox多选下拉带选择框_第9张图片

添加 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 的属性(样式、单选./多选、特殊效果)

Excel用ListBox多选下拉带选择框_第10张图片

将 sheet2 中的值,在当 sheet2 中的值改变的时候,添加到ListBox 中,其中

Excel用ListBox多选下拉带选择框_第11张图片

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 下拉,只需要
三个步骤

  • 建文件t
  • 添加 ListBox 控件
  • 增加 VB 逻辑控制

三个代码片段

  • Sheet1 负责控制什么条件下触发显示ListBox,和 ListBox 的事件处理
  • Sheet2 负责将字典数据在改变的时候赋值到对应的ListBox控件属性中
  • 模块1 放置变量

另外,有很多问题都是在 http://club.excelhome.net 找到解决方案的。

附件下载

本次实践做成的 xls 文件,请自取 CSDN下载 附件链接
针对不可用的请按下图点击》启用内容。就可以使用了
Excel用ListBox多选下拉带选择框_第12张图片

你可能感兴趣的:(其他,excel)