告别传统公式:利用动态数组实现生产计划表的自动扩展与更新

B站影视 2024-12-17 17:08 2

摘要:大家好,我是古老师。自最新版本的Excel和WPS引入动态数组功能后,我发现过去使用的传统填充公式相比之下显得有些“过时”。因此,我最近利用空余时间,将《生产计划表》中的若干公式,包括开工日期与完工日期的计算,全部更新为动态数组函数。这一改进不仅支持数据的自动

全文约1500字

大家好,我是古老师。自最新版本的Excel和WPS引入动态数组功能后,我发现过去使用的传统填充公式相比之下显得有些“过时”。因此,我最近利用空余时间,将《生产计划表》中的若干公式,包括开工日期与完工日期的计算,全部更新为动态数组函数。这一改进不仅支持数据的自动扩展,还实现了无需手动填充公式的便捷操作,真正做到了一键出结果。现在,这个“模板”更加高效且易于使用。

在使用动态数组之前,我们先来了解一下传统的填充公式是如何编写的。在编制好的生产计划表中,首先插入两列,并分别命名为“开工日期”和“完工日期”。然后,在相应的单元格中录入以下公式,并向下填充至合适的位置:

B2=MIN(FILTER($D$1:$H$1,D2:H2>0))

C2=MAX(FILTER($D$1:$H$1,D2:H2>0))

公式解释:

这里的 FILTER函数用于筛选出非零值的日期,也就是计划有排程数量的数据,然后用MIN 函数用于计算这些筛选后日期中的最早日期(即开工日期),MAX 函数用于计算这些筛选后日期中的最晚日期(即完工日期)。

要把上述的传统公式转换成动态数组公式,可以使用 BYROW 函数结合 LAMBDA 来实现。转换过程中,我们定义一个较大的范围,并对每一行应用特定的计算逻辑来求取最小值和最大值。

B2=BYROW(D2:H11,LAMBDA(X,MIN(FILTER(D1:H1,X>0))))

C2==BYROW(D2:H11,LAMBDA(X,MAX(FILTER(D1:H1,X>0))))

公式解释:

BYROW(D2:H11, LAMBDA(...)):这个部分遍历了从D2到H11范围内的每一行。

LAMBDA(X, ...):为每一行的数据创建了一个匿名函数,其中 X 代表当前行的数据。

MIN(FILTER(X, X > 0)) 和 MAX(FILTER(X, X > 0)):分别用于计算每行中非零值的最小值(即开工日期)和最大值(即完工日期)。

通过这种方式,您无需再手动向下填充公式,动态数组会自动处理并扩展结果,简化了操作流程并提高了效率。

为了使公式能够真正实现动态扩展,而无需因数据新增而频繁修改参数范围,可以预先定义一个较大的范围,并结合 TAKE 函数来动态调整实际使用的数据边界。以下是优化后的公式:

B2=TAKE(BYROW(D2:Z300,LAMBDA(X,MIN(FILTER(D1:Z1,X>0)))),COUNTA(A2:A300))

C2=TAKE(BYROW(D2:Z300,LAMBDA(X,MAX(FILTER(D1:Z1,X>0)))),COUNTA(A2:A300))

公式解释:

前面的公式原理和上面的一致,预留了较大的范围(Z列和300行),以应对未来可能增加的数据。

TAKE(..., COUNTA(A2:A300)):使用 TAKE 函数根据 COUNTA(A2:A300) 动态返回有效数据行数的结果。COUNTA(A2:A300) 计算了A列中非空单元格的数量,以此作为动态数组的实际长度。

以下是关于在生产计划二维排程中实现全动态自动开工与完工日期计算的说明。该方法仅适用于日期型数值,对于文本型日期则不适用(因为 MIN 和 MAX 函数无法正确处理文本格式的日期)。如果您的数据包含文本型日期,则需要先进行转换,或者使用以下的一键公式来处理::

=LET(D,D1:U1,DROP(REDUCE("",SEQUENCE(COUNTA(A2:A98)),LAMBDA(X,Y,VSTACK(X,CHOOSECOLS(TOROW(IF(OFFSET(D,Y,)>0,D,A),3),1,-1)))),1))

公式解释:

LET:定义变量以简化复杂公式。

D, D1:U1:将日期范围 D1:U1 赋值给变量 D。

REDUCE("", SEQUENCE(COUNTA(A2:A98)), LAMBDA(...)):通过 REDUCE 函数和 SEQUENCE 构建一个累加数组,根据 A2:A98 列中的非空行数迭代。

LAMBDA(X, Y, ...):为每次迭代创建匿名函数,其中 X 是累积的结果,Y 是当前迭代的索引。

IF(OFFSET(D, Y - 1, ) > 0, D, ""):检查每行是否包含正值,并返回对应的日期行或空字符串。

TOROW(..., 3):将结果转换成一行,并确保只保留有效日期。

CHOOSECOLS(..., 1, -1):从转换后的行中选择第一列和最后一列,分别对应最早和最晚日期。

VSTACK(X, ...):将每次迭代的结果堆叠起来,形成最终的结果数组。

DROP(..., 1):移除可能存在的首行空白,确保结果准确。

综上所述,通过引入动态数组功能和一系列高级函数如 BYROW、LAMBDA 和 TAKE,我们不仅简化了《生产计划表》中开工日期与完工日期的计算过程,还显著增强了表格的灵活性和适应性。传统公式需要手动填充且固定范围,容易在数据量变化时导致错误或不便;而新的动态数组方法则能自动适应数据增减,无需人工干预即可实现一键更新结果,极大地提高了工作效率。

此外,针对文本型日期无法直接使用 MIN 和 MAX 函数的问题,提供了一键公式解决方案,确保无论是何种格式的数据,都能够被正确处理。这种方法不仅解决了兼容性问题,也为用户提供了更加全面的数据管理工具。

来源:小向科技论

相关推荐