OK, scrap the first idea since it won't work well with you date requirement. Think about going with a table (tblCatHit) with this structure:
FieldName DataType
CatHitID Autonumber
CatName Text
HitDate Date/Time (short date)
In your listbox's (lstCats) on click event, add the following code:
Dim strSQL As String
strSQL = "INSERT INTO tblCatHit ( CatName, HitDate )" _
& "SELECT tblCats.CatName, Now() AS dDate FROM tblCats " _
& "WHERE (((tblCats.CatName)=Forms!YourFormName!YourControlName));"
docmd.SetWarnings False
docmd.RunSQL strSQL
docmd.SetWarnings True
Now, when you select from the list box, the code will be adding records to tblCatHits, looking like this:
CatHitID CatName HitDate
1 Staff 5/16/2001
2 Clients 5/16/2001
3 Training 5/16/2001
4 Billing 5/16/2001
5 Billing 5/16/2001
Now you need a totals query which will count the number of hits for each category, including those where there were no hits. A locally modified variation of this will do it:
SELECT tblCats.CatName, Count(tblCatHit.HitDate) AS CountOfHitDate
FROM tblCats LEFT JOIN tblCatHit ON tblCats.CatName = tblCatHit.CatName
GROUP BY tblCats.CatName
ORDER BY Count(tblCatHit.HitDate) DESC , tblCats.CatName;
…returning this (from my example)
CatName CountOfHitDate
Billing 2
Clients 1
Staff 1
Training 1
Documenter 0
Help 0
Instructions 0
Residential 0
Utilities 0
Now, all you need is a report based on the above query, and a mechanism to specify the date range.