计算 Excel 中的回报价值
Calculate Payback Value in Excel
我有一组连续的值:
(9,888,000) (88,410,205) (76,030,786) (62,712,494) (48,416,610) (33,102,893) (16,729,517) 746,979 19,371,753 39,191,722 43,755,624 66,114,081 89,819,671 114,926,989 141,492,724
每个值代表特定年份的一些金额。例如(16,729,517)是第 7 年的现金流出。
现在我在另一个单元格中有一笔金额为 110,000,000 作为初始付款。
现在我试着计算初始付款的投资回收年。对我来说,投资回收期应该是:7.96,因为那一年的金额变为正数。
但是我无法计算出这个 7.96 的值。谁能帮忙?
我已经通过间接方法完成了:
作为第一步,我检查每一列中的值,并根据正值和负值存储 true 或 false。
第二步:=MATCH(TRUE,Complete Array,0)
。这给了我 8 作为数字,它找到了第一个正值。
然后,作为第三步,我使用这个公式:
=Year-OFFSET(CFC,0,Year)/OFFSET(Investment,0,Year) .
在这种情况下,年份是我在步骤 2 中得到的。并且 CFC 单元格为空(0 年的累计现金流量)。输出这个7.96,这是我要求的值。
但这是一种冗长而间接的方式。我想要一个用于所有这些计算的单行公式。
您的公式方法看起来很自然。我不确定您是否可以比现在做的更好,尽管我确信数组公式大师可以找到一种方法将其全部包装成一个单一的,尽管不太可读的公式。
使用 VBA 您可以编写一个可以直接从电子表格调用的函数。在标准代码模块中输入:
Function PayBack(R As Range) As Variant
'R is a range, assumed to be 1-dimensional
'consisting of negative numbers which
'at some point transition to positive
'returns the cross-over point
Dim i As Long, n As Long
Dim x As Double, y As Double
n = R.Cells.Count
x = R.Cells(1).Value
If x >= 0 Then
PayBack = CVErr(xlErrNA)
Exit Function
End If
'x < 0 in the following loop:
For i = 2 To n
y = R.Cells(i).Value
If y >= 0 Then
x = Abs(x)
PayBack = i - y / (x + y)
Exit Function
End If
x = y
Next i
'if the code reaches here -- still negative, so return error
PayBack = CVErr(xlErrNA)
End Function
然后它可以像这样使用:
我在第 1 行有你的样本数据(所以 A1:O1),在 A3 中我刚刚输入了公式
=PayBack(A1:O1)
并且它按预期计算。它 returns #N/A
如果数据中没有从负到正的转换,则会出错——尽管这当然可以通过各种方式进行调整。
您可以将公式组合成一行。这是您正在做的事情的细微变化,这是零以下和以上值之间的直线外推:
=FORECAST(0,{-1,0},
OFFSET(CashFlows,,MATCH(TRUE,CashFlows>0,0)-2,1,2))
+MATCH(TRUE,CashFlows>0,0)
如果您的 CashFlows
范围位于一列而不是一行中,您可能需要更改偏移公式。通过按住 ctrl+shift
的同时点击 enter
将公式作为数组公式输入
EDIT 这个公式忽略了第一笔现金流,无论是正的还是负的。如果要包含它,请将 >
运算符更改为 >=
并测试错误。
我有一组连续的值:
(9,888,000) (88,410,205) (76,030,786) (62,712,494) (48,416,610) (33,102,893) (16,729,517) 746,979 19,371,753 39,191,722 43,755,624 66,114,081 89,819,671 114,926,989 141,492,724
每个值代表特定年份的一些金额。例如(16,729,517)是第 7 年的现金流出。
现在我在另一个单元格中有一笔金额为 110,000,000 作为初始付款。
现在我试着计算初始付款的投资回收年。对我来说,投资回收期应该是:7.96,因为那一年的金额变为正数。
但是我无法计算出这个 7.96 的值。谁能帮忙?
我已经通过间接方法完成了:
作为第一步,我检查每一列中的值,并根据正值和负值存储 true 或 false。
第二步:=MATCH(TRUE,Complete Array,0)
。这给了我 8 作为数字,它找到了第一个正值。
然后,作为第三步,我使用这个公式:
=Year-OFFSET(CFC,0,Year)/OFFSET(Investment,0,Year) .
在这种情况下,年份是我在步骤 2 中得到的。并且 CFC 单元格为空(0 年的累计现金流量)。输出这个7.96,这是我要求的值。
但这是一种冗长而间接的方式。我想要一个用于所有这些计算的单行公式。
您的公式方法看起来很自然。我不确定您是否可以比现在做的更好,尽管我确信数组公式大师可以找到一种方法将其全部包装成一个单一的,尽管不太可读的公式。
使用 VBA 您可以编写一个可以直接从电子表格调用的函数。在标准代码模块中输入:
Function PayBack(R As Range) As Variant
'R is a range, assumed to be 1-dimensional
'consisting of negative numbers which
'at some point transition to positive
'returns the cross-over point
Dim i As Long, n As Long
Dim x As Double, y As Double
n = R.Cells.Count
x = R.Cells(1).Value
If x >= 0 Then
PayBack = CVErr(xlErrNA)
Exit Function
End If
'x < 0 in the following loop:
For i = 2 To n
y = R.Cells(i).Value
If y >= 0 Then
x = Abs(x)
PayBack = i - y / (x + y)
Exit Function
End If
x = y
Next i
'if the code reaches here -- still negative, so return error
PayBack = CVErr(xlErrNA)
End Function
然后它可以像这样使用:
我在第 1 行有你的样本数据(所以 A1:O1),在 A3 中我刚刚输入了公式
=PayBack(A1:O1)
并且它按预期计算。它 returns #N/A
如果数据中没有从负到正的转换,则会出错——尽管这当然可以通过各种方式进行调整。
您可以将公式组合成一行。这是您正在做的事情的细微变化,这是零以下和以上值之间的直线外推:
=FORECAST(0,{-1,0},
OFFSET(CashFlows,,MATCH(TRUE,CashFlows>0,0)-2,1,2))
+MATCH(TRUE,CashFlows>0,0)
如果您的 CashFlows
范围位于一列而不是一行中,您可能需要更改偏移公式。通过按住 ctrl+shift
的同时点击 enter
EDIT 这个公式忽略了第一笔现金流,无论是正的还是负的。如果要包含它,请将 >
运算符更改为 >=
并测试错误。