Oops, made a mistake above...I did that off of the top of my head and made the same mistake I did the first time I created that...it has a problem in the month of December (12/20/03 will have a month end of 12/31/02). Here's the updated:
CDate(Format(IIf(Month([testdate])=12,1,Month([testdate])+1) & "/1/" & IIf(Month([testdate])=12,Year([testdate])+1,Year([testdate])),"mm/dd/yyyy"

)-1
Basically this just has a clause added that says if it's December then put it ahead a year. I also got a Quarterly query...but it's very convoluted, I'm thinking there's got to be a better way (and maybe someone else will post it)...but for now, here's what I used:
CDate(Format(IIf(Month([testdate])>=10,1,Month([testdate])+(IIf(Month([testdate]) Mod 3=0,0,3-(Month([testdate])) Mod 3))+1) & "/1/" & IIf(Month([testdate])>=10,Year([testdate])+1,Year([testdate])),"mm/dd/yyyy"

)-1
It basically does the same thing as the month end (creates a date that's the first of the month after the month needed, then subtracts a day to get the last day of the month needed). There's a little difference though, the Mod formula returns the remainder...so for Feb we want the month to be March...Month(Feb) returns 2, Month(Feb) mod 3 returns 2...so if we do Month(Feb)+ (3-Month(Feb) mod 3) you're doing 2 + (3-2), which gets 3. So there it is...hope that helps.
Kevin