【制造业案例】根据日期生成单号,保存后自动累加,一个公式解决
创作者俱乐部成员
之前我们发过一期将单据保存为明细的帖子,有小伙伴问其中的单号是怎么根据当天日期自动累加的,下面就为大家详细讲解一下。
⭐【案例描述】
其实像这样自动根据当前日期生成单号,并实现自动累的案例,在制造业经常用到,比如订货单、生产单、出库单等。
如下图,当前日期是“2023年11月17日”,当我们保存第一单的时候,单号为“20231117001”,保存第二单的时候,则变为“20231117002”,第三单“20231117003”……,依次累加。当我们选择别的日期时,也能达到同样的效果,即总是根据所选择日期已有的最大单号加1。
⭐【操作效果】
⭐【实现过程】
其实这个问题并不需要复杂的代码,只需要一个公式就可以解决。
公式:
=IFERROR(LOOKUP(1,0/(LEFT(出库明细!A2:A65535,8)=TEXT(F5,"yyyymmdd")),出库明细!A2:A65535)+1,TEXT(F5,"yyyymmdd")&"001")
公式说明:
先用LOOKUP在明细表A列中查找日期(F5单元格),如果能找到,就直接加1,如果不能找到,就直接用日期加上“001”。
公式详解:
TEXT(F5,"yyyymmdd")——将日期格式化,即将“2023年11月17”转换为“20231117”;
LEFT(出库明细!A2:A65535,8)=TEXT(F5,"yyyymmdd")——判断明细表A列中已有单号的前8位是否与格式化后的日期相同;
LOOKUP(1,0/(LEFT(出库明细!A2:A65535,8)=TEXT(F5,"yyyymmdd")),出库明细!A2:A65535)+1——如果日期相同,则返回该单号,并且+1,则得到新的单号;
IFERROR(LOOKUP(1,0/(LEFT(出库明细!A2:A65535,8)=TEXT(F5,"yyyymmdd")),出库明细!A2:A65535)+1,TEXT(F5,"yyyymmdd")&"001")——如果在明细表A列中找不到当前日期,则直接用当前日期格式化后连接上“001”,即作为当天的第一个单号。
公式固化:
为防止不小心动到公式,我们可以将公式写到JS代码中,即使动到了,也可以在点击清空按钮的时候重新自动输入公式。
Range("k3").Value2 = "=IFERROR(LOOKUP(1,0/(LEFT(出库明细!A2:A65535,8)=TEXT(F5,\"yyyymmdd\")),出库明细!A2:A65535)+1,TEXT(F5,\"yyyymmdd\")&\"001\")"
当然,这样的功能必须要配合代码使用,因为单纯的公式,是不能将自身产生的结果保存下来的,只有将上一个单号保存到明细表中,才能实现下一个单号的累加,所以我们需要一段保存代码。
📌 | function 保存出库单(){ n1 = Range("c18").End(3).Row //物品信息最后行号 let sh = Sheets("出库明细") //将出库明细表定义为sh n2 = sh.Range("A65535").End(3).Row + 1 //获取出库明细表最后一行的下一行号 n3 = n2+n1-7 //得到出库明细最后一行加上物品行数之后的行号 sh.Range("a" + n2+":a"+n3).Value2 = Range("k3").Value2 //单号 sh.Range("b" + n2+":b"+n3).Value2 = Range("f5").Value2 //日期 Range("c7:k"+n1).Copy() //复制物品信息 sh.Range("c" + n2).PasteSpecial(xlPasteValues) //粘贴物品信息 sh.Range("L" + n2+":L"+n3).Value2 = Range("c4").Value2 //供应商 sh.Range("m" + n2+":m"+n3).Value2 = Range("c5").Value2 //供应商联系人 sh.Range("n" + n2+":n"+n3).Value2 = Range("k5").Value2 //经办人 出库单清空() MsgBox("保存成功!") } |
⭐【素材下载】