1

我必须在 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.053 月 3 日。这是因为它的累计消费达到了 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 函数调用填充大工作表的公式可能会导致一些重大的性能问题。

对于如何有效解决此问题的任何想法,我将不胜感激。

4

3 回答 3

1

假设您知道如何:

  • 在数据透视表的每一行上显示产品名称
  • Amount从数据透视表的值中提取下限和上限区间点
  • Volumes每个产品的正确行中所有前几天的总和
  • 涵盖边缘情况,例如超出定义数量间隔的卷
  • 使用 Office 2007+ 表格
  • 使用命名范围
  • ...

第一天,您希望最高价格 = 给定产品名称的第一行:

=INDEX(PurchSums[Rate], MATCH(this_row_product_name, PurchSums[Product Name], 0))

对于每隔一天,您希望对所有前几天进行求和,并从给定产品名称的Volumes匹配间隔 s 中提取比率:Amount

=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,命名范围将被替换/指向:

  • 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))=SUM($C12:D12)
于 2013-04-23T20:24:00.760 回答
1

所以你所描述的是一个先进先出的库存会计系统。先进先出。你可能想在这里阅读它:

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)

示例 1

=(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)

Example1andhalf

=G8*$C8

示例 2

=SUM(G13:G15)/G3

示例 3

示例决赛

这些公式都是可自动填充的。您可以根据需要在此表上添加尽可能多的空间(并且可能会对其进行相当多的改进)。一个几乎任何语言的小程序都可以比 excel 更容易、更直观地完成这个任务——但这很好用。

在实践中,通常没有人真正知道哪些库存正在被用完,因此您为它们支付了多少。但是这个系统仍然存在——通常许多会计实践的原因与地球上古代人民牺牲动物的原因相同——因为它一直都是这样做的——传统和民间传说。在大多数情况下,它为他们提供了很好的服务——常规的蛋白质来源是健康的。我可以想到一些更好的方法来做到这一点,但是 - 唉。祝你好运。

于 2013-04-19T22:12:39.773 回答
0

所以基本上你想把你的“PurchSums”表和“Volumes”表总结成一个结合日期字段的表?

如果是这样的话......

在您的摘要表中填写日期

为采购金额创建一列

为体积量制作一列

在购买金额下,使用如下匹配/索引公式:

 =index({Select the column C from "PurchSums"},match( {Select date from third sheet},{Select date column from "PurchSums"},0))

同样,对 Volume 列执行相同的操作。

如果我离你想要完成的事情不远,希望这能让你走上正轨。

于 2013-04-19T20:12:38.583 回答