2013-08-13 14 views
5

Więc obliczam podstawowe statystyki w moim arkuszu roboczym i obejmuje on kod taki jak:Funkcja Średnia kwadratowa (rms) w VBA?

xxx = Application.workheetfunction. średnia (etc etc etc

yyy = Application.worksheetfunction min (etc etc etc

zzz = Application.worksheetfunction max (etc etc etc

Moje pytanie:.. Czy istnieje funkcja równoważna z RMS, w której mogę po prostu podłączyć ją zamiast miejsca, w którym mam funkcje "średnia, min., maks." w tym kodzie? A jeśli nie ma wtedy najskuteczniejszych sposobów kodowania w celu znalezienia rozwiązań RMS?

Mam nadzieję, że jasno określiłem cel. Ciekawi mnie, czy istnieje predefiniowana funkcja RMS dla VBA, czy też muszę utworzyć jakąś funkcję zdefiniowaną przez użytkownika? ~ Z których jestem całkiem nowy, więc jeśli nie ma prostej linii kodu do napisania, będę musiał zrobić więcej czytania na UDF.

EDIT:

Mam około 30000 wierszy, a dla uproszczenia: wyobrazić sobie dwie kolumny. Kolumna A ma rok np. 1941 lub cokolwiek innego do 2008 roku. Kolumna B jest wartością liczbową. Próbuję po prostu wstawić kod, który daje dziesięcioletnie podsumowania wartości Średnie, Min., Maks. I RMS.

+1

SQRT (SUMSQ (A1: A10)/COUNTA (A1: A10)) na [MrExcel] (http://www.mrexcel.com/forum/excel-questions/8734-root-mean-square. html) – pnuts

+1

Czy możesz wyjaśnić, co masz na myśli moje "min" i "max" w odniesieniu do RMS? –

+0

Ta informacja jest pomocna, jednak przechodzę przez wiele dziesięcioleci przez tłumy różnych lat. Zamiast ręcznie przewijać i definiować zakresy, mam go w VBA, aby go zautomatyzować; i pozwala mi używać funkcji "SumSq" i "CountA" w VBA. Jednak jedyną opcją zalecaną przez VBE jest funkcja "SqrtPi", a nie "Sqrt".Z całą pewnością brakuje mi wiedzy na ten temat, ale gdybyś mógł mnie popchnąć nieco dalej w dobrym kierunku na "sqrt", który byłby najbardziej pomocny! – WATERflowTech

Odpowiedz

1

Można zrobić średnią z

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

lub w VBA:

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

Ta informacja jest pomocna, jednak przechodzę przez wiele dziesięcioleci przez tłumy różnych lat. Zamiast ręcznie przewijać i definiować zakresy, mam go w VBA, aby go zautomatyzować; i pozwala mi używać funkcji "SumSq" i "CountA" w VBA. Jednak jedyną opcją zalecaną przez VBE jest funkcja "SqrtPi", a nie "Sqrt". Z całą pewnością brakuje mi wiedzy na ten temat, ale gdybyś mógł mnie popchnąć nieco dalej w dobrym kierunku na "sqrt", który byłby najbardziej pomocny! – WATERflowTech

+0

@WATERflowTech, ok, dodałem również funkcję VBA, prawdopodobnie będziesz chciał używać nazwanych zakresów. –

+0

To wszystko, dobre wołanie do n-tej potęgi. Nie myślałem o tym, ale bez wątpienia będę pamiętał o tym w przyszłości! Dzięki Lance! – WATERflowTech

0
funkcja

VBA, który akceptuje tablic (dowolna pozycja) i waha się w wielu dziedzinach (nieciągłego zakresu jak A4: B6, C11: D15), a nawet związek zakresów w formule. Pomija typy danych nie zawierające liczb (w tym daty, wartości logiczne, puste pola itp.).

Można go używać w kodzie VBA, lub jako UDF w formule arkusza takich jak:

"= RMS (A1: A10)" (Podstawowe użycie)

„= RMS (A1: A10, C1: C10) "(wiele zakresów (lub tablic):

" {= RMS ({1,2,3,4})} "(wzór macierzy wprowadzony przy pomocy 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 
0

Ten działał dla mnie:

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