well - it works! general points
1. give your field names meaningful names - ID? ID of what? There is much debate about the suffix - my preference is to use PK and FK (primary key and foreign key) i.e. StudentPK and StudentFK (to replace the StudentID field in tblProgress which is then not required) - you'll need to change your rowsources in the form
2. create table relationships on PK and FK - in your query you have done it on the studentID field - if you were to change the value in one table, your query will cease to work
3. tblProgress is not normalised - however since you don't have anything about subject, it can revised later if required
4. with regards the form you don't need to populate the student name fields with vba code - just put in the controlsource
=Select.column(1) --- or (2) for last name
5. you also don't need to enable/disable the controls to update the controls via VBA
6. you don't need qryTrack you could just use the table - see next point. Also if you want to display no results if a student doesn't have a matching record in tblProgress, your join is the wrong way round - but in this example could just be an inner join.
7. you also don't need to restate the listbox rowsource if you put
SELECT Mark1, Mark2, Mark3 FROM tblProgress WHERE StudentID = [SELECT]
in the rowsource (rather than using VBA), then your select afterupdate just needs the requery line.
8. Alternatively if you are going to populate the rowsource with vba code as you are at the moment, you don't need the requery
9. Finally, 'SELECT' is a reserved word, using reserved words can produce misleading error messages - see this link
10. Back to table design - your studentID field in tblStudent is indexed (duplicates OK) - just think about the implications of allowing two records with the same StudentID
As I said, it works but do check out my pointers - they will benefit you in the long term.