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

WPS中有很多函数组合到一起会达到神奇的效果,比如我们今天用到的ddb+text函数,可以轻松实现现动态装箱计算,详细如下。

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

如下图所示:

  • A列是型号:A、B、C、D
  • B列是数量:39、72、117、21

装箱要求是:

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

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

  • A型号:1箱39个
  • B型号:1箱50个和1箱22个
  • C型号:2箱各50个和1箱17个
  • D型号:1箱21个

这个问题差点让我崩溃: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参数解析:

  • cost: {50,100,150,200}(每个可能箱子的累积值)
  • salvage: B2:B5,即 {39;72;117;21}(每个型号的总数量)
  • life: 1(表示资产寿命只有1期)
  • period: 1(计算第1期的折旧)
  • factor: 省略(默认为2)

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

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

实际计算过程举例:

型号A(salvage=39):

  • cost=50:DDB=50-39=11
  • cost=100:DDB=100-39=61

型号B(salvage=72):

  • cost=50:50<72,DDB=0
  • cost=100:100-72=28

继续完善公式:

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

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

运算过程举例:

  • 型号A,cost=50:50 - 11 = 39(第一个箱子数量)
  • 型号A,cost=100:50 - 61 = -11(无效,后续会处理)
  • 型号B,cost=50:50 - 0 = 50(第一个满箱)
  • 型号B,cost=100:50 - 28 = 22(第二个箱子剩余)

继续完善公式:

=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))

  • --:作用是将文本转为数字
  • "039"→39(有效)
  • "0-11"→错误值(#VALUE!,因为不是合法数字)

目的:

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

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

我们输入公式:

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

  • 构建型号字符串:"\"&A2:A5&";;"

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

  • 例如型号A:"\"&"A"&";;" → "A;;"(字符串内容为双引号+A+两个分号)。
  • 与数量连接:"A;;" & 39 → "A;;39"(表示型号A和数量39的组合)。

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

第四步:降维过滤

我们外面嵌套TOCOL函数:

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

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

转换过程:

  • 有效值(如A;;39、B;;50)保留。
  • 错误值(如负数转换结果)被跳过。

结果按行扫描:先处理型号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} 是指挥剪刀裁剪的位置指令。

声明:本文来自互联网或用户投稿,该文观点仅代表作者本人,不代表本站立场。文章及其配图仅供学习和交流之用,版权归原作者所有,如有内容侵权或者其他违规问题,请联系本站处理。