一步制作多表单工资条,轻松节省5倍时间,很好用,就是有点难
财务部的小姐姐做工资时,都是每个部门分别做工资条,因为每个部门的工资是在不同的表单里的。最近突然犯懒,说不想一个一个的做了,问能否跨表单,一步生成全部工资条。想着用VBA也就是个遍历各表的事,就满口答应了。结果,补充了个附加条件,因为不会VBA,所以要求不能用VBA做。话已出口,只能用函数死磕公式了。经过一番琢磨,原来还真可以跨表制作工资条。公式写成后,原来要分5次制作的工资条,现在在一个表里只一次就搞定。打印时,原来要打5次,现在也是一次解决,轻轻松松节省5倍时间。唉,懒人又一次推动了我个人的技术进步,特分享一下。
先来看各部门的工资表单:
工程部工资表:
财务部工资表:
工经部工资表:
公关部工资表:
后勤部工资表:
从上可以看出,各表单表格样式是不规范的,比如后勤部的表单标题下第2、3行为空行,公关部表单则标题下无空行,而工程部的表单则压根就没有标题行。而且各部门的工资表表头还不一定一样,需要各部门分别用各自的工资表头。最终要达到工资条表单中显示效果为:
表中圆圈部分的不同,反应了各部门分别用的不同表头的效果。
此时,在各部门的表单里随意增减员工行数或工资表项目列数,都可以在工资条中自动更新,以后财务只需将各部门的工资表单数据设置好就不用管了,工资条是自动生成的。
实现这个效果用到了辅助数据区,共用到3个公式,具体如下:
辅助数据区:
辅助数据区分为两行,第一行为各部门表单的表单名,且直接手动输入;第二行为各部门表单内员工个数,为证书编辑公式生成,当表单员工发生变化时,对应个数随之变化。
X2单元格公式:=MATCH(9E+30,INDIRECT(X1&"!A:A"))-MATCH(1,INDIRECT(X1&"!A:A"))+1
公式解析:用对应X1单元格为名字的表单内A列最末尾有数据的行号,减去A列序号1所在的行号。用工程部表单来举例说明:
上图中首先求A列最末尾有数据行的行号:MATCH(9E+30,INDIRECT(X1&"!A:A"))=5,序号1对应的行号为MATCH(1,INDIRECT(X1&"!A:A"))=3,5-3+1=3,所以通过这个公式得到工程部表单的员工数为3名。只要序号编辑没问题,用这个公式来求得员工数就不存在问题。
工资条表单序号:
由于工资条是将各部门员工汇总后统计制作工资条,要求序号统一重新排列。所以,工资条表单A列单独编辑公式。
A1单元格公式:=IF(B1<>"",IF(MOD(ROW(),2)=1,"序号",ROW()/2),"")
工资条表单内容:
B列至U列为各部门表单工资及相应表头内容,B2单元格公式为:
=IF(MOD(ROW(),2)=1,IF(ROW()/2<=$X$2,OFFSET(INDIRECT($X$1&"!a"&MATCH(1,INDIRECT($X$1&"!A:A"))),-1,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2,OFFSET(INDIRECT($Y$1&"!a"&MATCH(1,INDIRECT($Y$1&"!A:A"))),-1,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2,OFFSET(INDIRECT($Z$1&"!a"&MATCH(1,INDIRECT($Z$1&"!A:A"))),-1,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2+$AA$2,OFFSET(INDIRECT($AA$1&"!a"&MATCH(1,INDIRECT($AA$1&"!A:A"))),-1,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2+$AA$2+$AB$2,OFFSET(INDIRECT($AB$1&"!a"&MATCH(1,INDIRECT($AB$1&"!A:A"))),-1,COLUMN()-1,,),""))))),IF(ROW()/2<=$X$2,OFFSET(INDIRECT($X$1&"!a"&MATCH(1,INDIRECT($X$1&"!A:A"))),ROW()/2-1,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2,OFFSET(INDIRECT($Y$1&"!a"&MATCH(1,INDIRECT($X$1&"!A:A"))),ROW()/2-1-$X$2,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2,OFFSET(INDIRECT($Z$1&"!a"&MATCH(1,INDIRECT($Z$1&"!A:A"))),ROW()/2-1-$X$2-$Y$2,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2+$AA$2,OFFSET(INDIRECT($AA$1&"!a"&MATCH(1,INDIRECT($AA$1&"!A:A"))),ROW()/2-1-$X$2-$Y$2-$Z$2,COLUMN()-1,,),IF(ROW()/2<=$X$2+$Y$2+$Z$2+$AA$2+$AB$2,OFFSET(INDIRECT($AB$1&"!a"&MATCH(1,INDIRECT($AB$1&"!A:A"))),ROW()/2-1-$X$2-$Y$2-$Z$2-$AA$2,COLUMN()-1,,),""))))))
公式思路为:通过判断所在行的行号与辅助区第二行各部门人员数量进行对比,用来确定该用哪个表单的数据。根据行号的奇偶数判断是该用表头还是用具体工资数据。
特点:公式适用性较好,部门表单里随意增减行或列,都能在工资条里自动适应更新。如果各部门表单表头都一样的话,公式长度可减少一半。
表单内容公式比较长,理解起来有一定难度,本文主要为记录这个解题思路。其实这种长公式用函数是很复杂的,若用VBA就简单得多,本文不详述,想要代码的可留言或私信。
欢迎感兴趣的朋友留言交流。
#学习路径#