【问题标题】:Weighted average rate in VBAVBA中的加权平均率
【发布时间】:2016-03-19 10:08:01
【问题描述】:

我对 VBA 很陌生,所以如果我的问题看起来很琐碎,我很抱歉。 我很想在 VBA 中编写一个函数来帮助估计加权平均利率(例如,对于贷款组合)。我编写了以下 VBA 代码:

Function WAIRS(Amount As Range, InterestRate As Range, MatchRange As Range, Match1)
WAIRS = Evaluate("=SUMPRODUCT(--(""" & MatchRange & """ = """ & Match1 & """),""" & Amount & """, """ & InterestRate & """)")      /Application.WorksheetFunction.SumIfs(Amount, MatchRange, Match1)
End Function

问题是,当我通过添加相应的函数标准在 Excel 中运行此函数时,我得到一个“#VALUE#”。我已经尝试了很多,但无法找出问题所在。如果您能帮助我,我将不胜感激。

提前谢谢你。

最好, 济勋

【问题讨论】:

    标签: excel conditional weighted-average vba


    【解决方案1】:

    您为Evaluate 构建的字符串(在这种情况下)不应包含文字双引号。而不是引用范围值的结果

    """" & MatchRange & """"
    

    ...您应该检索该范围的地址表示法,并使用它而不用引号括起来:

    MatchRange.Address()
    

    如果您始终如一地应用它,它将使公式的 Evaluate 部分看起来像这样:

    "=SUMPRODUCT(--(" & MatchRange.Address() & " = " & Match1.Address() & "), " & _
                        Amount.Address() & ", " & InterestRate.Address() & ")" 
    

    当范围是另一张纸时:

    如果您的范围在另一张纸上,上述方法将不起作用。在这种情况下,我建议创建这个函数:

    Public Function fullAddr(range As Range)
        fullAddr = "'" & range.Parent.Name & "'!" & _
                      range.Address(External:=False) 
    End Function
    

    然后在你的公式中:

    "=SUMPRODUCT(--(" & fullAddr(MatchRange) & " = " & fullAddr(Match1) & "), " & _
                        fullAddr(Amount) & ", " & fullAddr(InterestRate) & ")" 
    

    【讨论】:

    • 谢谢 trincot。我摆脱了单元格中的错误,但公式给出的值为零,这是不正确的。你觉得函数写对了吗?
    • 我想我发现我的数据在另一张纸上,所以在这种情况下,函数没有评估。你知道我在函数评估时是否可以忽略工作表名称吗?
    • 我添加了一些建议的代码来处理来自另一个工作表的范围。
    猜你喜欢
    • 2015-06-11
    • 2017-08-05
    • 2020-11-28
    • 2010-09-21
    • 1970-01-01
    • 2017-08-06
    • 2017-06-19
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多