5

だから私は自分のワークシートで基本的な統計を計算しており、次のようなコードが含まれています:

xxx = アプリケーション.ワークシート関数。平均(などなどなど

yyy = アプリケーション.ワークシート関数。(などなどなど

zzz = Application.worksheetfunction. 最大(などなどなど

私の質問:そのコードに「平均、最小、最大」関数がある場所に単純にプラグインできるRMS同等の関数はありますか? 存在しない場合、RMS ソリューションを見つけるためにコーディングする最も効率的な手段は何でしょうか?

目標を十分に明確に述べたことを願っています。VBA 用に定義済みの RMS 関数があるかどうか、またはある種のユーザー定義関数を作成する必要があるかどうかについて興味がありますか? 〜私もかなり慣れていないので、これを書くための簡単なコード行がない場合は、UDF についてもっと読む必要があります。

編集:

約 30,000 行ありますが、簡単にするために、2 つの列を想像してください。列 A には 1941 年または 2008 年までの年が含まれます。列 B は数値です。平均値、最小値、最大値、および RMS 値の 10 年間の要約を提供するコードをまとめようとしています。

4

3 に答える 3

0

配列 (任意のランク) と複数の領域 (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
于 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 に答える