2015-09-28 56 views
0

我有一個Excel文件,它從外部獲取數據並將其寫入ListObject。在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

了很多痛苦的測試後,它看起來像這個問題是不是在這個方法,但在行刪除之前只是:

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中要求你始終保持1行,當你清空ListObject。
但Excel 2007需要2行 !!
我不知道爲什麼,我無法找到任何有關的信息。

我更改了腳本以刪除除2之外的所有行,並更改了OP中的功能以管理該事實。

2

不幸的是,我沒有Excel 2007,也無法複製問題中描述的錯誤。但是並假設:

  1. 的代碼是不是要增加超出該錯誤是由使用新的行添加到現有的ListObject
  2. 既然你的方法造成的Excel 2007
  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 
的代碼
0

添加Application.ScreenUpdating = False

開始後右右結束

前加Application.ScreenUpdating = True如果你正在做1000,那麼你肯定不需要屏幕的每個新行被抽時間刷新。改變它,它只會在完成後重新繪製它。

+0

我已經這樣做了(在主函數中)。它仍然崩潰。 –

相關問題