ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3680|回复: 2

[分享] 如何实现下拉菜单通过复选框多选

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-12-22 22:26 | 显示全部楼层 |阅读模式
教程来源于网络将工作表sheet2名称修改为“data”,并在A列输入下拉选项。

插入ListBox(列表框)控件。

1) 在工作表sheet1中,选择A列,点击“开发工具”选项卡,选择“插入”里的“列表框”,放置到A列中。

2) 选中列表框控件,点击“设计模式”,在设计模式下点击“属性”,弹出ListBox属性框,选择“按分类序”。修改MultiSelect项为“1 – fmMultiSelectMulti”,修改ListStyle项为“1 – fmListStyleOption”,设置ListFillRange项为所选菜单选项所在的表格名称和单元格范围,具体格式为“data!A1:A8”。
插入代码。 在Excel中点击开发工具中的“Visual Basic”,打开VB编辑器,在VB编辑器中双击Sheet1,打开sheet1的编辑器,将以下代码粘贴到编辑器中并保存。

在sheet1中保存代码:
  1. Private Sub ListBox1_Change()

  2.     If ReLoad Then Exit Sub '见下方说明

  3.     For i = 0 To ListBox1.ListCount - 1

  4.         If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)

  5.     Next

  6.     ActiveCell = Mid(t, 2)

  7. End Sub

  8. Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  9.     With ListBox1

  10.         If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then

  11.             t =ActiveCell.Value

  12.             ReLoad = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。

  13.             For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容

  14.                 If InStr(t, .List(i)) Then

  15.                     .Selected(i) = True

  16.                     Else

  17.                     .Selected(i) = False

  18.                 End If

  19.             Next

  20.             ReLoad = False

  21.             .Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框

  22.             .Left = ActiveCell.Left

  23.             .Width = ActiveCell.Width

  24.             .Visible = True

  25.             Else

  26.             .Visible = False

  27.         End If

  28.     End With

  29. End Sub
复制代码
在VB编辑器中双击Sheet2,将以下代码粘贴到编辑器中并保存。(该段代码是为了动态设置下拉菜单选项值而加的,如果下拉菜单的选项值固定,可以直接在ListBox的ListFillRange属性中指定,不要以下的代码)

在sheet2(data)中保存代码:
  1. Private Sub Worksheet_Change(ByVal Target As Range)

  2.     Sheets("Sheet1").ListBox1.ListFillRange = "data!a1:a" & Cells(1, 1).End(xlDown).Row

  3. End Sub
复制代码
将代码保存后,关闭VB编辑器,在sheet1工作表中,点击A列单元格,结果如下图所示。

在模块1中保存:

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-23 13:22 | 显示全部楼层
求助各位大神,如何实现多列下拉菜单多选的效果

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-23 17:15 | 显示全部楼层
komasun 发表于 2021-12-23 13:22
求助各位大神,如何实现多列下拉菜单多选的效果

Private Sub Worksheet_Change(ByVal Target As Range)
' Developed by Contextures Inc.
' www.contextures.com
Dim rngDV As Range
Dim oldVal As String
Dim newVal As String
If Target.Count > 1 Then GoTo exitHandler

On Error Resume Next
Set rngDV = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitHandler

If rngDV Is Nothing Then GoTo exitHandler

If Intersect(Target, rngDV) Is Nothing Then
   'do nothing
Else
  Application.EnableEvents = False
  newVal = Target.Value
  Application.Undo
  oldVal = Target.Value
  Target.Value = newVal
  If Target.Column = 3 Or Target.Column = 6 Or Target.Column = 1 Then '这里规定好哪一列的数据有效性是多选的,A列是第1列,依次类推,如3就是C列,7就是G列
    If oldVal = "" Then
      'do nothing
      Else
      If newVal = "" Then
      'do nothing
      Else
        If InStr(1, oldVal, newVal) <> 0 Then  '重复选择视同删除
          If InStr(1, oldVal, newVal) + Len(newVal) - 1 = Len(oldVal) Then '最后一个选项重复
            Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 1)
          Else
            Target.Value = Replace(oldVal, newVal & ",", "") '不是最后一个选项重复的时候处理逗号
          End If
        Else '不是重复选项就视同增加选项
        Target.Value = oldVal & "," & newVal
'      NOTE: you can use a line break,
'      instead of a comma
'      Target.Value = oldVal _
'        & Chr(10) & newVal
        End If
      End If
    End If
  End If
End If

exitHandler:
  Application.EnableEvents = True
End Sub

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 14:09 , Processed in 0.028613 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表