财务人必学的 Excel 技巧:数据验证,从源头上防止错误输
- 2026-11-04 21:53:04
月底最后一个下午,小周在工位上对着一张费用报销汇总表,脸色越来越难看。
表是各个部门填的。她要按部门汇总费用,结果一排序,"财务部"变成了三个:财务部、财务、财部,还有一个写的是"财物部"。日期那列更热闹,有的写成2026/8/31,有的写成8月31号,有的干脆写"九月初",排序的时候全乱套。
她一个格子一个格子改,改了俩小时,临下班又发现三笔金额是负数,问了才知道是报销人填错了,把退款也当费用填了进来。
这种事,咱们财务几乎都遇到过。
根源不是填表的人粗心。根源是表格是敞开的,人家想填啥填啥,错了全靠你事后一双眼睛去挑。
Excel 里有个功能,专门解决这个问题,叫数据验证。有些版本叫数据有效性。它的作用一句话说清楚:提前给格子立好规矩,不符合规矩的内容,根本输不进去。
先看看数据验证能管哪些事
选中要设置的区域,点"数据"选项卡里的"数据验证",弹出来一个框,"设置"页里有一堆验证类型,财务常用的就这么几类:
整数、小数。比如金额只能填大于0的数,报销人想填个负数进去,当场就弹提示。
日期。比如开票日期必须在今年1月1日到今天之间,填个2019年的老日期进不来。
文本长度。手机号11位,多一位少一位都不行;纳税人识别号18位,填了17位直接报警。
序列。这个用得最多,就是下拉列表。部门、费用类型、客户等级、资产类别,提前列好选项,填表的人点一下选中,连打字都不用,想写错都没机会。
上面这四类是常规操作,能解决百分之七八十的脏数据。剩下那些更复杂的规矩,靠"自定义",也就是自己写公式,这个等下重点说。
设置的时候还有两个页签别浪费。一个是"输入信息",格子一被选中就弹出提示,比如"请填写11位手机号",填表的人一看就明白该填啥。另一个是"出错警告",输错的时候弹什么,有三种样式:停止、警告、信息。
停止是最硬的,错了就是不让你输进去;警告会问一句是否继续;信息只提示不拦。咱们财务做表,绝大多数规矩用"停止"就对了,错误数据就该挡在门外,放它进来再收拾,成本高十倍。
自定义公式,才是数据验证的真本事
下拉列表、长度限制这些是死规矩。财务工作里有些活规矩,就得写公式。
写公式有三条铁律:公式必须以等号开头;公式算出来的结果必须是 TRUE 或 FALSE,TRUE 放行、FALSE 拦截;引用的单元格行列位置要看准,这是最容易出错的地方。
给大家四个直接能抄的。
第一个,发票号码不允许重复。发票登记表里,假设发票号在A列,从第2行开始填,选中A2往下的区域,自定义公式写:
=COUNTIF($A2:A$1000,A2)=1
意思是当前这个发票号在整个登记区里只能出现一次。第二张票填了同一个号,COUNTIF 算出来是2,公式不成立,当场拦住。
第二个,报销金额不能超过预算。假设A列填费用项目,B列填报销金额,预算表在另一个工作表,A列是项目名、B列是预算数,选中金额区写:
=B2<=VLOOKUP(预算表A:$B,2,0)
填的金额超过这个项目的预算数,公式算出来 FALSE,输不进去。当然你也可以故意用"警告"样式,允许特殊情况放行,但填的人得看到那声提示。
第三个,开票日期必须是工作日。选中日期区,写:=WEEKDAY(A2,2)<=5
WEEKDAY 第二参数填2,周一返回1、周五返回5,周六周日是6和7。周六周日想填日期,进不来。
第四个,两个格子要联动。比如有一列问"是否代垫费用",选了"是",后面的代垫金额就必须填。假设A列填是或否,B列填金额,选中B列区域写:=IF($A2="是",LEN(B2)>0,TRUE)
A列选了"是"而B列空着,公式不成立,不让通过;A列选"否",公式直接返回 TRUE,B列填不填都行。
这里要提醒一句,网上不少地方教这个联动公式写的是 =AND(是B2<>""),直接放在数据验证里是错的。这个公式的意思是"必须同时满足是且已填",那A列选"否"的时候,公式永远是 FALSE,人家啥都不用填也不让输,完全用不了。写成上面 IF 那样才对。
引用的问题再多说一句。验证公式是写在选区第一个单元格上的,Excel 会自动往下套。所以行号一般用相对引用,让它每行跟着走;列标和统计范围要锁死,用美元符号固定。这个跟条件格式是一个道理,锁错了,整列规则全乱。
两个老手才知道的细节
第一个,数据验证防复制粘贴。
设置了验证的格子,用手敲会拦,但是从别处复制一个值粘贴进来,验证可能被直接带过去或者冲掉,错数据照样能进来。表格发给别人填之前,在"数据验证"旁边有个小箭头,里面有"圈释无效数据",点一下,所有不符合规矩的格子会被红圈圈出来。收回来的表先圈一遍,谁绕过规则填的错,一眼全看见。
第二个,下拉列表的数据源别写死在框里。
选项少,比如是和否,可以直接在序列来源里写"是,否",逗号隔开。选项多,像部门十几个、客户上百个,就单独建一张"参数表",把选项列在里面,序列来源引用那一列。以后部门改名、新增客户,只改参数表,所有表格的下拉菜单自动更新,不用一张表一张表去改。
说回小周那张报销表
后来她来找我抱怨这事,我让她把表重做了一遍。部门列换成下拉,财务就是财务,财务的人再手快也选不出别的写法。费用类型换成下拉,金额列设了大于0的小数验证,日期列限定在当年,出差天数设了1到365的整数。
表发下去,第二个月收回来,她几乎没再改。填表的人也高兴,不用打字,点几下就完事,还不担心填错挨说。
省出来的俩小时,她拿去把上半年的费用做了个分析,老板看了挺满意。你看,同样的人同样的表,区别就在于你是在源头立规矩,还是在下游擦屁股。
附一张速查表
场景 列 验证类型 设置要点 报销金额 金额列 小数 最小值填0,勾选忽略空值看情况 开票日期 日期列 日期 起止日期设好,防老日期乱入 手机号 联系电话 文本长度 长度等于11 统一社会信用代码 税号列 文本长度 长度等于18 部门 部门列 序列 来源引用参数表,不手写 发票号码 发票号列 自定义 =COUNTIF($A2:A$1000,A2)=1 是否代垫 是/否列 序列 是,否 代垫金额 金额列 自定义 =IF($A2="是",LEN(B2)>0,TRUE)
数据验证是给表格装一道门。门装好了,错的东西进不来,你不用再拿眼睛给全表站岗。
今晚就能做:打开你手头那张别人要填的表,把部门列改成下拉,把金额列加上大于0的限制。五分钟的事,下个月你会感谢自己。