ListObject 调整大小后关闭时冻结

Freeze on close after ListObject Resize

我有一个 Excel 文件,它从外部获取数据并将其写入 ListObject。

由于通过 ListRows.Add 逐行添加行非常慢,我将正确数量的空行添加到 sheet 并调整 ListObject 的大小。

这在 Excel 2010 年非常有效。
对于 Excel 2007,它可以工作,但是当用户关闭工作簿或 Excel 时,它会冻结并且 Windows 显示其崩溃 window(询问您是否要关闭、重新启动或调试应用程序)。
这真的很烦人而且看起来不太好:)。

知道我可以做些什么来防止这种情况发生吗?
也许您有一个更好的主意,可以在 ListObject 中快速添加数千行?

此外,随机(我重新打开文件,不做任何更改并执行宏),调整大小失败并显示错误消息,如果我停止执行,Excel 会崩溃。

这是添加空行的函数,如果我一步一步地按照它操作,它所有的范围都是正确的并且它满足了我的需要。
我很确定是这个函数导致了问题,因为当我评论对该函数的调用时它就消失了。

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

不幸的是我没有 Excel 2007,无法复制问题中描述的错误。但是,假设:

  1. 代码未尝试添加超出 Excel 2007
  2. 容量的行
  3. 该错误是由用于向现有的添加新行的方法引起的ListObject
  4. 并且由于您要求使用替代方法将数千行添加到现有 ListObject

试试下面的代码

Sub ListObjects_AddRows(myTable As ListObject, addRows As Long)
    If addRows > 0 Then
        With myTable.DataBodyRange
            .Offset(.Rows.Count, 0).Resize(addRows, 1).EntireRow.Insert
            With .Offset(.Rows.Count, 0).Resize(addRows, 1)
                .Value = "X"
                .ClearContents
    End With: End With: End If
End Sub

在子

开始后立即添加Application.ScreenUpdating = False

在结尾前添加Application.ScreenUpdating = True

如果你正在做 1000 秒,那么你绝对不需要每次绘制新线时都刷新屏幕。更改它,它只会在完成后重新绘制它。

经过大量痛苦的测试,问题似乎不在这个方法中,而是在删除之前的行中:

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 要求清空 ListObject 时始终保留 1 行。
但是 Excel 2007 需要 2 行 !!
我不知道为什么,也找不到任何相关信息。

我更改了我的脚本以删除除 2 以外的所有行,并更改了 OP 中的函数来管理该事实。