VBA Tipp: Median ermitteln

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte den Median - also die Grenze zwischen den beiden Hälften einer geordneten Menge - einer Tabellen-/Abfragespalte ermitteln.

Lösung

Die folgende Funktion liefert den Median analog zu den Domänenaggregatfunktionen wie z.B. DAvg (für den Mittelwert):

Public Function Median(ByVal FldName As String, ByVal TblOrQryName As String, _
                       Optional ByVal Krit As String) As Double
    Dim DB As DAO.Database, RS As DAO.Recordset
    Dim RCount As Long, Offset As Long
    Dim OffsetValue As Double
    Set DB = CurrentDb()
    If Krit <> "" Then Krit = Krit & " AND "
    Set RS = DB.OpenRecordset("SELECT [" & FldName & _
                              "] FROM [" & TblOrQryName & "] WHERE " & Krit & "[" & FldName & _
                              "] IS NOT NULL ORDER BY [" & FldName & "]", dbOpenSnapshot)
    ' Um Nullwerte bei der Berechnung mit zu berücksichtigen,
    ' den Ausdruck
    '   WHERE [" & fldName & "] IS NOT NULL
    ' entfernen!
    ' Die Berechnung gibt nur für numerische Felder Sinn!
 
    With RS
        If .RecordCount = 0 Then GoTo Ex
        .MoveLast
        RCount = .RecordCount
        .MoveFirst
        Offset = (RCount \ 2)
        .Move Offset
        OffsetValue = CDbl(RS(FldName))
        If RCount Mod 2 = 0 Then
            .MovePrevious
            Median = (OffsetValue + CDbl(RS(FldName))) / 2
        Else
            Median = OffsetValue
        End If
Ex:
        On Error Resume Next
        .Close
    End With
    DB.Close
End Function

Aufruf

Zur Berechnung des Medians für das Feld "MeinFeld":

Median("MeinFeld", "MeineTabelle")


Wiki hinweis.png Anmerkung: Den Median zu ermitteln gibt nur bei Zahlenfeldern Sinn. Bei Textfeldern können aufgrund der Sortierung unerwünschte Ergebnisse heraus kommen.


Weblinks