Search code examples
vbaexcelexcel-2007listobject

Freeze on close after ListObject Resize


I have an Excel file that takes data from outside and writes it in a ListObject.

As adding rows one by one through ListRows.Add is very slow, I add the right number of empty rows to the sheet and resize the ListObject.

This works really well in Excel 2010.
With Excel 2007, it works but when the user closes the workbook or Excel, it freezes and Windows displays its crash window (asking if you want to close, restart or debug the application).
This is really annoying and doesn't look very good :).

Any idea of what I could do to prevent that?
Maybe you have a better idea to quicky ladd thousands of rows in a ListObject?

Moreover randomly (I reopen the file change nothing and execute the macro), Resize fails with an error message and Excel crashes if I stop the execution.

Here is the function that adds the empty rows, if I follow it step by step it all the ranges are correct and it does what I need.
I'm pretty sure this is this function that causes the problem as it disappears when I comment the call to that function.

Sub AddRowsToListObject(sheetName As String, myTable As ListObject, addRows As Long)
    Dim i As Long

    If addRows > 0 Then
        Sheets(sheetName).Activate

        'Add empty rows at the end
        i = myTable.DataBodyRange.row + myTable.ListRows.Count
        Sheets(sheetName).Range(Cells(i, 1), Cells(i + addRows - 2, 1)).EntireRow.Insert shift:=xlDown  
        'Offset -1 as you need to include the headers again
        myTable.Resize myTable.DataBodyRange.Offset(-1, 0).Resize(myTable.ListRows.Count + addRows, myTable.ListColumns.Count)
    End If
End Sub

Solution

  • After a lot of painful testing, it looks like the problem is not in this method but in the deleting of the rows just before that :

    Sub ResetListObject(myTable As ListObject)
        myTable.DataBodyRange.ClearContents
        If myTable.DataBodyRange.Rows.Count > 1 Then
            myTable.DataBodyRange.Offset(1, 0).Resize(myTable.DataBodyRange.Rows.Count - 1, myTable.DataBodyRange.Columns.Count).EntireRow.Delete shift:=xlUp
        End If
    End Sub
    

    Excel 2010 requires you to always keep 1 row when you empty the ListObject.
    But Excel 2007 requires 2 rows !!
    I don't know why and I can't find any information on that.

    I changed my script to delete all rows except 2 and changed the function in the OP to manage that fact.