2013-05-01 6 views
1

Привет, товарищи,VBA macro crashing Excel

Я запускаю макрос, чтобы удалить целые строки, содержащие определенное значение. Код работает отлично на небольших наборах данных, но на текущем (~ 22 000 записей) он последовательно сбой Excel (2010). Код ниже. Если вы не разделите данные на более мелкие куски и снова запустите макрос, я не уверен, что делать.

Любая помощь приветствуется и вот код:

Sub CleanOcc() 

'Row counting 
Dim Firstrow As Long 
Dim Lastrow As Long 
Dim Lrow As Long 
Dim Lrow2 As Long 

With Sheets("Occ_Prep") 

    'Cleans the occ_prep sheet ready for upload (Column and value can be changed) 
    Sheets("Occ_Prep").Activate 

    'Set the first and last row to loop through 
    Firstrow = .UsedRange.Cells(1).Row 
    Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row 

    'We loop from Lastrow to Firstrow (bottom to top) 
    For Lrow2 = Lastrow To Firstrow Step -1 

     'We check the values in the A column in this example 
     With .Cells(Lrow2, "K") 


      If Not IsError(.Value) Then 

       If .Value = "0" Then .EntireRow.Delete 
       'This will delete each row with the Value "ron" 
       'in Column A, case sensitive. 

      End If 

     End With 

    Next Lrow2 

End With 



End Sub 
+0

Excel и действительно большие объемы данных не смешиваются, на самом деле это не значит быть базой данных: \ –

+1

Это очень неправильный способ найти последнюю ячейку. См. [ЭТО] (http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba). Также см. [ЭТО] (http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/da7d1600-43bc-4e04-b2cc-8c4871349964) Здесь я использую объект 'delrange' для удаления соответствующих строк. Просто измените его в соответствии с вашими потребностями. –

+0

Другой путь. Используйте Autofilter для фильтрации Col K на '0', а затем удалите соответствующие строки. См. [ЭТО] (http://stackoverflow.com/questions/11631363/how-to-copy-a-line-in-excel-using-a-specific-word-and-pasting-to-another-excel-s) Это показывает, как работать с фильтрованным диапазоном. Просто измените его, чтобы удалить свой диапазон. –

ответ

1

Согласен с Сиддхарт комментарий автофильтр путь. Это должно быть намного быстрее.

Option Explicit 
Sub delrows() 
    Dim ws As Worksheet 
    Dim LR As Long 
    Dim rng As Range, frng As Range 

    Application.ScreenUpdating = False 

    Set ws = Sheets("dataset") '<-- Change this to name of your worksheet 
    With ws 
     LR = .Range("A" & Rows.Count).End(xlUp).Row 
     .AutoFilterMode = False 
     Set rng = .Range("A1:C" & LR) '<-- Assuming K is the last column 
     rng.AutoFilter 3, "0" '<-- 11 referes to Column K 
     Set frng = rng.Offset(1, 0).SpecialCells(xlCellTypeVisible) '<-- Don't delete the header 
     frng.EntireRow.Delete 
     .AutoFilterMode = False 
    End With 

    Application.ScreenUpdating = True 
End Sub 

Редактировать: Я только что очистил ~ 20000 строк (3 столбца) данных за ~ 5 секунд. Очевидно, это зависит от количества матчей.