我有一个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
答案 0 :(得分:2)
不幸的是,我没有Excel 2007,也无法复制问题中描述的错误。然而,假设:
ListObject
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
答案 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中的功能以管理该事实。