【问题标题】:Calculate Weighted Geometric Average with Excel function使用 Excel 函数计算加权几何平均值
【发布时间】:2018-03-17 17:40:10
【问题描述】:

我是 Excel-VBA 的初学者,我需要创建一个函数来计算 几何加权平均值,给定一个值列表 (Mi) 和一个权重列表 (`威')。

Excel 公式为:EXP((SUM(Wi*LN(Mi))/(sum(Wi))

我对公式的“求和”部分有疑问。这是我到目前为止所做的:

Function GEOWAMC(Wi as Double, Mi as Double) As Double
    Range("A1").Formual="Sum("& Range(Cells(2,1), Cells(2,3)).Address(False,False)&")"
    GEOWAMC=((WorksheetFunction.Sum(Wi*ln(Mi))/(worksheetFunction.sum(Wi)))
End Function

【问题讨论】:

  • 您不能从工作表上的 udf 设置另一个单元格的公式。
  • 这是否意味着我需要创建两个不同的函数?
  • 您不能从工作表上的 udf 设置另一个单元格的公式。 因此,要么将公式键入 A1,要么编写一个将公式写入 A1 的 Sub(不是函数) . fwiw,根本不清楚您为什么要尝试将公式写入 A1。
  • 你能举个例子吗? (您有一些问题,但最大的问题是您的函数不会像现在这样接受多个单元格。)
  • 目标是计算投资组合的几何加权平均市值。我可以有 40 只股票(例如),每只股票都占我总投资组合的一定百分比。那将是“Wi”。为了计算这一点,我们还需要每只股票的当前市值,即“Mi”。 (如果可以的话,我会附上我的 excel 表格示例,我在此博客上找不到该功能)

标签: vba excel function formula


【解决方案1】:

我保证你是第一个需要在 Excel 中计算这个 - 或 你能想到的任何其他数学函数 - 的人。搜索“加权几何平均值 excel”将我带到 answer(可能与您获得该函数的位置相同)。

很高兴看到您尝试自己解决此问题,但阻止您的函数工作的不是“求和”部分。


调试你的 VBA 函数:

恐怕您的代码有一些问题。这个数字是“九”

  • 最重要的是,您在解释中转换了公式标准。
    W 开头的参数是重量,而其他参数是Value

  • 如果您想使用超过 1 个单元格的参数,请使用 Range(而不是 Double)。

  • 您不能在函数中直接为单元格赋值(或以任何其他方式更改单元格)。函数返回值到调用它的单元格。

  • Address(False, False) 在这种情况下不会有任何成效。
    (您需要更好地理解相对引用与绝对引用的目的。)

  • 而不是使用:Range(Cells(2,1), Cells(2,3)).Address(False,False)
    ...您可以使用 A2:C2,因为它们的意思完全相同(并且总是如此)。

  • 因此,所有这些:
    Range("A1").Formual="Sum("& Range(Cells(2,1), Cells(2,3)).Address(False,False)&")
    ...可以缩写为:[A1]=[A2]+[B2]+[C2]
    ...因为它们的意思是完全相同的东西(并且永远都是)。

  • 您在 VBA 中使用 工作表函数,这在 某些 情况下没问题
    ...但函数是Application.WorksheetFunction.Sum

  • 自然对数函数LN在使用它自己的值时只接受一个
    ...不是“列表”(或单元格范围)

  • 您应该在每个模块的顶部使用 Option Explicit,尤其是在学习疑难解答时;它至少可以帮助您发现其中的几个错误。

  • 你还有几组不必要的括号,但没什么大不了的。

所以,您可以解决所有这些问题,或者更好,您可以将其用作工作表函数并拯救自己(或其他人)大量工作无缘无故


使用工作表函数

语法:

=EXP(SUMPRODUCT( WeightRange ,LN( ValueRange ))/SUM( WeightRange ))

  • 请注意,相同*WeightRange* 输入了两次。
  • *WeightRange**ValueRange* 大小必须相同

示例:

如果:
- 单元格A1 to A5 包含您的值,并且,
- 单元格B1 to B5 包含值的权重,和,
- 你想要 Weighted Geometric Mean 在单元格C1

...然后在C1 中输入:

=EXP(SUMPRODUCT(B1:B5,LN(A1:A5))/SUM(B1:B5))

我怀疑这足以作为一个解决方案,因为我们已经完成了它,但是如果你有一个 实际 原因你需要这个计算放在 VBA 函数中,然后一定要让我知道,我会弄清楚的。 :-)

【讨论】:

  • 非常感谢,这非常有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2015-04-02
  • 2021-11-24
  • 2016-02-12
相关资源
最近更新 更多