Функция среднеквадратичного значения (rms) в VBA?

Итак, я рассчитываю базовую статистику на своем листе, и он включает такой код, как:

xxx = Application.worksheetfunction.среднее(и т. д. и т. д. и т. д.

yyy = Application.worksheetfunction.мин(и т. д. и т. д. и т. д.

zzz = Application.worksheetfunction.max(и т. д. и т. д. и т. д.

Мой вопрос: существует ли функция, эквивалентная RMS, где я могу просто подключить ее вместо того, где у меня есть функции «среднее, минимальное, максимальное» в этом коде? А если нет, то какие средства кодирования наиболее эффективны для поиска решений RMS?

Надеюсь, я достаточно ясно изложил цель. Мне любопытно, есть ли предопределенная функция RMS для VBA или мне нужно создать какую-то пользовательскую функцию? ~ То, в чем я тоже новичок, поэтому, если для этого нет простой строки кода, мне придется больше читать о UDF.

ИЗМЕНИТЬ:

У меня около 30 000 строк, и для простоты представьте себе два столбца. В столбце A указан год, т.е. 1941 или что-то еще до 2008 года. Столбец B представляет собой числовое значение. Я просто пытаюсь собрать воедино код, который дает сводки по среднему, минимальному, максимальному и среднеквадратичному значениям за десять лет.


person WATERflowTech    schedule 13.08.2013    source источник
comment
Не могли бы вы объяснить, что вы имеете в виду, мой минимум и максимум по отношению к RMS?   -  person Lance Roberts    schedule 13.08.2013
comment
Эта информация полезна, однако я просматриваю несколько десятилетий через множество разных лет. Вместо того, чтобы вручную прокручивать и определять диапазоны, у меня есть VBA для автоматизации; и это позволяет мне использовать функции SumSq и CountA в VBA. Однако единственный вариант, который рекомендует VBE, — это функция «SqrtPi», а не просто «Sqrt». Мне определенно не хватает знаний по этому вопросу, но если бы вы могли подтолкнуть меня немного дальше в правильном направлении «sqrt», это было бы очень полезно!   -  person WATERflowTech    schedule 13.08.2013
comment
Абсолютно, у меня около 30 000 строк, и для простоты: представьте себе два столбца. В столбце A указан год, т.е. 1941 или что-то еще до 2008 года. Столбец B представляет собой числовое значение. Я просто пытаюсь собрать воедино код, который дает сводки по среднему, минимальному, максимальному и среднеквадратичному значениям за десять лет.   -  person WATERflowTech    schedule 13.08.2013
comment
Хорошо, но я все еще не понимаю. В исходном вопросе вы никогда не указывали, что вам нужны отдельные значения RMS. Итак, в моем электрическом мире я бы просто умножил на SQRT (2), чтобы получить среднеквадратичное значение, затем взял бы среднее значение и определил минимумы и максимумы, но я думаю, что вы хотите что-то другое.   -  person Lance Roberts    schedule 13.08.2013
comment
@pnuts, да, в этой небольшой ситуации сводная таблица сработала бы хорошо; однако это довольно небольшая часть всего проекта, над которым я работаю. Мне просто не хватало правильной грамматики VBA для добавления в этот фрагмент. Тем не менее, я ценю чаевые!   -  person WATERflowTech    schedule 13.08.2013


Ответы (3)


Вы можете сделать среднее с

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

или в VBA:

r = (Application.WorksheetFunction.SumSq(Range("A:A")) / Range("A:A").Count) ^ (1 / 2)
person Lance Roberts    schedule 13.08.2013
comment
Эта информация полезна, однако я просматриваю несколько десятилетий через множество разных лет. Вместо того, чтобы вручную прокручивать и определять диапазоны, у меня есть VBA для автоматизации; и это позволяет мне использовать функции SumSq и CountA в VBA. Однако единственный вариант, который рекомендует VBE, — это функция «SqrtPi», а не просто «Sqrt». Мне определенно не хватает знаний по этому вопросу, но если бы вы могли подтолкнуть меня немного дальше в правильном направлении «sqrt», это было бы очень полезно! - person WATERflowTech; 13.08.2013
comment
@WATERflowTech, хорошо, я также добавил функцию VBA, вы, вероятно, захотите использовать именованные диапазоны. - person Lance Roberts; 13.08.2013
comment
Вот и все, хороший призыв к энной степени. Я не думал об этом, но, без сомнения, буду помнить об этом в будущем! Спасибо Ланс! - person WATERflowTech; 13.08.2013

Функция 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
person Cor_Blimey    schedule 13.08.2013

Это сработало для меня:

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
person Anderson Wanselowski    schedule 24.02.2016