这套拆法只用勤哲 Excel 服务器自带的字符串函数,不写一行代码。
台号、房号这类字段,录入的人图省事,习惯按区间写:1,2,5-10,12-18,九个字符代表十五个号。
人看着不费劲,系统看着就麻烦。后面的派工、收费、巡检都要一行一个号,区间不拆开就对应不到人。
这类拆分在编程语言里是道小题:按逗号切开,遇到横杠再展开。可勤哲 Excel 服务器里没有脚本入口,能用的只有表、公式和模板。
下面这套三步法,就是在这个限制下想出来的:不写代码,只用字符串函数加一张辅助表,把混合区间拆成明细行。
这套拆法只用勤哲 Excel 服务器自带的字符串函数,不写一行代码。
台号、房号这类字段,录入的人图省事,习惯按区间写:1,2,5-10,12-18,九个字符代表十五个号。
人看着不费劲,系统看着就麻烦。后面的派工、收费、巡检都要一行一个号,区间不拆开就对应不到人。
这类拆分在编程语言里是道小题:按逗号切开,遇到横杠再展开。可勤哲 Excel 服务器里没有脚本入口,能用的只有表、公式和模板。
下面这套三步法,就是在这个限制下想出来的:不写代码,只用字符串函数加一张辅助表,把混合区间拆成明细行。
拆分的起点是字符串拆分函数:给一个源串和一个分隔符,它按分隔符把串切成多行。这里的分隔符就是逗号。
公式写在明细表的源数据列上,取主表的台号字段,逗号作为分隔。执行一次,一行变四行:1、2、5-10、12-18。
切完之后问题就清楚了:四行里有两行是纯数字,两行带横杠。纯数字的直接用,带横杠的才需要展开。
这一步的价值在于把一个大问题拆成了两类小问题。后面所有的判断,都围绕"这一行有没有横杠"展开。
要把 5-10 变成 5 到 10,得先知道横杠站在第几个字符上。字符串查找函数做的就是这件事:找不到返回 0,找到返回位置。
拿到位置之后,用取子串分两次截:从头截到横杠前一位,是起始值;从横杠后一位截到末尾,是结束值。截取长度靠总长度减位置算出来,不用手工数。
纯数字的行没有横杠,查找返回 0。这时用条件取值兜一下:位置为 0 就原样返回,不为 0 才做截取。一行公式同时管两种情形。
两列并排放在明细表里:一列起始值,一列结束值。检查的时候一眼能看出哪一行截错了。
起始值和结束值都有了,中间的 6、7、8、9 从哪来?答案是辅助模板。
辅助表只有一列,预置一长串连续数字,从 1 一直排下去。它不参与业务,只在需要展开区间时被查一次。
提取的条件是:辅助表里的数大于等于起始值,且小于等于结束值。满足就取出来,一条区间于是一变多行。
这种做法看着笨,却避开了循环和递归。在只能用公式的平台上,"用表代替循环"是最稳的一条路:辅助表多长,能展开的区间就有多长。
把三步放在一起看,每个函数只干一件事:拆分负责分行,查找负责定位,取子串负责截段,条件取值负责兜底,辅助表负责补数。
在勤哲里把三步串起来之后,整条链路是自动的。主表改一个台号,明细表跟着重算,不需要谁去点一下"刷新"。
这也是这类做法最实用的地方:录入的人只管按习惯写,展开的事交给系统。前端不必培训,后端不必写代码。
| 步骤 | 解决的问题 | 关键函数与做法 |
|---|---|---|
| 第一步 | 把一行混合文本切成独立样本 | 字符串拆分,以逗号为分隔符,一行变多行 |
| 第二步 | 判断有没有区间符,并取出起止值 | 字符串查找定位横杠,取子串截前后段,条件取值兜住无横杠的行 |
| 第三步 | 把起止值之间的号补全 | 辅助模板预置连续数字,按"不小于起始、不大于结束"取数 |
同样的思路可以搬到别的场景:房号写成"3-508 至 3-512"、批次写成"A01-A09"、工位写成"1,4,7-9",拆法一模一样,换个分隔符和字段就行。
要注意的只有两点。辅助表的连续数字要够长,长度决定了能展开多大的区间;起始值和结束值要转成数值再比较,否则字符串比较会得出奇怪的结果。
勤哲 Excel 服务器的字符串函数不算多,但组合起来够用。真正决定成败的不是函数多少,而是有没有把问题拆成"切开—定位—补齐"这三段。
需要完整的公式模板,可以加刘老师微信 15652289126 索取,说明是台号拆分场景即可。