table 内 下拉列表 被遮挡_如何制作可以多项选择的下拉菜单?

哈罗,我是星光,话说咱们很久以前分享过一个教程,如何制作显示多列内容的下拉菜单? 动动鼠标,制作比数据有效性更炫酷的下拉菜单 然后更进一步的问题是,如何制作显示多列同时可以选择多项的下拉菜单? 比如下图酱紫,显示三列下拉菜单,可以选择任意多个项目合并到一个单元格…… d4c8a0f71739b48091c658299fe8ae5a.gif
打个响指……打开书抄段代码,待会回来。 . 首先,咱们得有个数据表,用来填充选项菜单的数据。嗯,我们把这份工作表命名为“参数表”,数据如下图所示。A列是商品代码,B列是商品,C列是负责人。 3eeaa4f0827b5f60289696edd092a9ea.png
然后,我们在需要制作选项菜单的工作表放一个列表框控件。 具体步骤是在【开发工具】选项卡下单击【插入】按钮,在弹出来的选项菜单中选择ActiveX控件列表框,画在当前工作表。位置随便,大小不论,丑美无关……毕竟这些你说了都不算,待会代码会设置。 adcc8d1b6a250ebd112b12a0d107c423.png
需要说明的是,如果这是你放置的第1个列表框控件,它会被系统默认名称为ListBox1。这个名字很重要,代码里都是按这个名字控制它的 最后退出设计模式,也就是点击【开发工具】选项卡下的【设计模式】按钮。 8c564e82e2d7c70f17e068ed3a3206b8.png
好了,把以下代码复制粘贴到目标工作表的VBE编辑窗口即可。比如我们这里是粘贴到名称为“入库单”工作表。 0469ee7321f7a8b4ccb8156054a30090.png
代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column <> 2 Or Target.Row < 4 Then ListBox1.Visible = False: Exit Sub
    '如果选中的单元格不是第2列,或者小于4行,也就是不在目标范围内,则退出程序
    If Target.Columns.Count > 1 Or Target.Rows.Count > 1 Then ListBox1.Visible = False: Exit Sub
    '如果选中的单元格大于1个,则退出程序
    With Sheets("参数表")
        r = .Range("a1:c" & .Cells(Rows.Count, "a").End(xlUp).Row).Value
    End With
    With ListBox1
        '调整位置到单元格处
        .Top = Target.Top 'listbox的顶端位置
        .Left = Target.Left + Target.Width 'listbox的左端位置
        .Width = 250 '宽度
        .Height = 150 '高度
        .Visible = True '可见
        '.ColumnHeads = True '显示标题行
        .ColumnCount = 3 '三列
        .ColumnWidths = "50;120;50" '设置第一列宽度50第二列宽度120……
        .List = r '数据来源
        .MultiSelect = fmMultiSelectMulti '允许通过鼠标点击的方式进行多选
        .ListStyle = fmListStyleOption '选项按钮设置为方形
    End With
End Sub
Private Sub ListBox1_Change()
    Dim i As Long, strMy As String
    With ListBox1
        If .Selected(0) = True Then .Selected(0) = False
        '如果用户选取的是标题行那么撤销选取
        For i = 1 To .ListCount - 1
        '遍历listbox的记录,如果被选中则按换行符合并
            If .Selected(i) = True Then
                strMy = strMy & vbCrLf & .List(i, 1)
                '取list的第二列
                '无论列还是行的索引都是从0开始的,因此第二列为1
            End If
        Next
    End With
    ActiveCell.Value = Mid(strMy, 3)
    '数据写入单元格
End Sub

小贴士:
代码有两个部分,一部分是工作表的Worksheet_SelectionChange事件。当用户选择单元格时,设置列表框的位置、大小和数据。本例中列表框只出现在B列,且行数大于3的情况下。这个可以根据实际情况,自己进行修改。 另一部分是列表框的ListBox1_Change事件,当用户选择列表框的数据时,将数据写入单元格。 其实相关代码都有注释,这里就不再啰嗦了 示例文件下载:https://pan.baidu.com/s/1sKf9dl64E8ocKYWxY7Edng
提取码:ebgb

更多资源和教程

  • 零基础学SQL in Excel 25篇合集

  • VBA爱好者请进,VBA代码宝概述


©EH看见星光

1434391bae344b4c54375583b2cb9c49.png

《VBA经典代码应用大全》 当当、天猫、京东均有销售~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值