5

所以我在我的工作表中计算基本统计数据,它包括以下代码:

xxx = Application.worksheetfunction。平均(等等等等等等

yyy = Application.worksheetfunction。分钟(等等等等等等

zzz = Application.worksheetfunction。最大(等等等等等等

我的问题:是否有一个 RMS 等效函数,我可以简单地将其插入该代码中具有“平均、最小值、最大值”函数的位置?如果没有,那么编写代码以找到 RMS 解决方案的最有效方法是什么?

我希望我已经足够清楚地说明了目标。我很好奇是否有用于 VBA 的预定义 RMS 函数,或者我是否必须创建某种用户定义的函数?〜我对此也很陌生,所以如果没有为此编写简单的代码行,我将不得不在UDF上做更多的阅读。

编辑:

我有大约 30,000 行,为了简单起见:想象两列。A 列有年份,即 1941 年或到 2008 年的任何其他时间。B 列是一个数值。我只是想把代码放在一起,给出平均值、最小值、最大值和 RMS 值的十年摘要。

4

3 回答 3

1

你可以用

=SQRT(SUMSQ(A:A)/COUNTA(range))

或在 VBA 中:

r = (Application.WorksheetFunction.SumSq(Range("A:A")) / Range("A:A").Count) ^ (1 / 2)
于 2013-08-13T15:18:11.697 回答
0

一个 VBA 函数,它接受数组(任何等级)和具有多个区域的范围(不连续的范围,如 A4:B6、C11:D15),甚至是公式中的范围的联合。它会跳过非数字数据类型(包括日期、布尔值、空格等)。

您可以在 VBA 代码中使用它,也可以在工作表公式中将其用作 UDF,例如:

“=RMS(A1:A10)”(基本用法)

"=RMS(A1:A10,C1:C10)" (多个范围(或数组))

"{=RMS({1,2,3,4})}"(使用 Ctrl+shift+enter 输入的数组公式)

Function RMS(ParamArray args()) As Double

    Dim arg, arr, area As Range, ss As Double, n As Long

    For Each arg In args
        If TypeOf arg Is Range Then
            For Each area In arg.Areas
                arr = area.value
                If VarType(arr) < vbArray Then
                    queryRmsElements Array(arr), ss, n
                Else
                    queryRmsElements arr, ss, n
                End If
            Next area
        ElseIf VarType(arg) > vbArray Then
            queryRmsElements arg, ss, n
        Else
            Err.Raise 1, "RMS", "Invalid Argument"
        End If
    Next arg

    RMS = (ss / n) ^ 0.5

End Function
Private Sub queryRmsElements(ByRef elements, ByRef ss As Double, ByRef n As Long)
    Static element As Variant
    'Enumerate to cover rank > 1 (vs. Iterate)
    For Each element In elements
        Select Case VarType(element)
            Case VbVarType.vbByte, _
                 VbVarType.vbCurrency, _
                 VbVarType.vbDecimal, _
                 VbVarType.vbDouble, _
                 VbVarType.vbInteger, _
                 VbVarType.vbLong, _
                 VbVarType.vbSingle
                 ss = element ^ 2 + ss
                 n = n + 1
            Case Else
        End Select
    Next element
End Sub
于 2013-08-13T17:37:54.423 回答
0

这个对我有用:

Function RMS(Intervalo As Range)

Dim SomaQ As Double
Dim Tamanho As Integer

SomaQ = 0
Tamanho = Intervalo.Count
SomaQ = Application.WorksheetFunction.SumSq(Intervalo)
RMS = Sqr(SomaQ / Tamanho)

End Function
于 2016-02-24T15:59:38.787 回答