ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3751|回复: 27

[原创] 365新函数:使用TAKE和DROP函数轻松搞定先入先出法计算

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-24 23:58 | 显示全部楼层 |阅读模式
本帖最后由 shaowu459 于 2023-12-13 15:50 编辑

先进先出法 (FIFO,first in, first out)是指根据先入库先发出的原则,对于发出的存货以先入库存货的单价计算发出存货成本的方法。
如下图所示,E3单元格中出库的3个A产品来自B2单元格入库的5个,单价是10元,因此出库成本是30元。E8单元格出库的3个A产品是B2单元格入库剩余的2个(单价10元)和B6单元格入库的1个(单价11元),因此出库成本是10*2+11=31元。


图片.png

先入先出法计算出库成本-超人.rar

15.09 KB, 下载次数: 101

先入先出法计算出库成本(出入库为两位小数)-超人.rar

11.29 KB, 下载次数: 42

出入库核对-先进先出:循环 递归.rar

23.84 KB, 下载次数: 16

评分

8

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-24 23:59 | 显示全部楼层
本帖最后由 shaowu459 于 2022-11-25 00:14 编辑

使用低版本函数可以解决此问题,但公式稍微复杂,细节处理比较多,但使用365新函数中的TAKE函数DROP函数则可轻松实现相关计算,计算逻辑变得非常简单。
F2单元格输入以下公式,向下填充到F9单元格:
  1. =SUM(IF(E2,TAKE(DROP(TOCOL(IF((B$2:B2>=COLUMN(A:ZZ))*(A$2:A2=A2),C$2:C2,\),3),SUMIF(A$1:A1,A2,E$1)),E2)))
复制代码
图片.png
公式的总体思路说明如下:
1)把每次入库的产品单价按入库数量堆叠起来。例如,入库了5个A产品,单价是10,那么就转化成5个10的数组{10;10;10;10;10},再入库3个A产品,单价是11,就继续堆叠,变成一个7行的数组:{10;10;10;10;10;11;11;11}。
2)假设第一次出库了3个A产品,那么就用TAKE函数取数组{10;10;10;10;10;11;11;11}中的前3行{10;10;10},再用SUM函数求和即可。假设第二次又出库了3个A产品,首先用DROP函数将已出库的3个产品单价去掉(去掉数组前3行),将数组变成{10;10;11;11;11},再用TAKE函数提取前3行{10;10;11}求和即可。
3)简单总结一下,思路就是将入库产品单价按个排列,一个一个的出库。将本次出库之前出库的行数去掉后,再从剩余的数组中提取本次出库数量的行数后求和。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-25 00:06 | 显示全部楼层
以F8单元格的公式为例简单拆解一下公式:
图片.jpg
  1. =IF((B$2:B8>=COLUMN(A:ZZ))*(A$2:A8=A8),C$2:C8,\)
复制代码
这部分公式利用COLUMN(A:ZZ)将2-8行各产品的入库单价展开,如果A列产品是A8单元格(A产品)的话就保留入库单价,否则返回“\”制造错误值。结果如下图:
图片.png
  1. =TOCOL(IF((B$2:B8>=COLUMN(A:ZZ))*(A$2:A8=A8),C$2:C8,\),3)
复制代码
而后使用TOCOL函数将刚才的数组转化成一列,并使用第二参数的3去掉错误值:
图片.png
  1. =SUMIF(A$1:A7,A8,E$1)
复制代码
使用SUMIF函数获得当前行之前A产品已出库数量:
图片.png
  1. =DROP(TOCOL(IF((B$2:B8>=COLUMN(A:ZZ))*(A$2:A8=A8),C$2:C8,\),3),SUMIF(A$1:A7,A8,E$1))
复制代码
使用DROP函数将单价数组中已出库的行数去掉,简化来说是DROP(单价数组, SUMIF(A$1:A7,A8,E$1)),剩余的数组就是尚未出库的每个产品的单价,排在上面的是先入库的。
图片.png
  1. =TAKE(DROP(TOCOL(IF((B$2:B8>=COLUMN(A:ZZ))*(A$2:A8=A8),C$2:C8,\),3),SUMIF(A$1:A7,A8,E$1)),E8)
复制代码
使用TAKE函数从上一步生成的未出库A产品单价列表中提取本次出库的数量3个(E8单元格的值),生成一个3行的数组,也即本次出库的3个产品的单价:
图片.jpg
  1. =SUM(IF(E8,TAKE(DROP(TOCOL(IF((B$2:B8>=COLUMN(A:ZZ))*(A$2:A8=A8),C$2:C8,\),3),SUMIF(A$1:A7,A8,E$1)),E8)))
复制代码
因为只有出库列有数值的时候(大于0)才需要进行计算出库成本,因此使用IF函数判断一下,当E8单元格值大于0时才进行上述运算。提取出出库产品的单价之后,用SUM函数求和即可。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-25 00:08 | 显示全部楼层
由于公式中使用的是每个产品的单价列表,因此如果需要在计算出出库成本之前计算出每次出库的平均单价,把最外层的SUM函数替换成AVERAGE函数即可:
  1. =AVERAGE(IF(E2,TAKE(DROP(TOCOL(IF((B$2:B2>=COLUMN(A:ZZ))*(A$2:A2=A2),C$2:C2,\),3),SUMIF(A$1:A1,A2,E$1)),E2)))
复制代码
图片.jpg
另外,如果入库统计在一起,出库统计在一起,公式基本不用调整,改变引用即可:

图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-25 00:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先顶后看,超人老师这速度要去写小说的话日更上万啊

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-25 00:35 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
满坛皆为吾师 发表于 2022-11-25 00:33
先顶后看,超人老师这速度要去写小说的话日更上万啊

还没睡,早点休息~这个是搬过来的,所以快。明天有空写写Bom成本计算,慢慢写

点评

肝帝  发表于 2022-11-25 00:46

TA的精华主题

TA的得分主题

发表于 2022-11-27 13:07 来自手机 | 显示全部楼层
第一步按照数量和单价column平铺,如果入库数量是50000,就会显示溢出?不知道是不是我理解错了?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 14:44 | 显示全部楼层
FeiF140 发表于 2022-11-27 13:07
第一步按照数量和单价column平铺,如果入库数量是50000,就会显示溢出?不知道是不是我理解错了?

是这样只把B2改成50000吗?首先,如果数量特别多,后面column生成的一行多列的自然数数组,可以用sequence函数来替代,要不然不够。
图片.png

按说不会出现溢出错误,可以上传或者截图出错的公式和原数据。
图片.png

TA的精华主题

TA的得分主题

发表于 2022-11-27 17:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先进分子,  我是这样做的。(如果出货量大时,计算量就有点大)

=IF(E2,SUM(LOOKUP(ROW(INDIRECT("1:"&E2))+SUMIF(A$1:A1,A2,E$1),SUMIF(OFFSET(A$1,,,ROW($1:1)),A2,B$1)+1,C$2:C2)),)

image.png




先入先出.zip

12.07 KB, 下载次数: 12

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 17:44 来自手机 | 显示全部楼层
丢丢表格 发表于 2022-11-27 17:39
先进分子,  我是这样做的。(如果出货量大时,计算量就有点大)

=IF(E2,SUM(LOOKUP(ROW(INDIRECT("1:"& ...

对,老版函数是能做出来的。不过有了新函数,感觉理解起来会更直接一些所以也发了这个帖子,也算一种方法吧。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-3 04:16 , Processed in 0.046784 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表