新闻动态

你的位置:足球资讯 > 新闻动态 > 这个问题差点让我崩溃:ddb+text,双剑合璧,实现动态「装箱」计算

这个问题差点让我崩溃:ddb+text,双剑合璧,实现动态「装箱」计算

发布日期:2025-07-17 13:52    点击次数:191
粉丝求助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函数组合,双剑合璧,实现动态[装箱]计算...

粉丝求助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}提取 ;; 前的部分 → "A"

{0}提取 ;; 后的部分 → "39"

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

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

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



上一篇:600型固定翼预警机,到底会不会部署到6万吨级翘头上?
下一篇:探究AlloyN155高温合金醋酸醋酐
TOP