你是否在 Excel 录入纸质材料时,遇到过这些令人头疼的问题?
✅ 手动输入多项选择时,用逗号分隔却总是出错,多人录入更是难以统一?
✅ 想要实现下拉多选,却发现选择新项时,旧值总是被覆盖?
✅ 希望在选择时,避免重复选择相同选项?
别急!上海信息化培训中心SITC提供全网最权威的简易教程,在 Excel 完美实现下拉多选,并防止重复选项! 只需 1 分钟,直接复制代码即可使用!
适用场景
- 数据录入:适用于需要频繁录入多项选择的场景。
- 多人协作:确保多人录入时数据的一致性。
- 数据验证:提高数据录入的准确性和效率。
最终效果
用户操作 结果(D2 单元格) 选择 "项目" 项目 选择 "服务" 项目, 服务 再选 "项目"(重复选) 项目, 服务(✅ 不变) 选择 "产品" 项目, 服务, 产品
第一步:用“数据验证"创建下拉列表
• 选中目标单元格区域(如 D2)
• 点击 数据 → 数据验证
• 允许 选择 “序列”
• 来源 输入:=项目,服务,产品
• 确定,下拉列表就设置好了!
至此可以实现下拉单选

第二步: 打开EXCEL内置的Visual Basic编辑器
在任意工作表标签上方,右键,在弹出的选项列表中,选择「查看代码」。

Excel VBA 编辑器打开后如下所示:

第三步:复制 VBA 代码
复制 以下VBA 代码,并将其粘贴到 VBA 编辑器右侧空白窗口中。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xOld As String
Dim xNew As String
Dim arr() As String
Dim i As Integer
Dim exists As Boolean
On Error Resume Next
' 仅对 D列 范围的单元格生效
If Not Intersect(Target, Me.Range("D:D")) Is Nothing Then
Application.EnableEvents = False ' 关闭事件,防止无限循环
xOld = Trim(Target.Value) ' 记录修改后的值
Application.Undo ' 撤销用户输入
xNew = Trim(Target.Value) ' 获取撤销后的值(即之前的值)
' 处理撤销导致的空值问题
If xOld = "" Then Exit Sub ' 如果输入为空,直接退出
' 如果撤销后为空,则意味着之前无内容,直接赋值
If xNew = "" Then
Target.Value = xOld
Else
' 拆分已有选项,检查是否已包含新选项
arr = Split(xNew, ", ")
exists = False
For i = LBound(arr) To UBound(arr)
If StrComp(arr(i), xOld, vbTextCompare) = 0 Then
exists = True ' 发现新值已存在(忽略大小写)
Exit For
End If
Next i
' 如果新值不存在,则追加
If Not exists Then
Target.Value = xNew & ", " & xOld
Else
Target.Value = xNew ' 选项已存在,不变
End If
End If
Application.EnableEvents = True ' 重新开启事件
End If
End Sub
第四步:保存并测试
1. 关闭 VBA 编辑器(Alt + Q)
2. 保存 Excel 文件(必须保存为启用宏的工作簿 .xlsm)
3. 测试效果:
• 选择 "小狗",然后选 "小猫",单元格内容应变为 "小狗, 小猫"
• 再次选 "小狗",单元格不会重复添加小狗!
第五步:筛选查询,快速筛选包含特定值的行
录入纸质材料多半是为了便于检索查询。在 Excel 中,如果你希望在下拉多选的情况下,筛选出包含某个特定值(如“小狗”)的所有行,无论它是单独出现还是与其他值一起出现(如“小狗,小猫”),最直观的方法是1:使用“筛选”功能 + 通配符*
- 步骤:
- 确保你的数据区域包含标题行。
- 选中数据区域,点击 数据 选项卡中的 筛选 按钮(或按
Ctrl + Shift + L
)。 - 在标题行中,点击下拉箭头,选择 文本筛选 > 包含。
- 在弹出的对话框中,输入
*小狗*
(*
是通配符,表示任意字符)。 - 点击“确定”,Excel 会筛选出所有包含“小狗”的行。
- 示例:
- 如果某单元格内容是“小狗”或“小狗,小猫”,都会被筛选出来。
常见问题
Q1:如何修改适用列?
在 VBA 代码中,找到这行:
If Not Intersect(Target, Me.Range("D:D")) Is Nothing Then
如果你想支持相邻的D列和E列,可以改为
If Not Intersect(Target, Me.Range("D:E")) Is Nothing Then
如果你想支持不相邻的 D 列、F 列,可以改为:
If Not Intersect(Target, Union(Me.Range("D:D"), Me.Range("F:F"))) Is Nothing Then
Q2:为什么 Excel 没反应?
检查以下几点: ✅ 是否 已启用宏?(Excel 可能禁用了 VBA 宏) ✅ 是否 Excel 已保存为 .xlsm 格式? ✅ 按 F5 运行 VBA 代码,看看是否报错?
Excel 可能禁用了 VBA 宏,如何取消该禁止,EXCEL选项-信任中心-宏设置中,启用所有宏

通过上述简易方法,成功地在Excel中实现了下拉列表的多选效果
✅ 扩展Excel基本功能, 轻松实现下拉多选 ✅ 多选不会重复选择相同选项 ✅ 适用于多列,适用范围可自定义
💡 你学会了吗?如果有任何问题,欢迎各企事业单位联系上海信息化培训中心SITC定制EXCEL高级数据课程! 🚀