Public Function Median(ByVal strTable As String, ByVal strField As String, _
ByVal strSeries As String, ByVal lngSeries As Long) As Single
On Error GoTo Err_Median
Const cID As String = "%ID%"
Const cField As String = "%FieldName%"
Const cTable As String = "%TableName%"
Const cSeries As String = "%Series%"
Const SQL As String = "SELECT [%FieldName%] FROM [%TableName%] " & _
"WHERE [%FieldName%] Is Not Null AND [%Series%] = %ID% " & _
"ORDER BY [%FieldName%];"
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim OffSet As Integer
Dim RCount As Integer
Dim i As Integer
Dim x As Double
Dim y As Double
strSQL = Replace(SQL, cField, strField)
strSQL = Replace(strSQL, cTable, strTable)
strSQL = Replace(strSQL, cSeries, strSeries)
strSQL = Replace(strSQL, cID, lngSeries)
Set db = CurrentDb
Set rs = MedianDB.OpenRecordset(strSQL)
rs.MoveLast
RCount = rs.RecordCount
x = RCount Mod 2
If x <> 0 Then
OffSet = ((RCount + 1) / 2) - 2
For i% = 0 To OffSet
rs.MovePrevious
Next i
Median = rs(strField)
Else
OffSet = (RCount / 2) - 2
For i = 0 To OffSet
rs.MovePrevious
Next i
x = rs(strField)
rs.MovePrevious
y = rs(strField)
Median = (x + y) / 2
End If
rs.Close
db.Close
Exit_Median:
Set rs = Nothing
Set db = Nothing
Exit Function
Err_Median:
Median = 0
Resume Exit_Median
End Function