after the first occurrence of Set sht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)), sht will NOT be Nothing even if Set sht = ThisWorkbook.Sheets(cell.Value) should fail
so be sure to set sht to Nothing at each iteration
while ... .Copy sht.Range("A1") will always be pasting from cell A1 of the target sheet, hence you have to update the target cell like with sht.Cells(Rows.Count, 1).End(xlUp).Offset(1)
So that you could use the following:
For Each cell In rng
If Len(cell.Value) > 0 And Not IsNumeric(cell.Value) Then
Set sht = Nothing ' set sht to Nothing and erase the result of the preceeding loop
On Error Resume Next
Set sht = ThisWorkbook.Sheets(cell.Value)
On Error GoTo 0
If sht Is Nothing Then
Set sht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
sht.Name = cell.Value
End If
ws.Range("A" & cell.Row & ":H" & cell.Row).Copy sht.Cells(Rows.Count, 1).End(xlUp).Offset(1) 'paste starting from column A first empty cell after last not empty one
End If
Next cell