I've been running into the same problem. In my VBA code, I resorted to looking at the objects for the active worksheet and checking against the first 6 letters (when I copy a worksheet with tables, Excel 2007 simply appends a number to the end of the table names).
' First get table names on this worksheet (copying worksheet changes names of tables)
Dim oSh As Worksheet
Dim oLo As ListObject
Set oSh = ActiveSheet
For Each oLo In oSh.ListObjects
Application.Goto oLo.Range
'MsgBox ("Table found: " & oLo.Name & ", " & oLo.Range.Address)
' pathsTable =
Select Case Left(oLo.Name, 6)
Case "tblDec"
decTable = oLo.Name
Case "tblPat"
pathTable = oLo.Name
Case "tblPro"
processTable = oLo.Name
End Select
Next
Then in the rest of my code, I use the new names: decTable, pathTable, and processTable.
A simple work-around is to create names with local scope that refer to the table. So you'll have two names for each table - one with global scope and one with just the current worksheet scope. (In the Define Name dialog box, name the new range "Notes", change scope to the worksheet and the "Refers to" to =Table1 (or whatever Excel named the table)). Do this on the first worksheet, then copy the worksheet. The tables will have the same names with scope for just that worksheet. The drawback is that you can't use normal table referencing when using the duplicate name, e.g. "=average(Names[Column1])" doesn't work. :( If you are using just a small selection of columns of the table, you could create a name for each column that you want to use elsewhere, "myColumn1" refers to "=Table1[Column1]".