当前价格按离散值累计进度
我必须在Excel中实现一系列公式,这些公式的要求似乎无视任何逻辑或简洁的方式,只用公式来完成。
简短的介绍:
基于1)产品作为一系列批量采购支付的价格,以及2)公司使用支付的价格对产品的每日消费,来确定(并显示)产品的“有效”内部成本的时间线对于每次购买,直到所购买的金额被消耗,然后继续下一次购买。
简化的细节:
我们有一个表格“PurchSums”与产品的批量购买logging:(这实际上是一个数据透视表)
| A | B | C | D | 1: Product Name Purch Date Rate Amount ... 23: Prod-Q 12/18/2012 $3.15 123.7 24: 1/24/2013 $3.05 748.2 25: 2/27/2013 $2.86 650.0 ... ...
所以最初内部价格应该是3.15美元/磅,直到第一个123.7磅被使用,那么它应该转换到3.05美元等等。
我们有一张白天消费的“卷”:(产品消费从3月1日开始)
| A | B | C | D | 1: Product Name 3/1/2013 3/2/2013 3/3/2013 ... ... 12: Prod-Q 87.2 77.1 101.5 ... ... ...
而且我需要填写日常价格表“价格”的公式,每天有产品的有效内部价格(现在手动填写):
| A | B | C | D | 1: Product Name 3/1/2013 3/2/2013 3/3/2013 ... ... 32: Prod-Q 3.15 3.15 3.05 ... ... ...
请注意,“Prod-Q”的价格在3月3日更改为3.05
。 这是因为它的累积消费量达到了265.8磅(87.2 + 77.1 + 101.5),超过了12/18磅的123.7磅,因此从3.15
的价格转换为下一次采购的价格从1/24。
更多细节:
第一张“PurchSums”实际上是一个数据透视表,如果有帮助的话。 不幸的是,我不认为这样做,也没有GETPIVOTDATA(..)在这里有用(但我会很高兴做错)。 其中的信息来自另一张表单“购买”,这只是所有购买的清单:
| A | B | C | D | 1: Product Name Purch Date Rate Amount ... 11: Prod-Q 12/18/2012 $3.15 123.7 ... 34: Prod-Q 1/24/2013 $3.05 748.2 ... 67: Prod-Q 2/27/2013 $2.86 650.0 ...
额外:
首先,我想尽可能地使用现有的单元格/工作表中的公式来做到这一点。 另外,为了支持这一点,我想尽量减less额外的工作表数量,因为工作簿已经非常可观了。
其次,是的,我知道我可以用VBA函数来做到这一点,如果没有更好的办法,我会这样做,但是如果可能的话,我想避免这样做,因为根据我的经验,用大量的VBA函数调用大表单可能会导致一些重大的性能问题。
对于如何有效解决这个问题,我会很感激。
所以你所描述的是一个FIFO库存会计系统。 先进先出。 你可能想在这里阅读:
http://en.wikipedia.org/wiki/FIFO_and_LIFO_accounting
和这里:
http://accountingexplained.com/financial/inventories/fifo-method
基本上在FIFO下,您正在做出假设(无论是对还是错),您添加到库存中的第一件物品是您将要用于生产的第一件物品。 与LIFO相反,LIFO假定您添加到广告资源中的最后一个项目是您将要用到的第一个项目。 这只需要我的解决scheme的一个小的改变,但让我们专注于先进先出,因为这是你的问题。
因此,对于每天操作,您需要弄清楚您已经用完了多less库存以及您为该库存支付了多less。 所以如果你以50美元购买了20件商品,第二天又购买了20件100美元的商品,第三天就用完了30件商品,你用完了(20 * 50美元)加上10 * 100美元。 =价值2000美元的库存。 2000/30 =当天产品的有效成本(66.6666667)。 这个有效的成本纯粹是当天的信息 – 你可能不想用它来进行会计,尽pipe你可以进行一些修正,但这只是一个间接的方法。
所以我的解决scheme使用一个非常丑陋的表。 基本上,对于每天操作,您需要弄清楚您使用的库存量有多less,以及您为该库存支付了多less – 然后将其除以当天用完的总量。 像这样的东西应该为你工作:
=(IF(AND($E8>G$4,$E8>G$5),G$3,0)+IF(AND($E8>G$4,$E8<G$5),($E8-G$4),0))-SUM(G$7:G7)
=(IF(AND($E9>G$4,$E9>G$5),G$3,0)+IF(AND($E9>G$4,$E9<G$5),($E9-G$4),0))-SUM(G$7:G8)
=G8*$C8
=SUM(G13:G15)/G3
这些公式都是可自动填写的。 而且你可以在这个表格上添加尽可能多的空间(可能会改进很多)。 一个几乎任何语言的小程序都可以比excel更容易,更直观地完成这个任务 – 但是这个工作正常。
在实践中,通常没有人知道哪些库存被用完了,因此你付了多less钱。 但是这个制度依然存在 – 通常很多会计实践的原因与地球上的古代人为什么牺牲动物是一样的,因为这就是传统和民间传说。 大多数情况下,它们都能很好地发挥作用 – 常规的蛋白质来源是健康的。 我可以想到一些更好的方法来做到这一点,但 – 唉。 祝你好运。
假设你知道如何:
- 显示数据透视表中每一行的产品名称
- 从数据透视表中的
Amount
值中提取下限和上限间隔点 - 总结每个产品的正确行的所有前几天的
Volumes
- 覆盖边界情况,如定义数量区间以外的体积
- 使用Office 2007+表
- 使用命名的范围
- …
对于第一天,您需要最高价格=给定产品名称的第一行:
=INDEX(PurchSums[Rate], MATCH(this_row_product_name, PurchSums[Product Name], 0))
对于每隔一天,您希望总结前一天的数量,并从给定产品名称的Amount
s的匹配间隔中提取比率:
=SUMIFS(PurchSums[Rate], PurchSums[Product Name], this_row_product_name, PurchSums[Amount above], TEXT(sum_of_previous_volumes_for_product, "<=General"), PurchSums[Amount up to], TEXT(sum_of_previous_volumes_for_product, ">General"))
请注意, sum_of_previous_volumes_for_product > PurchSums[Amount above]
和所有其他条件只应在1行中满足,所以我们总计1行 。
例:
对于单元格E16
,指定的范围将被replace/指向:
- this_row_product_name =
Prices[[#This Row],[Product Name]]
=Prices[@Product Name]
=$B16
- sum_of_previous_volumes_for_product =
=SUM(OFFSET(Volumes[[#Headers],[2013-03-01]:[2013-03-02]], MATCH(this_row_product_name, Volumes[Product Name], 0), 0))
#Headers=SUM(OFFSET(Volumes[[#Headers],[2013-03-01]:[2013-03-02]], MATCH(this_row_product_name, Volumes[Product Name], 0), 0))
=SUM($C12:D12)
所以基本上你想把你的“PurchSums”表和“Volumes”汇总成一个结合date字段
如果是这种情况….
在您的汇总表中填写一行以填写date
为购买量做一个列
为音量调整一列
在购买金额下使用匹配/索引公式如下:
=index({Select the column C from "PurchSums"},match( {Select date from third sheet},{Select date column from "PurchSums"},0))
同样,对“音量”列也做同样的事情。
希望这可以让你在你想要完成的事情上走得很远。