配列 (任意のランク) と複数の領域 (A4:B6、C11:D15 のような不連続な範囲) を含む範囲、または数式内の範囲の結合を受け入れる VBA 関数。数値以外のデータ型 (日付、ブール値、空白などを含む) をスキップします。
これは、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