UDF VBA 产生零。没有错误值,只有零。有人可以检查我的代码吗

Posted

技术标签:

【中文标题】UDF VBA 产生零。没有错误值,只有零。有人可以检查我的代码吗【英文标题】:UDF VBA producing zeros. No error values, just zeros. Can someone please check my code 【发布时间】:2018-07-06 10:46:26 【问题描述】:

'VBA函数计算0.5、1、1.5、2年等1年远期利率,所有结果为零;没有错误值,只有零。谁能告诉我哪里出错了。谢谢

Function OneYearFwdRates(Mty As Range, Spots As Range) As Variant
Dim Maturities()
ReDim Maturities(Mty.Rows.Count)  'Mty is the range of maturities'
Dim SpotRates()
ReDim SpotRates(Spots.Rows.Count)  'Spots is the range of spot rates'
Dim OYFR()                         'OYFR stands for One Year Forward Rates'
ReDim OYFR(Spots.Rows.Count)
Dim i

For i = 2 To Spots.Rows.Count - 2
    OYFR(i) = (1 + SpotRates(i + 2)) ^ (Maturities(i + 2)) _
        / (1 + SpotRates(i)) ^ (Maturities(i)) - 1
Next i
OneYearFwdRates = OYFR

End Function

下面是电子表格。我想用上面的代码填充标题为 Forward Rates, f(x,1) 的蓝色列

                        Forward Rate
Maturity    Spot Rate     f(x,1)
 0.00         0.0200    
 0.5          0.0218    
 1.0          0.0231    
 1.5          0.0243    
 2.0          0.0253    
 2.5          0.0261    
 3.0          0.0268    
 3.5          0.0273    
 4.0          0.0277    
 4.5          0.0281    
 5.0          0.0284    
 5.5          0.0287    
 6.0          0.0289    
 6.5          0.0291    
 7.0          0.0293    
 7.5          0.0295    
 8.0          0.0296    
 8.5          0.0298    
 9.0          0.0299    
 9.5          0.0300    
 10.0         0.0301    
 10.5         0.0302    
 11.0         0.0303    
 11.5         0.0303    
 12.0         0.0304    
 12.5         0.0304    

【问题讨论】:

您应该提供示例数据。我假设这被用作 WorksheetFunction。您还应该说明程序试图做什么。为此目的可能有一个内置函数。可能More Forward Rates Lessons: How to calculate Forward Rates – Calculations walk through 嗨 TinMan,我刚刚编辑了我的问题以包含数据。感谢您的回复,希望对您有所帮助。我知道在 Excel 中简单地输入计算会更容易,但我很想掌握 VBA,尤其是用户定义的函数。 【参考方案1】:

问题是您永远不会为Maturities()SpotRates 分配任何值。只要范围是单行或单列,您就不需要这些变量。 SpotRates(1) 将返回范围内的第一个单元格,SpotRates(2) 第二个。

Function OneYearFwdRates(Mty As Range, Spots As Range) As Double()
    Dim OYFR() As Double                            'OYFR stands for One Year Forward Rates'
    ReDim OYFR(1 To Spots.Rows.Count, 1 To 1)
    Dim i

    For i = 2 To Spots.Rows.Count - 2
        OYFR(i, 1) = (1 + Spots(i + 2)) ^ (Mty(i + 2)) _
                  / (1 + Spots(i)) ^ (Mty(i)) - 1
        ' Debug.Print Spots(i), Mty(i)
    Next i
    OneYearFwdRates = OYFR
End Function

此函数返回一个数组,需要像其他数组公式一样使用 Ctrl + Shift + Enter 输入。

【讨论】:

TinMan,您的代码更加简洁,但结果仍然全为零。关于您关于不为 Dim Maturities() 赋值的评论,我使用 ReDim Maturities(Mty.Rows.Count) 重新定义了变量 - 这是不正确的吗? 好的,很高兴知道。但是,您知道为什么(新的和改进的)代码会产生零吗? 太好了,您的代码现在可以工作了。你是个传奇,非常感谢 TinMan。 大声笑..你一定把我和我的表弟搞混了......来自 OZ :) @AJD Fair dinkum mate!!

以上是关于UDF VBA 产生零。没有错误值,只有零。有人可以检查我的代码吗的主要内容,如果未能解决你的问题,请参考以下文章

VBA代码:减去值直到它达到零

VBA Excel UDF保留原始值

将 CSV 文件从 Google Drive 加载到 BigQuery 会产生零行且没有错误

合并列VBA时不会粘贴前导零

当输入为科学计数法时,VBA Round() 函数始终返回零

错误: - 服务类没有零参数构造函数