Author : Johannes Weigel
Date Submitted : 5/29/2001
Category : Mathematical
Compatibility : VB 6
This code has been accessed 11209 times.
Task : Median function
Calculates the median of MS Access data sets
Declarations
Code
Attribute VB_Name = "modul_Median"
Option Explicit
'Median-Funktion (deutsch)
'Die Funktion MEDIAN berechnet in Access-Abfragen ein neues Feld mit den Medianwerten
'der Werte des Datensatzes. Der Median ist der "mittlere Wert" einer Datenreihe, also
'bspw für 1,2 und 100 die 2 oder für 1,2,3 und 100 die 2,5 (Mittelwert aus 2 und 3).
'Die Syntax der Funktion MEDIAN in einer Access-Abfrage ist folgendermaßen:
'WertXY: Median("quelltabelle",[quelltabelle]![ID],zahl), wobei das ID-Feld laufende
'Nummern enthalten und tatsächlich auch ID heißen muss. Zahl bezeichnet die Anzahl an
'Feldern (von links) in der Tabelle, die nicht zur Berechnung des Medians verwendet
'werden sollen oder können (bei Sielhautkataster: 88, nämlich ID, Probepunkt-Nr, Probe-Nr,
'Probenahme-Datum (zusammen 4), 42 übernommene Werte aus tab_Daten sowie 42 Vergleichs-
' werte aus tab_Vergleichswerte. Das neue Feld (WertXY) heißt k_mess.
'johannes.weigel@htp-tel.de, 2001
'-----------------------------------------------------------------------------------
'Median function (english)
'The difference to other median functions is the following: This module does not
'calculate the median value of the values (rows) in a single field, but of the
'values (colums) in a single data set, which is more complicated because you
'can't simply work with recordsets (and sort values), but have to work with arrays
'instead.
'How to use the Median function?
'Open an MS Access project. Create an empty module. Click File\Import file and import
'this source code. Create a query with the values You want to calculate the median.
'Use the following syntax when You execute the function from a query:
'valueXY: Median("sourcetable",[sourcetable]![ID],number)
'If the sourcetable is equivalent to the query from which You start MEDIAN,
'You don't have to repeat the table name. The ID field has to be named ID.
'Number means the number of fields which are not used in the median calculation.
'Questions, remarks and bug reports to johannes.weigel@htp-tel.de
'------------------------------------------------------------------------------------
Function Median(tabelle As String, zeilenID As Integer, unusedFields As Integer) As Single
Dim MedianDB As DAO.Database
Dim MedianLine As DAO.Recordset
Dim number As Integer, str As String, thepos As Integer
Dim anzahl As Integer, element As Variant, rest As Byte, usedValues() As Boolean
Dim up As Double, down As Double, I As Integer, j As Integer
Dim downold As Double, delta As Double, deltaold As Double, nextelement As Integer
Set MedianDB = CurrentDb()
Set MedianLine = MedianDB.OpenRecordset("SELECT * " & _
"FROM [" & tabelle & "] WHERE [ID]=" & zeilenID)
anzahl = MedianLine.Fields.Count
ReDim values(anzahl - unusedFields)
Dim varArray As Variant
varArray = MedianLine.GetRows(zeilenID)
str = ""
I = 0 'Übertragen aus dem Recordset in das Array "values"
For Each element In varArray
I = I + 1
If I > unusedFields Then
values(I - unusedFields) = element
End If
Next element
anzahl = anzahl - unusedFields 'Nichtberücksichtigen der drei "Info"-Spalten
rest = anzahl Mod 2 'rest= 0 steht für gerade, 1 für ungerade
ReDim sortedValues(anzahl)
ReDim usedValues(anzahl)
up = 1
For I = 1 To anzahl
If values(I) > values(up) Then up = I
Next I
str = ""
'aufsteigendes Sortieren der Werte
For I = 1 To anzahl
down = up
For element = 1 To anzahl
If (values(element) < values(down)) And (usedValues(element) = False) Then _
down = element
Next element
sortedValues(I) = values(down)
usedValues(down) = True
Next I
If rest = 1 Then 'Zuweisen der Werte in der Mitte (Medianwerte)
Median = sortedValues((anzahl + 1) / 2)
Else
Median = (sortedValues(anzahl / 2) + sortedValues((anzahl + 2) / 2)) / 2
End If
MedianLine.Close
MedianDB.Close
End Function
'-----------------------------------------------------------------------------
'Portions of this work include intellectual property of Johannes Weigel and are used herein
'with permission. Copyright (C) 2000 Johannes Weigel. All rights reserved.