所以我在工作表中计算基本统计数据,其中包括以下代码:
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值。
答案 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