I needed the same solution, but if you use your own ListObject.Add() method, you avoid the risk of colliding with any data right below the table. The procedure below checks the last row of the table and adds data there if it is empty; otherwise, it adds a new row to the end of the table:
Sub AddDataRow(tableName As String, values() As Variant) Dim sheet As Worksheet Dim table As ListObject Dim col As Integer Dim lastRow As Range Set sheet = ActiveWorkbook.Worksheets("Sheet1") Set table = sheet.ListObjects.Item(tableName) 'First check if the last row is empty; if not, add a row If table.ListRows.Count > 0 Then Set lastRow = table.ListRows(table.ListRows.Count).Range For col = 1 To lastRow.Columns.Count If Trim(CStr(lastRow.Cells(1, col).Value)) <> "" Then table.ListRows.Add Exit For End If Next col Else table.ListRows.Add End If 'Iterate through the last row and populate it with the entries from values() Set lastRow = table.ListRows(table.ListRows.Count).Range For col = 1 To lastRow.Columns.Count If col <= UBound(values) + 1 Then lastRow.Cells(1, col) = values(col - 1) Next col End Sub
To call the function, pass the table name and an array of values, one for each column. You can get / set the table name from the Design tab on the ribbon, at least in Excel 2013: 
Sample code for a table with three columns:
Dim x(2) x(0) = 1 x(1) = "apple" x(2) = 2 AddDataRow "Table1", x
Geoff source share