KutoolsforOffice — 一套方案,五大工具。事半功倍。

在 Excel 下拉列表中选择多个项目——完整指南

作者Siluvia修改日期

Excel 下拉列表是确保数据一致性并简化输入的绝佳工具。然而,默认情况下,它仅允许选择单个项目。如果您需要从同一个下拉列表中选择多个项目,该怎么办?本综合指南将为您详细介绍如何在 Excel 下拉列表中启用多选功能、管理重复项、设置自定义分隔符,以及定义这些列表的作用范围。

显示 Excel 下拉列表中多项选择的动画演示截图。

提示:在应用以下方法前,请确保您已在工作表中预先创建了下拉列表。如果您想了解如何创建数据验证下拉列表,请参阅本文中的说明:如何在 Excel 中创建数据验证下拉列表

在下拉列表中启用多选

本节为您提供两种方法,轻松在 Excel 下拉列表中启用多选功能。

使用 VBA 代码

要启用下拉列表的多选功能,您可以借助 Excel 中的“Visual Basic for Applications”(VBA)。通过该脚本,可将下拉列表的行为修改为支持多选。请按以下步骤操作:

步骤 1:打开工作表(代码)编辑器
  1. 打开包含您要启用多选功能的下拉列表所在的工作表。
  2. 右键单击工作表标签,然后从上下文菜单中选择“查看代码”。
    Excel 工作表标签右键菜单中“查看代码”选项的截图
步骤 2:使用 VBA 代码

现在,请将以下 VBA 代码复制并粘贴到已打开的工作表(代码)窗口中。

VBA 代码:在 Excel 下拉列表中启用多选功能。

Private Sub Worksheet_Change(ByVal Target As Range)
'Updated by Extendoffice 20240118
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    Dim delimiter As String
    Dim TargetRange As Range

    Set TargetRange = Me.UsedRange ' Users can change target range here
    delimiter = ", " ' Users can change the delimiter here

    If Target.Count > 1 Or Intersect(Target, TargetRange) Is Nothing Then Exit Sub
    On Error Resume Next
    Set xRng = TargetRange.SpecialCells(xlCellTypeAllValidation)
    If xRng Is Nothing Then Exit Sub
    Application.EnableEvents = False

    xValue2 = Target.Value
    Application.Undo
    xValue1 = Target.Value
    Target.Value = xValue2
    If xValue1 <> "" And xValue2 <> "" Then
        If Not (xValue1 = xValue2 Or _
                InStr(1, xValue1, delimiter & xValue2) > 0 Or _
                InStr(1, xValue1, xValue2 & delimiter) > 0) Then
            Target.Value = xValue1 & delimiter & xValue2
        Else
            Target.Value = xValue1
        End If
    End If

    Application.EnableEvents = True
    On Error GoTo 0
End Sub

粘贴到 Excel VBA 编辑器中的 VBA 代码截图

效果

返回工作表后,下拉列表将允许您选择多个选项,请参见下方演示:

显示 Excel 下拉列表中多项选择的动画演示截图

注意
上述 VBA 代码:
  • 适用于当前工作表中的所有数据验证下拉列表,包括现有的和未来创建的。
  • 避免您在每个下拉列表中重复选择同一选项。
  • 使用逗号作为选中项目数量的分隔符。如需使用其他分隔符,请查看本节以更改分隔符

通过 Kutools for Excel 仅需几次点击即可完成

如果您不熟悉 VBA,不妨试试更简单的替代方案——使用“Kutools for Excel”的“使下拉列表可多次选择”功能。这款用户友好的工具能轻松实现下拉列表的多选设置,让您自由自定义分隔符,并高效管理重复项,灵活满足多样化需求。

Kutools for Excel 提供超过 300 项高级功能,简化复杂任务,激发创造力并提升效率。集成 AI 功能,Kutools 以精准度自动化任务,让数据管理变得轻而易举。Kutools for Excel 详细信息……         免费试用……

安装 Kutools for Excel 后,转到“Kutools”选项卡,依次选择“下拉列表”>“使下拉列表可多次选择”,然后按如下方式配置。

  1. 指定包含支持多选的下拉列表的区域。
  2. 指定下拉列表单元格中所选项目数量的分隔符。
  3. 单击“确定”即可完成设置。
    Kutools 多选下拉列表配置界面截图,包含范围和分隔符选项设置
效果

现在,当您单击限定区域中带有下拉列表的单元格时,其旁边会立即弹出一个列表框。只需点击项目旁的“+”按钮,即可将其添加到下拉单元格中;点击“——”按钮,则可轻松移除不再需要的项目。请参见下方演示:

使用 Kutools 在 Excel 下拉列表中管理多项选择的演示截图

注意
  • 若希望在单元格内垂直显示所选项目数量,请勾选“插入分隔符后换行”选项;若偏好水平排列,则保持该选项未勾选。
  • 如需为下拉列表添加搜索栏,请勾选“启用搜索功能”选项。
  • 要使用此功能,请先 下载并安装 Kutools for Excel

多选下拉列表的更多操作

本节汇总了在数据验证下拉列表中启用多选功能时可能遇到的各种场景。


在下拉列表中允许重复项

当下拉列表允许多选时,重复项可能会引发问题。上述 VBA 代码可防止下拉列表中出现重复项。如需保留重复项,请尝试本节提供的 VBA 代码。

VBA 代码:在数据验证下拉列表中允许重复项

Private Sub Worksheet_Change(ByVal Target As Range)
'Updated by Extendoffice 20240118
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    Dim delimiter As String
    Dim TargetRange As Range

    Set TargetRange = Me.UsedRange ' Users can change target range here
    delimiter = ", " ' Users can change the delimiter here

    If Target.Count > 1 Or Intersect(Target, TargetRange) Is Nothing Then Exit Sub
    On Error Resume Next
    Set xRng = TargetRange.SpecialCells(xlCellTypeAllValidation)
    If xRng Is Nothing Then Exit Sub
    Application.EnableEvents = False

    xValue2 = Target.Value
    Application.Undo
    xValue1 = Target.Value
    Target.Value = xValue2
    If xValue1 <> "" And xValue2 <> "" Then
        Target.Value = xValue1 & delimiter & xValue2
    End If

    Application.EnableEvents = True
    On Error GoTo 0
End Sub
效果

现在,您可以从当前工作表的下拉列表中选择多个项目。若要在下拉列表单元格中重复选择某个项目,请继续从列表中点选该项目。请参见截图:

显示 Excel 下拉列表中重复选择的动画演示截图


从下拉列表中移除现有项目

从下拉列表中选择多个项目后,有时您可能需要移除其中某个已选项目。本节提供了另一段 VBA 代码,助您轻松完成此操作。

VBA 代码:从下拉列表单元格中移除任意现有项目

Private Sub Worksheet_Change(ByVal Target As Range)
    'Updated by Extendoffice 20240118
    Dim xRngDV As Range
    Dim TargetRange As Range
    Dim oldValue As String
    Dim newValue As String
    Dim delimiter As String
    Dim allValues As Variant
    Dim valueExists As Boolean
    Dim i As Long
    Dim cleanedValue As String

    Set TargetRange = Me.UsedRange ' Set your specific range here
    delimiter = ", " ' Set your desired delimiter here

    If Target.CountLarge > 1 Then Exit Sub

    ' Check if the change is within the specific range
    If Intersect(Target, TargetRange) Is Nothing Then Exit Sub

    On Error Resume Next
    Set xRngDV = Target.SpecialCells(xlCellTypeAllValidation)
    If xRngDV Is Nothing Or Target.Value = "" Then
        ' Skip if there's no data validation or if the cell is cleared
        Application.EnableEvents = True
        Exit Sub
    End If
    On Error GoTo 0

    If Not Intersect(Target, xRngDV) Is Nothing Then
        Application.EnableEvents = False
        newValue = Target.Value
        Application.Undo
        oldValue = Target.Value
        Target.Value = newValue

        ' Split the old value by delimiter and check if new value already exists
        allValues = Split(oldValue, delimiter)
        valueExists = False
        For i = LBound(allValues) To UBound(allValues)
            If Trim(allValues(i)) = newValue Then
                valueExists = True
                Exit For
            End If
        Next i

        ' Add or remove value based on its existence
        If valueExists Then
            ' Remove the value
            cleanedValue = ""
            For i = LBound(allValues) To UBound(allValues)
                If Trim(allValues(i)) <> newValue Then
                    If cleanedValue <> "" Then cleanedValue = cleanedValue & delimiter
                    cleanedValue = cleanedValue & Trim(allValues(i))
                End If
            Next i
            Target.Value = cleanedValue
        Else
            ' Add the value
            If oldValue <> "" Then
                Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If
        End If

        Application.EnableEvents = True
    End If
End Sub
效果

这段 VBA 代码让您能够从下拉列表中轻松选择多个项目,并随时移除其中任意已选项——只需再次点击该选项,即可将其取消。

显示如何从 Excel 下拉列表中删除现有项目的动画演示截图


设置自定义分隔符

上述 VBA 代码中的分隔符均设为逗号。您可将该变量修改为任意所需字符,用作下拉列表选项的分隔符。操作方法如下:

如您所见,上述 VBA 代码均包含以下行:

delimiter = ", "

您只需将逗号替换为您所需的任意分隔符即可。例如,若希望使用分号分隔项目,请将该行修改为:

delimiter = "; "
注意:若要在这些 VBA 代码中将分隔符更改为换行符,请将此行修改为:
delimiter = vbNewLine

设置限定区域

上述 VBA 代码适用于当前工作表中的所有下拉列表。若您希望仅对特定范围内的下拉列表应用该 VBA 代码,可按如下方式在代码中指定相应范围。

如您所见,上述 VBA 代码均包含以下行:

Set TargetRange = Me.UsedRange

您只需将该行修改为:

Set TargetRange = Me.Range("C2:C10")
注意:此处 C2:C10 是您希望设置为多选的下拉列表所在的范围。

在受保护的工作表中执行

假设您已使用密码“123”保护了工作表,并在启用保护前将下拉列表所在的单元格设置为“未锁定”,以确保多选功能在工作表受保护后仍可正常使用。然而,上述 VBA 代码在此场景下将无法运行。本节将为您介绍另一段专为在受保护工作表中实现多选功能而设计的 VBA 脚本。

VBA 代码:在下拉列表中启用多选(无重复项)


Private Sub Worksheet_Change(ByVal Target As Range)
    'Updated by Extendoffice 20240118
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    Dim delimiter As String
    Dim TargetRange As Range
    Dim isProtected As Boolean
    Dim pswd As Variant

    Set TargetRange = Me.UsedRange ' Set your specific range here
    delimiter = ", " ' Users can change the delimiter here

    If Target.Count > 1 Or Intersect(Target, TargetRange) Is Nothing Then Exit Sub
    
    ' Check if sheet is protected
    isProtected = Me.ProtectContents
    If isProtected Then
        ' If protected, temporarily unprotect. Adjust or remove the password as needed.
        pswd = "yourPassword" ' Change or remove this as needed
        Me.Unprotect Password:=pswd
    End If

    On Error Resume Next
    Set xRng = TargetRange.SpecialCells(xlCellTypeAllValidation)
    If xRng Is Nothing Then
        If isProtected Then Me.Protect Password:=pswd
        Exit Sub
    End If
    Application.EnableEvents = False

    xValue2 = Target.Value
    Application.Undo
    xValue1 = Target.Value
    Target.Value = xValue2
    If xValue1 <> "" And xValue2 <> "" Then
        If Not (xValue1 = xValue2 Or _
                InStr(1, xValue1, delimiter & xValue2) > 0 Or _
                InStr(1, xValue1, xValue2 & delimiter) > 0) Then
            Target.Value = xValue1 & delimiter & xValue2
        Else
            Target.Value = xValue1
        End If
    End If

    Application.EnableEvents = True
    On Error GoTo 0

    ' Re-protect the sheet if it was protected
    If isProtected Then
        Me.Protect Password:=pswd
    End If
End Sub
注意:在代码中,请务必将 pswd = "yourPassword" 行中的“yourPassword”替换为您实际用于保护工作表的密码。例如,如果您的密码是“abc 123”,则该行应为 pswd = “abc 123“。

在 Excel 下拉列表中启用多选功能,即可大幅提升工作表的功能性与灵活性。无论您熟悉 VBA 编程,还是更倾向于使用 Kutools 这类简便解决方案,都能轻松将标准下拉列表升级为动态多选工具。掌握这些技能后,您将能创建更动态、更用户友好的 Excel 文档。想深入挖掘 Excel 的强大潜能?我们的网站提供丰富教程资源,在此发现更多 Excel 技巧与窍门

最佳办公效率工具

🤖KUTOOLS AI 助手:基于以下内容革新数据分析:智能执行   |  生成代码|  创建自定义公式  |  数据分析及生成图表|  调用 Kutools Functions……
热门功能查找、高亮或标记重复项   |  删除空白行   |  合并列或单元格且不丢失数据   |  不使用公式的四舍五入……
高级 LOOKUP多条件 VLookup  |  多值 VLookup  |   跨多个工作表 VLookup   |   模糊查找……
高级下拉列表快速创建下拉列表   |  级联下拉列表   |  多选下拉列表……
列管理器添加指定数量的列|移动列|切换隐藏列的可见性状态|比较区域与列……
精选功能网格聚焦   |  设计视图   |增强编辑栏   | 工作簿和工作表管理器   |  资源库(自动文本)|  日期提取   |  汇总工作表  |  加密/解密单元格   | 按列表发送电子邮件   |  超级筛选   |   特殊筛选(筛选粗体单元格/斜体/删除线……) ......
热门 15 工具集12 文本工具添加文本删除特定字符,……)|   50+ 图表 类型甘特图,……)|   40+ 实用公式基于生日计算年龄,……)|   19 插入工具插入二维码从路径插入图片,……)|   12 转换工具小写金额转大写汇率转换,……)|   7 合并和拆分工具高级合并行分割单元格,……)|……以及更多
在您的首选语言中使用 Kutools——支持英语、西班牙语、德语、法语、中文及 40+ 种其他语言!

使用 Kutools for Excel 强化您的 Excel 技能,体验前所未有的高效办公!Kutools for Excel 提供超过 300 项高级功能,助您提升工作效率、节省宝贵时间。立即点击此处,获取您最需要的功能……


Office Tab 为 Office 带来标签式界面,让您的工作更轻松

  • 在 Word、Excel、PowerPoint、Publisher、Access、Visio 和 Project 中启用标签式编辑与阅读,大幅提升多文档处理效率!
  • 在同一个窗口的新标签页中打开和创建多个文档,而非在新窗口中操作。
  • 将您的工作效率提升 50%,每天为您减少数百次鼠标点击!

所有 Kutools 插件,一个安装程序

Kutools for Office 套件捆绑了适用于 Excel、Word、Outlook 和 PowerPoint 的插件,以及 Office Tab Pro,是跨 Office 应用高效协作团队的理想之选。

ExcelWordOutlookTabsPowerPoint
  • 一体化套件— Excel、Word、Outlook 和 PowerPoint 插件 + Office Tab Pro
  • 一个安装程序,一个许可证— 几分钟内即可完成设置(支持 MSI)
  • 协同效果更佳— 在多个 Office 应用间实现高效流畅的生产力
  • 30 天全功能试用— 无需注册,无需信用卡
  • 超值之选— 比单独购买插件更省钱