用数据验证做下拉列表、数值范围、日期限制和输入提示

适用场景

多人填同一张表时,靠口头约定“这里只能填华东、华南、华北”很容易出错。数据验证(旧版叫“数据有效性”)可以在输入阶段拦住错误值,也可以做级联下拉、日期范围和自定义公式校验。

基本设置

  1. 选中要限制的单元格或区域。
  2. “数据 → 数据验证”。
  3. 在“设置”里选择允许的类型。
允许类型 用途 示例
序列 下拉列表 华东、华南、华北
整数 数量、人数 1 到 999
小数 金额、比例 0 到 1
日期 截止日期 不早于今天
时间 排班时间 09:00 到 18:00
文本长度 编号、手机号 11 位
自定义 复杂条件 公式返回 TRUE

下拉列表

在“允许”里选“序列”,来源可以写:

华东,华南,华北

也可以引用区域:

=$J$2:$J$4

或者引用已定义的名称:

=地区列表

来源区域最好放在单独的参数表里,不要写死在公式中;新增地区时只改参数表,不用逐格改验证。

级联下拉

级联下拉依赖“名称管理器 + INDIRECT”:

  1. 建两张参数表:一张是省份,一张是每个省份对应的城市。
  2. 把每个省份的城市区域定义成同名名称,例如“浙江”“江苏”。
  3. 第一个下拉放省份列表。
  4. 第二个下拉的来源写 =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,返回其他值会被当成失败。

易错点

相关条目

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 数据验证能拦住已经存在的非法值吗?
  2. 为什么从别处粘贴数据可能绕过下拉限制?
  3. 级联下拉里 INDIRECT($A2) 的作用是什么?
答案
  1. 不能,验证只对新输入生效;已有非法值要用“圈释无效数据”找出来手动修。
  2. 粘贴会覆盖目标单元格的验证规则,或直接写入不经过验证;严格场景要配合保护工作表或 VBA 校验。
  3. 用当前行的省份名找到同名名称区域,返回该省份对应的城市列表。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令