You don't really need this check in the StudentAssign function:
If Target.Column = 2 then
'
'
'
ElseIf Target.Column = 3 then
'
'
'
The main issue I have with the workbook is that sheets in the Collection are indexed according to the Sheet Tab position, counting from left to right. This means that if for any reason a tab is moved, inserted, or deleted, the first time you run your code based on Sheets(Index#), the workbook will be "destroyed" and would be very difficult to rebuild

This issue can be solved by refactoring the workbook and code to use CodeNames, which are read only only be modified in the VBIDE by hand, but can be used in any code.

You do have to use a cludge to select a sheet with CodeNames
Sub t()
For Each Sht In Worksheets
If Sht.CodeName = "***" Then 
With Sht
.Cells(1, 1) = "AAA"
End with
Next
End Sub
IMO, it's worth it to protect a workbook like yours

Personally, I would prefill the workbook with enough sheets to handle the maximum allowed number of students and hide all unused sheets.
as S11/S11C (Student 1)
For i = NumStudents + 1 to MaxAllowedStudents
For each Sht in WorkSheets
If sht.Codename = "S" & i &  i Or sht.codename = "S" & i &  i  & "C" Then sht.visible = 2 '2 = veryhidden
Next
Next


.