There are two ways to do this depending on how much data you are wanting to look at at any one time.
You can have the data converted and displayed live using a crosstab query - but depending on how much data you want to look at at any one time this may be slooooow.
Alternatively you can write a number of queries that build the data into a table which you can then call on - this will be quicker, but will need updating every now and then.
A couple of the spreadsheets I produce have 200 columns or so - for this I use a combination of tables and live queries. Things like SAT results hardly every change so that would probably be a good candidate for a permenant table wherease attendance changes twice a day so that is better live.
Anyway - copy and paste this into the SQL window of the Access query designer and it should give you what you want (just hope it does not screw the page up!)
Then go back to the design view and you should see the place to put your desired examid.
TRANSFORM First(Left(Mid([criteriadata],InStr(1,[criteriadata],[mapvalue])+1+Len([mapvalue]+1),100),InStr(1,Mid([criteriadata],InStr(1,[criteriadata],[mapvalue])+1+Len([mapvalue]+1),100),Chr$(10)))) AS [Value]
SELECT NSTURESULTS.StudentId, NSTURESULTS.ExamId
FROM ASSESSCRITERIA INNER JOIN NSTURESULTS ON ASSESSCRITERIA.AssessId = NSTURESULTS.AssessId
WHERE (((NSTURESULTS.ExamId)="<<YOUR EXAMID GOES HERE>>"))
GROUP BY NSTURESULTS.StudentId, NSTURESULTS.ExamId
PIVOT [ModuleID] & " - " & [CritLabel];
It will do this for every student that has ever had that examid - if you want to filter it to a certain year group then include the STUDENTS table and filter for the relevant setid and courseyear.