我的案例

一、单子上写"1,2,5-10",下游却要一行一个号

这套拆法只用勤哲 Excel 服务器自带的字符串函数,不写一行代码。

台号、房号这类字段,录入的人图省事,习惯按区间写:1,2,5-10,12-18,九个字符代表十五个号。

人看着不费劲,系统看着就麻烦。后面的派工、收费、巡检都要一行一个号,区间不拆开就对应不到人。

这类拆分在编程语言里是道小题:按逗号切开,遇到横杠再展开。可勤哲 Excel 服务器里没有脚本入口,能用的只有表、公式和模板。

下面这套三步法,就是在这个限制下想出来的:不写代码,只用字符串函数加一张辅助表,把混合区间拆成明细行。

主表台号录入示例,输入 1,2,5-10,12-18
图1 录入现场:一行里混着单号和区间,共十五个台号

二、第一步:按逗号切开,把难题变成四个样本

拆分的起点是字符串拆分函数:给一个源串和一个分隔符,它按分隔符把串切成多行。这里的分隔符就是逗号。

公式写在明细表的源数据列上,取主表的台号字段,逗号作为分隔。执行一次,一行变四行:1、2、5-10、12-18。

切完之后问题就清楚了:四行里有两行是纯数字,两行带横杠。纯数字的直接用,带横杠的才需要展开。

这一步的价值在于把一个大问题拆成了两类小问题。后面所有的判断,都围绕"这一行有没有横杠"展开。

按逗号拆分后的明细结果,四行数据
图2 拆分结果:一行变四行,两类样本分开了

三、第二步:先找横杠在第几位,再取前后两段

要把 5-10 变成 5 到 10,得先知道横杠站在第几个字符上。字符串查找函数做的就是这件事:找不到返回 0,找到返回位置。

拿到位置之后,用取子串分两次截:从头截到横杠前一位,是起始值;从横杠后一位截到末尾,是结束值。截取长度靠总长度减位置算出来,不用手工数。

纯数字的行没有横杠,查找返回 0。这时用条件取值兜一下:位置为 0 就原样返回,不为 0 才做截取。一行公式同时管两种情形。

两列并排放在明细表里:一列起始值,一列结束值。检查的时候一眼能看出哪一行截错了。

辅助模板,预置连续数字序列
图3 辅助模板:一列连续数字,等着被取用
字符串查找确定横杠位置的计算结果
图4 定位横杠:位置一出来,截取才有依据
分别提取横杠前后起止数字的结果
图5 取前后段:起始值、结束值各占一列

四、第三步:中间那些号,从辅助表里取

起始值和结束值都有了,中间的 6、7、8、9 从哪来?答案是辅助模板。

辅助表只有一列,预置一长串连续数字,从 1 一直排下去。它不参与业务,只在需要展开区间时被查一次。

提取的条件是:辅助表里的数大于等于起始值,且小于等于结束值。满足就取出来,一条区间于是一变多行。

这种做法看着笨,却避开了循环和递归。在只能用公式的平台上,"用表代替循环"是最稳的一条路:辅助表多长,能展开的区间就有多长。

从辅助模板提取连续序列后的明细结果
图6 补中间段:区间按辅助表的数字逐行展开

五、三步之间怎么串:一张表看清函数分工

把三步放在一起看,每个函数只干一件事:拆分负责分行,查找负责定位,取子串负责截段,条件取值负责兜底,辅助表负责补数。

在勤哲里把三步串起来之后,整条链路是自动的。主表改一个台号,明细表跟着重算,不需要谁去点一下"刷新"。

这也是这类做法最实用的地方:录入的人只管按习惯写,展开的事交给系统。前端不必培训,后端不必写代码。

步骤解决的问题关键函数与做法
第一步把一行混合文本切成独立样本字符串拆分,以逗号为分隔符,一行变多行
第二步判断有没有区间符,并取出起止值字符串查找定位横杠,取子串截前后段,条件取值兜住无横杠的行
第三步把起止值之间的号补全辅助模板预置连续数字,按"不小于起始、不大于结束"取数
最终拆分效果,混合区间全部展开为明细行
图7 最终效果:十五个台号一行一个,下游可以直接用

六、能复用的不是公式,是这套拆法

同样的思路可以搬到别的场景:房号写成"3-508 至 3-512"、批次写成"A01-A09"、工位写成"1,4,7-9",拆法一模一样,换个分隔符和字段就行。

要注意的只有两点。辅助表的连续数字要够长,长度决定了能展开多大的区间;起始值和结束值要转成数值再比较,否则字符串比较会得出奇怪的结果。

勤哲 Excel 服务器的字符串函数不算多,但组合起来够用。真正决定成败的不是函数多少,而是有没有把问题拆成"切开—定位—补齐"这三段。

需要完整的公式模板,可以加刘老师微信 15652289126 索取,说明是台号拆分场景即可。

欢迎光临

游客,您好!

登录后享受更多精彩内容

最新主题

开始您的数字化转型之旅

免费下载试用,一周上手,一个月见效,万家企业的共同选择

Archiver| 手机版| Excel服务器APP应用之家

( 京ICP备17007816 )

联系客服 下载试用 勤哲社区 返回顶部