我必须在Excel中实现一组公式,其要求似乎违反任何逻辑或简洁的方式来只使用公式。
根据1)产品作为一系列批量购买支付的价格确定(并显示)产品“有效”内部成本的时间表,以及2)公司使用产品的每日消费量每次购买支付的价格,直到购买的金额被消费,然后继续下次购买。
我们有一张表“PurchSums”,其中包含产品的批量购买历史记录:(这实际上是一个数据透视表)
| 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
...
首先,我想尽可能在现有单元格/表格中使用公式。另外,我希望尽量减少必须添加以支持此功能的附加工作表数量,因为工作簿已经相当可观。
其次,是的,我知道我可以用VBA函数做到这一点,如果没有更好的方法,我会这样做,但是如果可能的话我想避免这种情况,因为根据我的经验,用大量填充大型公式的公式VBA函数调用可能会导致一些重大的性能问题。
对于如何有效地解决这个问题,我将不胜感激。
答案 0 :(得分:1)
所以你所描述的是一个FIFO库存会计系统。先入先出。你可能想在这里阅读:
http://en.wikipedia.org/wiki/FIFO_and_LIFO_accounting
在这里:
http://accountingexplained.com/financial/inventories/fifo-method
基本上在FIFO下,您正在做出假设(无论是对还是错),您添加到库存中的第一个项目是您将要在生产中使用的第一个项目。与LIFO相反,后者假设您添加到库存中的最后一项是您将要用完的第一项。这只需要我的解决方案稍作改动,但让我们专注于FIFO,因为这是你的问题。
因此,对于您运营的每一天,您需要弄清楚您用完的库存量以及您为该库存支付的金额。因此,如果您以50美元购买20件物品,然后在第二天以100美元购买另外20件物品 - 并且在第三天您用完了生产中的30件物品,您用完了(20 * 50美元)加上(10 * 100美元) = 2000美元的库存。 2000/30 =当天产品的有效成本(66.6666667)。这个有效的成本纯粹是当天的信息 - 你可能不想将它用于任何会计 - 尽管你可以进行一些舍入修正 - 这只是间接的方式来实现它。
所以我的解决方案使用了一个非常难看的表。基本上,对于您运营的每一天,您需要确定您的库存消耗量以及您为该库存支付的金额 - 然后将其除以当天用完的总金额。这样的事情对你有用:
=(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更容易,更直观地完成这一任务 - 但这种方法很好。
在实践中,通常没有人真正知道哪些库存正在被用尽,因此你为它们付了多少钱。但是系统仍然存在 - 通常许多会计实践的原因与地球上的古代人为什么牺牲动物的原因相同 - 因为这就是它一直以来的做法 - 传统和民间传说。在大多数情况下,它很好地服务于它们 - 常规的蛋白质来源是健康的。我可以想到一些更好的方法,但是 - 唉。祝你好运。
答案 1 :(得分:1)
假设您知道如何:
Amount
值的下限和上限间隔点
Volumes
第一天,您希望最高价格=给定产品名称的第一行:
=INDEX(PurchSums[Rate], MATCH(this_row_product_name, PurchSums[Product Name], 0))
对于每隔一天,您希望对前几天的Volumes
求和,并从给定产品名称的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
,命名范围将被替换/指向:
Prices[[#This Row],[Product Name]]
= Prices[@Product Name]
= $B16
=SUM(OFFSET(Volumes[[#Headers],[2013-03-01]:[2013-03-02]], MATCH(this_row_product_name, Volumes[Product Name], 0), 0))
= SUM($C12:D12)
答案 2 :(得分:0)
所以基本上你想把你的“PurchSums”表和“Volumes”汇总成一个结合了日期字段的表?
如果是这种情况......
在摘要表中填写日期
为购买金额
列为音量
创建一列在购买金额下使用匹配/索引公式,如下所示:
=index({Select the column C from "PurchSums"},match( {Select date from third sheet},{Select date column from "PurchSums"},0))
同样对Volume列做同样的事情。
如果我对你想要完成的事情不远,希望这能让你顺利上路。