🧮 WPS 递归 | 标签打印:4层递归之递归中归中归中归 封神榜!!!

仓库打工人、单证打印朋友刚需!原始订单数据,根据总数量自动拆分,每单上限自定义数量,拆分后自动批量生成标准标签卡片,自带固定表头、完整订单信息、横排多列自动排版、卡片间隔留白、整页自动溢出生成!4 层嵌套递归环环相扣,从数量拆分→单行标签生成→多行数据遍历→整页多列排版,全部纯原生函数一步搞定,不用辅助列、不用复制排版、不用 VBA。今天完整拆解整套 4 层递归公式,每一层自定义函数单独详解、入参参数全释义、函数内部逻辑、每层递归专属作用、整体调用链路全部讲透。

📌 案例背景

数据源区域:B5:D23

  • B4:D4:固定标签表头(订单号、物料编码、数量)

  • B5:D23:原始订单明细(每一行 1 条完整订单:订单号 + 物料编码 + 原始总数量)

  • G2:单张标签最大拆分数量上限(本例 = 9)

  • F2:整页横向每排展示标签个数(本例 = 4)

需求:

  1. 数量拆分:每条原始订单,按照设定上限自动拆分总数量,生成多条子订单,拆分后所有子数量之和 = 原始总数量

  1. 标签生成:每一条拆分后的子订单,自动生成完整标准标签卡片(自带表头 + 完整数据行)

  1. 自动排版:全部标签横向多列排布、卡片之间自动留白间隔,完整整页动态溢出生成,完美匹配右侧最终展示效果。

🧩 完整公式源码(原版完整格式化排版版)

excel

=LET(

TAT,LAMBDA(a,b,IF(TAKE(a,,-1)<=b,a,

VSTACK(HSTACK(TAKE(a,,2),b),TAT(HSTACK(TAKE(a,,2),TAKE(a,,-1)-b),b)))),

TBT,LAMBDA(a,b,IF(ROWS(a)=1,TAT(a,b),

VSTACK(TAT(TAKE(a,1),b),TBT(DROP(a,1),b)))),

TCT,LAMBDA(a,b,IF(ROWS(a)=1,TRANSPOSE(VSTACK(b,a)),

HSTACK(EXPAND(TRANSPOSE(VSTACK(b,TAKE(a,1))),,3,""),TCT(DROP(a,1),b)))),

TDT,LAMBDA(a,b,c,IF(ROWS(a)<=c,TCT(a,b),

IFNA(VSTACK(EXPAND(TCT(TAKE(a,c),b),4,,""),TDT(DROP(a,c),b,c)),""))),

TDT(TBT(B5:D23,G2),B4:D4,F2))

逻辑太难,没画,喜欢的可以研究一下。

🧩 四层递归函数逐层级全拆解

严格从上到下,从底层最基础函数 → 顶层总控函数,逐个讲解:函数名称、入参 3 个参数含义、内部 IF 逻辑、函数专属作用、内部函数用法、承担的工作模块,新手逐层看懂嵌套逻辑。

1. 第一层 底层核心:TAT 数量拆分专用递归函数

excel

TAT,LAMBDA(a,b,

IF(TAKE(a,,-1)<=b,a,

VSTACK(HSTACK(TAKE(a,,2),b),

TAT(HSTACK(TAKE(a,,2),TAKE(a,,-1)-b),b))))

函数入参参数释义

  • a单行原始订单数据数组(订单号 + 物料编码 + 原始总数量 3 列单行数据)

  • b单张标签最大数量上限值(单元格 G2,本次拆分阈值)

内部逻辑 & 递归作用

整个公式的最底层核心拆分函数,唯一工作:单条订单总数量,按照设定上限自动拆分

  1. 终止条件 IF(TAKE(a,,-1)<=b, a, ...)

提取当前数据最后一列(原始总数量),判断剩余数量 ≤ 设定上限

满足条件:无需继续拆分,直接返回本条完整订单数据,拆分递归终止。

  1. 拆分递归主体

  • HSTACK(TAKE(a,,2),b):固定保留「订单号、物料编码」不变,本次拆分数量直接填充为上限值b,生成 1 条完整拆分子订单

  • TAKE(a,,-1)-b:总数量减去本次拆分上限,计算剩余待拆分数量

  • TAT(新剩余数据,b):剩余数量再次传入自身递归,继续拆分,直到全部数量拆分完毕

  • VSTACK:把所有拆分出来的子订单,全部纵向堆叠完整

2. 第二层 数据遍历:TBT 全量原始订单遍历递归函数

excel

TBT,LAMBDA(a,b,

IF(ROWS(a)=1,TAT(a,b),

VSTACK(TAT(TAKE(a,1),b),TBT(DROP(a,1),b))))

函数入参参数释义

  • a全部原始多行订单数据源数组(整张原始订单明细表)

  • b单张标签数量拆分上限(向下透传底层 TAT 函数的拆分阈值)

内部逻辑 & 递归作用

承上启下的遍历函数,工作:批量遍历所有原始订单,逐行调用底层 TAT 拆分函数,完成全部订单全量拆分

  1. 终止条件 IF(ROWS(a)=1, TAT(a,b), ...)

当前剩余数据只剩单行订单,直接调用底层TAT完成本条全部数量拆分,本条遍历结束。

  1. 遍历递归主体

  • TAKE(a,1):提取当前第 1 行原始订单

  • TAT(TAKE(a,1),b):调用底层函数,完成本条订单完整数量全拆分

  • DROP(a,1):砍掉已经处理完毕的本行订单,剩余未处理全部数据

  • TBT(DROP(a,1),b):剩余数据递归自身,逐行遍历所有订单

  • VSTACK:把所有订单拆分完的全部子订单,全部纵向堆叠成完整总数据集。

3. 第三层 标签生成:TCT 单行标签卡片生成递归函数

excel

TCT,LAMBDA(a,b,

IF(ROWS(a)=1,TRANSPOSE(VSTACK(b,a)),

HSTACK(EXPAND(TRANSPOSE(VSTACK(b,TAKE(a,1))),,3,""),TCT(DROP(a,1),b))))

函数入参参数释义

  • a经过前两层拆分完成后的,全部子订单数据集

  • b固定全局表头(B4:D4 订单号、物料编码、数量表头)

内部逻辑 & 递归作用

标签格式化函数,工作:把每一条拆分完成的子订单,生成标准 3 行标签卡片,同时横向初步排版

  1. 终止条件 IF(ROWS(a)=1, TRANSPOSE(VSTACK(b,a)), ...)

当前只剩单条子订单数据

VSTACK(b,a):垂直堆叠【表头行 + 数据行】,再TRANSPOSE转置,生成3 行 1 列标准标签卡片,标签生成递归终止。

  1. 卡片生成递归主体

  • TAKE(a,1):提取当前单条子订单

  • TRANSPOSE(VSTACK(b,TAKE(a,1))):生成本条完整标准标签卡片

  • EXPAND(,,,3,""):卡片右侧扩展 3 列空白,实现标签之间间隔留白

  • DROP(a,1):砍掉已处理本条子订单,剩余数据

  • TCT(DROP(a,1),b):剩余数据递归自身,生成下一个标签卡片

  • HSTACK:把所有生成好的标签卡片,横向依次并排拼接

4. 第四层 顶层总控:TDT 整页多列分页排版总递归函数

excel

TDT,LAMBDA(a,b,c,

IF(ROWS(a)<=c,TCT(a,b),

IFNA(VSTACK(EXPAND(TCT(TAKE(a,c),b),4,,""),TDT(DROP(a,c),b,c)),"")))

函数入参参数释义

  • a经过前三层全部处理完的,所有待排版完整标签数据集

  • b全局固定表头(向下透传给 TCT 函数)

  • c整页横向每排最大标签列数(单元格 F2,本例 = 4,一行最多放 4 个标签)

内部逻辑 & 递归作用

整个公式最顶层总控递归函数,全局统筹所有底层函数,最终完成整页分页排版

  1. 终极全局终止条件 IF(ROWS(a)<=c, TCT(a,b), ...)

剩余待排版标签总数 ≤ 横向每排最大列数

剩余所有标签全部直接调用 TCT 完成排版生成,整体全部递归彻底终止。

  1. 顶层排版递归主体

  • TAKE(a,c):提取当前一排需要展示的c个标签

  • TCT(TAKE(a,c),b):调用第三层函数,完成本排全部标签卡片生成 + 横向排版

  • EXPAND(...,4,,""):整排卡片下方扩展 4 行空白,实现上下排标签的行间距留白

  • DROP(a,c):砍掉本排已经排版完成的全部标签,剩余未排版数据集

  • TDT(DROP(a,c),b,c):剩余标签递归自身,进入下一排排版

  • VSTACK:所有排数全部上下垂直堆叠,生成完整整页排版结果

  • IFNA(,""):异常数据容错,空白报错自动屏蔽。

🧩 最末尾初始总调用全解析

excel

TDT(TBT(B5:D23,G2),B4:D4,F2)

四层函数完整调用链路,从外到内启动顺序:

  1. 先执行内层 TBT(B5:D23,G2):全量原始订单全部完成数量拆分,输出全量拆分子订单

  1. 传入顶层总函数:TDT(拆分完全量数据, 固定表头B4:D4, 横向每排列数F2)

  1. 一键启动整套四层递归,从底层拆分→数据遍历→标签生成→整页排版,全部流程自动跑完,最终完整溢出生成全部排版标签。

⚖️ 公式核心亮点 & 干货总结

延续全系列帖子统一总结模块

  1. 四层递归分工极致清晰,模块完全解耦

拆分、遍历、标签生成、页面排版 4 个工作完全独立成单独递归函数,每层只做一件事,嵌套逻辑干净,后续修改规则只需要改动对应单层函数即可。

  1. 全参数自定义,通用性极强

拆分数量上限、每排标签个数、标签间隔留白、卡片格式全部可自定义,仅修改 G2、F2 单元格数值即可适配所有订单数据。

  1. 全自动全流程闭环

原始订单导入 → 自动数量拆分 → 自动生成标准标签 → 自动多列排版、自动卡片留白间隔,全程无需手动操作。

  1. 原生动态数组溢出

仅单个单元格输入完整公式,全部标签整页自动溢出生成,无辅助列、无下拉填充、无复制排版。

  1. 全原生函数兼容

全程仅使用 LET/LAMBDA/VSTACK/HSTACK/TAKE/DROP/EXPAND/TRANSPOSE 现代原生数组函数,WPS 最新版、Microsoft 365 Excel 全部通用。

💡 多层递归底层通用复盘

结合全系列所有 LAMBDA 递归案例,统一嵌套递归底层规律:底层函数解决最小单元问题 → 中层函数批量遍历处理全量数据 → 中层函数完成格式封装生成 → 顶层函数全局统筹整体排版每层递归严格独立闭环,只处理自身模块工作,参数向下透传,结果向上回溯堆叠,完美实现复杂办公需求模块化拆解。

📢 结尾互动

仓库标签打印、订单单证拆分打工人神器!四层递归一站式搞定「数量自动拆分 + 标准标签生成 + 整页多列排版」,改改数字就能适配所有物料订单!还想要更多 LAMBDA 多层嵌套递归实战案例、公式精简优化的朋友,评论区留言!

浙江省
浏览 129
2
9
分享
9 +1
5
2 +1
全部评论 5
 
南京的天
谢谢,学到了很多,递归方法挺重要
· 山西省
回复
 
标签助手
可以试下这个插件 【如何用wps的excel快速制作标签打印套板】 https://www.bilibili.com/video/BV1nSBYYAEmd/?share_source=copy_web&vd_source=d132df0e0c21aa90a0e8fc448a161a3a
· 广东省
回复
腿腿
好的
· 浙江省
回复
 
fbfbzz
学习了
· 江苏省
回复
腿腿
嘻嘻
· 浙江省
回复