0

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

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

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

知道我能做些什么来防止这种情况吗?
也许您有一个更好的主意,可以在 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
4

3 回答 3

2

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

  1. 该代码不会尝试添加超出 Excel 2007 容量的行
  2. 该错误是由用于将新行添加到现有的方法引起的ListObject
  3. 并且由于您正在寻求一种替代方法来将数千行添加到现有的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
于 2015-09-28T12:40:28.760 回答
0

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

Application.ScreenUpdating = True在结尾之前添加

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

于 2015-09-28T12:57:25.420 回答
0

经过大量痛苦的测试,看起来问题不在于此方法,而在于删除之前的行:

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 中的函数以管理该事实。

于 2015-09-28T15:38:32.907 回答