【问题标题】:How to use the Resize function with the offset function in VBA code for a User Defined Function in Excel如何将 Resize 函数与 VBA 代码中的偏移函数一起用于 Excel 中的用户定义函数
【发布时间】:2019-08-19 05:28:33
【问题描述】:

我有 10 年的资产每月回报。我正在尝试创建一个函数,可以为我提供这一系列月度回报数据的年化回报。我想使用 Offset 函数转到最后一个月的回报日期,选择我选择的一组时期(3 个月前、6 个月前、12 个月前、24 个月前等),这样我就可以获得年化从结束日期返回到特定时期的一系列返回。

目标是计算过去 3 个月、6 个月、12 个月等的月平均回报率。

但是,VBA 中的 Offset 函数的参数与普通 Excel 函数中的参数不同。我想我需要使用 .Resize 函数来调整我的 Offset 函数的大小。

这是函数在 Excel 中的工作原理

=GEOMEAN(1+OFFSET($W$4,MATCH(LARGE($V$4:$V$10485,1),$V$4:$V$10485,0)-1,0,-$AJ17,1))-1

重写以便你能理解我的变量

=GEOMEAN(1+OFFSET(ref,MATCH(LARGE(Dates,1),Dates,0)-1,0,-period,1))-1

这是我目前写的代码...

Function Returns(ref As Range, Dates As Range, Period As Integer) As Variant

    With Application.WorksheetFunction

        Returns = .Geomean(1 + ref.Resize(-Period, 1).Offset(.Match(.Large(Dates, 1), Dates, 0) - 1, 0))-1



    End With



End Function

请问有人可以帮忙吗?

【问题讨论】:

    标签: excel vba resize user-defined-functions offset


    【解决方案1】:

    好的,所以我发现了我的一些错误。

    A) 我错误地声明了变量。

    B)我使用负数来调整大小,因为我希望该函数能够进入系列的末尾并倒数(获得 6 个月。12 个月,24 个月的回报)。这不起作用。

    作为替代方案,我使用 LARGE 来查找第 n 个最大的日期并选择该点下方的数组。

    参见下面的代码。

    函数 AnnReturns(Ref As Variant, Dates As Variant, Period As Variant, M As Variant) As Variant

    With Application.WorksheetFunction
    
    
        AnnReturns = .FVSchedule(1, (Ref.Offset(.Match(.Large(Dates, Period), Dates, 0) - 1, 0).Resize(Period, 1))) ^ (1 / M) - 1
    
    
    End With
    

    结束函数

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 2018-01-17
      • 2015-08-12
      • 2019-01-31
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多