2015-09-28 1 views
0

У меня есть файл Excel, который берет данные извне и записывает их в ListObject.Замедление при закрытии после ListObject Resize

Как добавить строки один за другим через ListRows.Add очень медленно, я добавляю правильное количество пустых строк на лист и изменяю размер ListObject.

Это работает очень хорошо в Excel 2010.
В Excel 2007, он работает, но когда пользователь закрывает книгу или Excel, она замерзает и для Windows отображает окно аварии (с просьбой, если вы хотите закрыть, перезагрузка или отладки заявление).
Это действительно раздражает и выглядит не очень хорошо :).

Любая идея, что я мог бы сделать, чтобы это предотвратить?
Возможно, у вас есть лучшая идея, чтобы быстро достать тысячи строк в ListObject?

Кроме того, в случайном порядке (я снова открываю файл, ничего не изменяю и выполняю макрос), Resize не удается с сообщением об ошибке, а 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. код не пытается добавить строки за пределами возможностей 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 
0

добавить Application.ScreenUpdating = False сразу после начала суб

добавить Application.ScreenUpdating = True прямо до конца

Если вы делаете 1000s, то вы определенно не нужно обновлять экран каждый раз, когда новая линия получает нарисованный. Измените это, и он будет только перерисовывать его, как только он будет завершен.

+0

Я уже это делаю (в основном функция). Он все еще падает. –

 Смежные вопросы

  • Нет связанных вопросов^_^