Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在VBA代码中计算阵列的IRR_Excel_Vba - Fatal编程技术网

Excel 在VBA代码中计算阵列的IRR

Excel 在VBA代码中计算阵列的IRR,excel,vba,Excel,Vba,这里是VBA初学者。我使用的代码(如下所示)基本上创建了一个抵押贷款摊销表,然后将结果粘贴到我的工作表中,然后计算其中一个范围的内部收益率。对于IRR,是否有一种方法可以引用“myarray(8,i)”即“cf”字段,而不是引用范围“B35:HR35”?我想这样做,这样我就不必把一堆数据粘贴到我的工作表中,只需要得到IRR。我已经研究过如何定义数组并在我的IRR计算中使用它,但我还没有发现任何有效的方法 Application.ScreenUpdating = False Dim myarr

这里是VBA初学者。我使用的代码(如下所示)基本上创建了一个抵押贷款摊销表,然后将结果粘贴到我的工作表中,然后计算其中一个范围的内部收益率。对于IRR,是否有一种方法可以引用“myarray(8,i)”即“cf”字段,而不是引用范围“B35:HR35”?我想这样做,这样我就不必把一堆数据粘贴到我的工作表中,只需要得到IRR。我已经研究过如何定义数组并在我的IRR计算中使用它,但我还没有发现任何有效的方法


Application.ScreenUpdating = False

Dim myarray(1 To 15, 0 To 500)
Dim amort As Double
Dim sb As Double
Dim defb As Double
Dim payment As Double
Dim cf As Double

gr = Range("B3") / 12 'Gross Coupon
rm = Range("B4") 'Remaining Months
sb = Range("B2") 'Starting Balance
SMM = Range("B5") 'Single Month Mortality Rate
Term = Range("B4") 'Loan Term
defb = Range("B6") 'Deferral Balance
cf = -(sb + defb) ' Cashflow
myarray(8, 0) = cf 'Place initial cashflow in eighth row, first column
myarray(9, 0) = sb 'Place starting balance in ninth row, first column
TotalMonths = rm 'Set to remaining months
rm = rm + 1 ' Add one to remaining months (needed because the amortization starts out subtracting one month for each row)

For i = 1 To TotalMonths
ShowMonth = i
MOB = MOB + 1
rm = rm - 1

payment = -Pmt(gr, rm, sb, 0)
interest = gr * sb
principal = payment - interest
prepayment = SMM * (sb - principal)
amort = principal + prepayment
sb = sb - amort
cf = amort + interest

myarray(1, i) = ShowMonth
myarray(2, i) = sb + amort
myarray(3, i) = payment
myarray(4, i) = interest
myarray(5, i) = principal
myarray(6, i) = prepayment
myarray(7, i) = amort
myarray(8, i) = cf
myarray(9, i) = sb

Next i

1000 Range("b28").Resize(9, 500).Value = myarray


Range("B7") = (1 + (Application.WorksheetFunction.IRR(Range("B35:HR35")))) ^ 12 - 1


Application.ScreenUpdating = True

End Sub

在下一个i之后,用以下代码替换您的代码 看看这是否有效

RetRate = (1 + (Application.WorksheetFunction.IRR(Application.WorksheetFunction.Index(myarray, 8)))) ^ 12 - 1
' as mentioned in your formula


Range("B7") = RetRate * 100


Application.ScreenUpdating = True
与你的代码图像看起来像

使用新代码


您可以使用
myarray(8,i)
但在加载数组后或加载该特定元素。哪个范围应该在该特定数组中?如果是一个单元格范围,事情就简单多了……我想你不必用数组值填充excel表格。相反,您可以使用
Range(“B7”)=(1+(Application.WorksheetFunction.IRR(myarray(8,i))^12-1
,并且可以避免
1000范围(“b28”)。Resize(9500)。Value=myarray
@Naresh如果我按照您说的做,我会得到一个错误:“运行时错误‘1004’:无法获取WorksheetFunction类的IRR属性”@我不知道你在问什么。我试图做的是计算一系列现金流的内部收益率(在我的代码中显示为myarray(8,I))而不必首先将现金流粘贴到我的电子表格中。而不是这样做:计算现金流->粘贴现金流->计算内部收益率;我想这样做:计算现金流->计算内部收益率。但是,当尝试将定义的数组插入到IRR计算中时,出现错误“无法获取WorksheetFunction类的IRR属性”您能否提供示例输入数据,然后我可以做一些事情这是否回答了您的问题?如果是,请投票/接受答案并关闭问题以供参考,