VBA中的均方根(rms)函数?

时间:2013-08-13 15:14:08

标签: excel vba worksheet-function

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

xxx = Application.worksheetfunction。平均(等等

yyy = Application.worksheetfunction。 min (等等

zzz = Application.worksheetfunction。 max (等等

我的问题:是否有一个RMS等效函数,我可以简单地将其插入代替我在该代码中具有'average,min,max'函数的位置?如果没有,那么编写查找RMS解决方案的最有效方法是什么?

我希望我已经明确说明了目标。我很好奇VBA是否有预定义的RMS功能,或者我是否需要创建某种用户定义的功能? 〜其中我也很新,所以如果没有简单的代码行可以为此写,我将不得不在UDF上做更多的阅读。

修改

我有大约30,000行,为简单起见:想象两列。 A列具有年份,即1941年或其他任何直到2008年.B列是数值。我只是想把代码放在一起,给出十进制的Average,Min,Max和RMS值。

3 个答案:

答案 0 :(得分:1)

你可以用

做平均值
=SQRT(SUMSQ(A:A)/COUNTA(range))

或在VBA中:

r = (Application.WorksheetFunction.SumSq(Range("A:A")) / Range("A:A").Count) ^ (1 / 2)

答案 1 :(得分:0)

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

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

“= 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

答案 2 :(得分: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