多人填同一张表时,靠口头约定“这里只能填华东、华南、华北”很容易出错。数据验证(旧版叫“数据有效性”)可以在输入阶段拦住错误值,也可以做级联下拉、日期范围和自定义公式校验。
| 允许类型 | 用途 | 示例 |
|---|---|---|
| 序列 | 下拉列表 | 华东、华南、华北 |
| 整数 | 数量、人数 | 1 到 999 |
| 小数 | 金额、比例 | 0 到 1 |
| 日期 | 截止日期 | 不早于今天 |
| 时间 | 排班时间 | 09:00 到 18:00 |
| 文本长度 | 编号、手机号 | 11 位 |
| 自定义 | 复杂条件 | 公式返回 TRUE |
在“允许”里选“序列”,来源可以写:
华东,华南,华北
也可以引用区域:
=$J$2:$J$4
或者引用已定义的名称:
=地区列表
来源区域最好放在单独的参数表里,不要写死在公式中;新增地区时只改参数表,不用逐格改验证。
级联下拉依赖“名称管理器 + INDIRECT”:
=INDIRECT($A2),其中 A2 是当前行的省份。注意 INDIRECT 是易失函数,名称拼写错误会直接返回 #REF!;省份名里有空格、数字开头时,名称定义和 INDIRECT 都容易出错,尽量用简短的中文名称。
“允许 → 自定义 → 公式”里写一个返回 TRUE/FALSE 的公式。公式以选中区域的左上角为基准,引用方式决定它怎样套到其他单元格。
| 目标 | 公式 |
|---|---|
| 只能填工作日 | =WEEKDAY(A2,2)<=5 |
| 结束日期不早于开始日期 | =B2>=A2 |
| 编号不能重复 | =COUNTIF($A$2:$A$100,$A2)=1 |
| 只能填 18 位身份证 | =AND(LEN(A2)=18,ISNUMBER(--LEFT(A2,17))) |
| 邮箱包含 @ 和点 | =AND(ISNUMBER(FIND("@",A2)),ISNUMBER(FIND(".",A2))) |
自定义公式不要写 =IF(...) 再返回文本;验证只认 TRUE/FALSE,返回其他值会被当成失败。
Worksheet_Change 事件校验。#REF!;参数表要放在稳定位置。合上页面,先回答,再展开对照。
INDIRECT($A2) 的作用是什么?
小程序版
微信扫码,随时查命令