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 - eines Zahlenfelds in einer Tabellen oder einer Abfrage 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(FldName As String, TblOrQryName As String, _
                       Optional Krit As String) As Double
 
   'Quelle: hhtp://www.dbwiki.net/
 
   Dim db          As DAO.Database
   Dim rs          As DAO.Recordset
   Dim rCount      As Long
   Dim offset      As Long
   Dim offsetValue As Double
 
   Set db = DBEngine(0)(0)
   If Krit <> "" Then Krit = Krit & " AND "
   Set rs = db.OpenRecordset("SELECT [" & FldName & _
                             "] FROM [" & TblOrQryName & "] " & _
                             "WHERE " & Krit & "[" & FldName & "] IS NOT NULL " & _
                             "ORDER BY 1", dbOpenSnapshot)
   ' Um Nullwerte bei der Berechnung mit zu berücksichtigen,
   ' den Ausdruck
   '   WHERE [" & fldName & "] IS NOT NULL
   ' entfernen!
   '
   ' Die Berechnung gibt nur bei numerischen Feldern Sinn!
 
   With rs
      If .RecordCount = 0 Then GoTo Ex
 
      .MoveLast: .MoveFirst
      rCount = .RecordCount
 
      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
End Function

Aufruf

Zur Berechnung des Medians für das Feld "EinFeld" in einem Textfeldsteuerelement:

=Median("EinFeld";"EineTabelle")

oder in VBA:

   EineDoubleVariable = Median("EinFeld", "EineTabelle")
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