As pointed out in comments, you're not using your With ws statement. I saw this issue arrise in another one of your questions earlier in the month too so I thought I'd give an explanation for how to use the statement correctly. 
Consider this code: 
Sub WithStatementExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws
    Range("A1").Value = "This cell is A1 and this sheet name is " & ws.Name
    ActiveSheet.Range("A2").Value = "This cell is A2 and this sheet name is " & ws.Name
End With
End Sub 
Now although our statements are encapsulated within the With statement, the output to cells A1 and A2 will actually both be on whatever sheet is active at the time the code is executed. 
As example, consider this new workbook with 3 sheets, all with default names: 

If we execute the code based on the workbook in that screenshot, the results will go where we are assuming they will - Sheet1 cells A1 and A2. But if we run the code whilst Sheet3 is active, the code outputs the values to  Sheet3 cells A1 and A2.

This is because within our With statement, we have not used our ws worksheet as the object qualifier for the Range property.
The range property can apply to both the Application and Worksheet objects and per Application.Range documentation:
When used without an object qualifier, this property is a shortcut for ActiveSheet.Range (it returns a range from the active sheet; if the active sheet isn't a worksheet, the property fails).
To get the statements within the With block using the object, type a . in front of your statements: 
Sub WithStatementExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws
    .Range("A1").Value = "This cell is A1 and this sheet name is " & ws.Name
    .Range("A2").Value = "This cell is A2 and this sheet name is " & ws.Name
End With
End Sub 
Now the output will only go to the sheet assigned to the ws variable - in this case, Sheet1.

If you need some statements to be applied to other sheets but executed within your With block, you are better off using an explicit reference to the workbook rather than ActiveSheet - This will help explain more - (How to avoid using select in vba)
So if the ListObjects in your code were actually on Sheets("TOC") not whichever ws the loop is referring to, I'd change ActiveSheet.ListObjects... and ActiveSheet.ListObjects("Table1")... to:
wb.Sheets("TOC").ListObjects...
wb.Sheets("TOC").ListObjects("Table1")...
With your For Each...Next loop, your variable ws in this case represents an object - specifically a worksheet. The variable ws is assigned the next object at each iteration, so you don't need to set the worksheet object to the variable independently to the loop. 
In my example above I had 3 sheets. The two below code blocks will achieve the same outcome, one via a For Each...Next loop and the other without. 
For Each...Next approach:
Sub ForEachExample()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    Debug.Print ws.Name
Next ws
End Sub
No loop approach:
Sub NoLoopExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)     'The same as Sheets(1) or Sheets("Sheet1")
Debug.Print ws.Name
Set ws = ThisWorkbook.Sheets(2)         'The same as Worksheets(2) or Sheets("Sheet2")
Debug.Print ws.Name
Set ws = ThisWorkbook.Sheets("Sheet3")  'The same as Worksheets(3) or Sheets(3)
Debug.Print ws.Name
End Sub
Both of them will output the following to the immediate window in the VBE:
Sheet1
Sheet2
Sheet3
In your updated code, you are setting ws to ThisWorkbook.Sheets("Sheet2"). 
- You will need to have a worksheet named "Sheet2"in your workbook or you will get aRuntime Error 9: subscript out of rangeerror.
- The next line in your code is the For Each...Nextstatement which will setwsto the first sheet in theWorksheetscollection, regardless of the previous line of code.
What I'm pointing out is that line of code is redundant in your current procedure and depending on the names of your worksheets, will probably be causing a runtime error. 
See the For Each...Next statement documentation.
With your Select Case statement, your first line Select Case ws.Names should throw a Compile Error: Type mismatch. ws.Names returns the collection of worksheet specific names based on the object qualifyer (to it's left) - in this case ws. Because we are looking for the sheets name specifically, it should be ws.Name which returns the name of the object qualifyer. 
So to take that into account it could look something like:
For Each ws In ThisWorkbook.Worksheets
    Select Case ws.Name
        Case "TOC"
            'Do nothing
        Case Else
            'Do your actions here
    End Select
Next ws
As a side note, you could also achieve the same with an If...Else statement like so: 
For Each ws In ThisWorkbook.Worksheets
    If ws.Name = "TOC" Then    'Note by using = "TOC" must match exactly, including letter casing. 
        'Do nothing
    Else
        'Do your actions here
    End If
Next ws