1. in a dynamic table you don't need to know how many rows are filled. The table dynamically adapts itself to the amount of data that is put into the table

2. I replaced the whole code in 'CopySurveyData' by 6 lines:

Sub M_snb()
  For Each it In Sheets(Array("Survey_Import_Data", "Survey_Import_Comments"))
    For Each it1 In it.ListObjects
      c00 = c00 & vbLf & it1.Name & "_" & it1.DataBodyRange.Columns(1).SpecialCells(2).Count
    Next
  Next
         
  MsgBox c00
End Sub
3. The for each method automatically creates objectvariables, so no worries about declaring variables at all. The VBcompiler is much smarter than most of its users.

4. So I found no reason to analyze your code any further