在ListObject调整大小

时间:2015-09-28 10:54:08

标签: excel vba excel-vba excel-2007 listobject

我有一个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

3 个答案:

答案 0 :(得分:2)

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

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

    尝试以下代码

    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
    

答案 1 :(得分:0)

在子

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

在结束前添加Application.ScreenUpdating = True

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

答案 2 :(得分: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中的功能以管理该事实。