数据验证做下拉菜单与联动
下拉菜单能挡住 90% 的录入错误:部门名统一、状态固定枚举、金额只能填合规区间。核心功能是"数据 → 数据验证"(老版本叫数据有效性)。
一、最基础的序列下拉
选中要限制的区域 → 数据验证 → 允许"序列" → 来源填:
已下单,已发货,已完成,已取消
注意是英文逗号分隔。中文逗号会被当成分隔符吗?不会——中文逗号会让整串变成一个选项,这是最常见的失败原因。
选项少(5 个以内)直接内联写;多了就引用区域,见下一节。
二、引用其他区域做选项
来源写:
=$J$2:$J$20
或对区域起个名字(公式 → 名称管理器),来源写 =状态列表,公式里可读性好很多。
引用的区域中间不能有空行,否则下拉里会出现空项。要自动扩展,把源区域转成智能表格(Ctrl+T),引用写成 =表1[状态],新增行会自动纳入。
三、二级联动下拉
部门 → 岗位,选完部门后岗位列表跟着变。
第一步:建对照区,每个部门一列,列标题是部门名:
| A | B | C |
|---|---|---|
| 技术部 | 市场部 | 财务部 |
| 后端 | 策划 | 会计 |
| 前端 | 推广 | 出纳 |
第二步:给每列起名字。选中 B 列数据区(不含标题),在名称框输入 市场部 回车。或者批量:选中整个对照区(含标题),公式 → 根据所选内容创建 → 首行。
第三步:部门列的下拉来源写对照区的首行:
=$A$1:$C$1
第四步:岗位列的下拉来源写间接引用:
=INDIRECT(E2)
E2 是同行已选的部门名。INDIRECT 把文本转成区域引用,所以名称里不能有空格和特殊字符,否则报 #REF!。部门名带空格的话,用 SUBSTITUTE 换成下划线再匹配名称。
四、限制数字与日期范围
允许"整数",介于 1 和 9999 之间,防止手误多打一个 0:
最小值:1 最大值:9999
日期区间限制同理,选"日期"类型,起止填具体日期或 =TODAY()。
文本长度限制适合手机号、身份证号的位数校验:
允许:文本长度 等于:11
五、自定义公式验证
最灵活的一档。想限制"编号必须以 YW 开头且长度 8":
=AND(LEFT(A2,2)="YW",LEN(A2)=8)
写好之后用区域第一个单元格的地址(相对引用),验证会自动套用到整个区域。
想禁止录入重复值:
=COUNTIF($A:$A,A2)=1
注意 $A:$A 整列引用的性能开销,行数多时改成 $A$2:$A$5000。
六、三个输入提示与错误警告
验证对话框有三个页签,别只填第一个:
- 输入信息:选中单元格时弹出的提示,告诉人该填什么格式。比事后报错友好。
- 出错警告:填错时的处理。样式选"停止"就完全禁止,选"警告"允许强行确认。
- 忽略空值:默认勾选,意味着空单元格能通过验证。要禁止留空,取消勾选并另加
=LEN(A2)>0规则。
七、复制验证到其他单元格
最容易出错的点:数据验证会跟着复制粘贴一起走,但引用可能被相对平移。
保险做法:
- 复制带验证的单元格;
- 选中目标区域;
- 选择性粘贴 → 验证。
这样只复制验证规则,不动内容,也不会破坏目标区域已有格式。
八、常见坑
| 现象 | 原因 | 处理 |
|---|---|---|
| 下拉里只有一个长条选项 | 用了中文逗号 | 改英文逗号 |
| 下拉出现空白项 | 源区域有空单元格 | 缩小区域或用智能表格 |
INDIRECT 报 #REF! | 名称含空格/数字开头 | 名称改规范 |
| 粘贴数据后验证失效 | 直接粘了值 | 选择性粘贴"验证" |
| 复制行后规则错位 | 相对引用平移 | 关键引用加 $ |
九、速查
| 需求 | 设置 |
|---|---|
| 固定选项 | 序列 + 英文逗号分隔 |
| 引用区域 | 序列 + =$J$2:$J$20 |
| 二级联动 | 对照区 + 名称 + INDIRECT |
| 数值范围 | 整数 + 最小/最大 |
| 禁止重复 | =COUNTIF($A:$A,A2)=1 |
数据验证只防君子不防小人——粘贴进来的数据会绕过验证。真正要强约束,得靠数据库或表单工具。但作为日常办公,它已经能省掉大部分返工。