金山WPS

关注公众号 jb51net

关闭
软件教程 > 办公软件 > 金山WPS >

实现动态装箱计算! wps中ddb+text函数公式的使用技巧

脚本之家

粉丝求助SOS:如何实现动态[装箱]计算?将不同型号的产品按50个一箱进行分装。

如下图所示:

装箱要求是:

每个型号50个装一箱,不能混装。多出50个的部分需要装在下一箱中,以此类推。最终结果显示在在D1:E8区域。

下面显示了每个箱子的明细:

这个问题差点让我崩溃:ddb+text函数组合,双剑合璧,实现动态[装箱]计算。

第一步:生成可能箱子序列

可以这样写公式:

=COLUMN(A:D)

COLUMN(A:D) 返回列号数组 {1,2,3,4}(A列=1, D列=4)

继续完善公式:

=COLUMN(A:D)*50

乘以50后得到:{50,100,150,200}。这代表可能的累积装箱点(每50个一箱),最多4箱(200个),覆盖了最大数量117的需求。

第二步:巧用DDB函数计算各箱数量

我们继续完善公式:

=DDB(COLUMN(A:D)*50,B2:B5,1,1)

这里使用了DDB折旧函数,但被巧妙转化为了装箱计算。计算每个型号在每箱的“剩余量”。

DDB参数解析:

DDB函数在life=1时的运算原理:

当life=1时,DDB直接返回 cost - salvage(如果cost > salvage),否则返回0(因为折旧不能为负)。

实际计算过程举例:

型号A(salvage=39):

型号B(salvage=72):

继续完善公式:

=50-DDB(COLUMN(A:D)*50,B2:B5,1,1)

这部分计算每个箱子的实际数量。

运算过程举例:

继续完善公式:

=0&50-DDB(COLUMN(A:D)*50,B2:B5,1,1)

用文本连接符 & 处理:

例如:50-DDB=39→0&39="039"(文本)

负数如:-11→0&-11="0-11"(文本,后续会转换为错误值)

继续完善公式:

=--(0&50-DDB(COLUMN(A:D)*50,B2:B5,1,1))

目的:

确保数字以三位形式出现(如39→039),但实际转换后仍是数字39。负数产生的错误将会在后续步骤中被过滤。

第三步:文本处理:构建"型号;;数量"字符串,确保数字格式。

我们输入公式:

="\"&A2:A5&";;"&--(0&50-DDB(COLUMN(A:D)*50,B2:B5,1,1))

"\"表示双引号字符,Excel中转义写法。

分隔符 ;; 用于后续TEXT函数拆分数据。

第四步:降维过滤

我们外面嵌套TOCOL函数:

=TOCOL("\"&A2:A5&";;"&--(0&50-DDB(COLUMN(A:D)*50,B2:B5,1,1)),3)

使用TOCOL转换和过滤,TOCOL将数组矩阵转为单列,忽略无效项。将上述生成的4行×4列矩阵转换为单列,并忽略空值和错误(第2参数设置为3)。

转换过程:

结果按行扫描:先处理型号A所有箱子,再B、C、D。

第五步:拆分输出

最外面嵌套TEXT函数:

=TEXT({1,0},TOCOL("\"&A2:A5&";;"&--(0&50-DDB(COLUMN(A:D)*50,B2:B5,1,1)),3))

用 TEXT 分割型号和数量,TEXT按分隔符;;分割为两列。

{1,0}表示提取第1部分(型号)和第0部分(数量)。

比如 "A;;39":

  1. {1}提取 ;; 前的部分 → "A"
  2. {0}提取 ;; 后的部分 → "39"

最终输出两列:D列为型号,E列为数量。

TEXT({1,0}, ...) 固定结构:

不是真正的文本格式化函数,而是被用来按分隔符拆分字符串的巧妙技巧。就像用剪刀沿着缝线剪开布料,;; 是缝线,{1,0} 是指挥剪刀裁剪的位置指令。

推荐阅读:lookup加座啥意思? wps中lookup+sumifs搞定有合并单元格的多条件求和