Mark A Matte
markamatte at hotmail.com
Tue Apr 11 13:02:30 CDT 2006
Julie,
For some reason posts like this intrigue me...but my results aren't always
pretty...I think I have what you described. The trick is getting VBA in
access to do exactly what the function in excel does...
1. Count records
2. multiply by your percent
3. rounds DOWN to number divisible by 2.
4. divides by 2
5. takes this number of records off the top and bottom
6. averages the rest
for example: (from the EXCEL help)
TRIMMEAN(array,percent)
Array is the array or range of values to trim and average.
Percent is the fractional number of data points to exclude from the
calculation. For example, if percent = 0.2, 4 points are trimmed from a data
set of 20 points (20 x 0.2), 2 from the top and 2 from the bottom of the
set.
Remarks
·If percent < 0 or percent > 1, TRIMMEAN returns the #NUM! error value.
·TRIMMEAN rounds the number of excluded data points down to the nearest
multiple of 2. If percent = 0.1, 10 percent of 30 data points equals 3
points. For symmetry, TRIMMEAN excludes a single value from the top and
bottom of the data set.
Below is what I came up with to mimic this logic: I used a table with 3
fields containing...Record ID, some number, Name(subcategory)...so I could
get the MEAN for grouped by Name.
**************************************
Dim Per
Per = 0.2
Dim db As Database
Set db = CurrentDb()
Dim GroupRst As Recordset
Set GroupRst = db.OpenRecordset("SELECT Table1.Name FROM Table1 GROUP BY
Table1.Name;", DB_OPEN_DYNASET)
Dim GroupName As Field
Set GroupName = GroupRst!Name
Do Until GroupRst.EOF
Dim MyRst As Recordset
Set MyRst = db.OpenRecordset("SELECT Table1.id, Table1.Field1,
Table1.Name FROM Table1 WHERE (((Table1.Name) = '" & GroupName & "')) ORDER
BY Table1.Field1;", DB_OPEN_DYNASET)
Dim List As Field
Set List = MyRst!Field1
Dim Counter
Counter = MyRst.RecordCount
Dim Trim
Dim MaxTrim
Dim Div
If InStr(1, Int(Counter * Per) / 2, ".") = 0 Then
Trim = Int(Counter * Per) / 2
MaxTrim = Counter - Int(Counter * Per) / 2 + 1
Div = Counter - Int(Counter * Per)
Else
Trim = (Int(Counter * Per) - 1) / 2
MaxTrim = Counter - (Int(Counter * Per) - 1) / 2 + 1
Div = Counter - Int(Counter * Per) + 1
End If
Dim ListSum
ListSum = 0
Dim Num
Num = 0
Do Until MyRst.EOF
Num = Num + 1
If Num > Trim And Num < MaxTrim Then
ListSum = ListSum + List
Else
ListSum = ListSum
End If
MyRst.MoveNext
Loop
MsgBox "The TRIMMEAN for " & GroupName & "is " & ListSum / Div
GroupRst.MoveNext
Loop
*******************************************
I hope this helps. Please let me know if you have any questions...or I can
send a sample db offline.
Thanks,
Mark A. Matte