代码之家  ›  专栏  ›  技术社区  ›  Cocotte

用Excel函数计算加权几何平均值

  •  1
  • Cocotte  · 技术社区  · 7 年前

    我是Excel VBA的初学者,我需要创建一个函数来计算 几何加权平均数 ,给出了一个值列表( Mi ),以及权重列表(“Wi”)。

    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
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   ashleedawg    7 年前

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

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


    调试VBA函数:

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

    • 最重要的是,您在解释中转换了公式标准。
      以开头的参数 W 重量 ,以及 另外 参数是 价值

    • 如果要对多个单元格使用参数,请使用 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* 输入两次。
    • 这个 *权重范围* *ValueRange* 两者必须大小相同

    示例:

    如果:
    -单元格 A1 to A5 包含您的值,
    -单元格 B1 to B5 包含值的权重,
    -你想要 加权几何平均数 C1

    。。。然后在 C1类 您将输入:

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

    我怀疑这将足以作为一个解决方案,现在我们已经讨论过了,但如果您有 真实的 原因 如果您需要在VBA函数中进行此计算,请务必让我知道,我会计算出来。:-)