2016-11-03 1 views
0

Я хочу оптимизировать свой код, который перебирает все строки и удаляет его, если существует определенное значение. Тем не менее, я сейчас перебираю> 100000 строк, поэтому я хочу улучшить скорость.VBA - Зацикливание строк и удаление, если существует несколько значений

Основное назначение: Цикл по всем строкам и удалить его, если а) клеток (строка, "А") значение = "X1", б) ячейку (строка, "S") значение.. = «X2» и c) ячейка (строка «AW»). Значение = «X3».

Мой текущий код выглядит следующим образом:

Call FilterData("A", "X1") 
Call FilterData("S", "X2") 
Call FilterData("AW", "X3") 

Sub FilterData(Column as String, Check as String) 
    Dim Firstrow As Long 
    Dim Lastrow As Long 
    Dim Lrow As Long 
    Dim CalcMode As Long 
    Dim ViewMode As Long 

    With Application 
     CalcMode = .Calculation 
     .Calculation = xlCalculationManual 
     .ScreenUpdating = False 
    End With 

    If Not Sheets("XXX").AutoFilterMode Then 
     Sheets("XXX").Range("1:1").AutoFilter 
    End If 
    Sheets("XXX").Range("A2:BT1048576").Sort _ 
    Key1:=Sheets("XXX").Range(Column & "1"), Order1:=xlAscending 

    With Sheets("XXX") 
     .Select 

     ViewMode = ActiveWindow.View 
     ActiveWindow.View = xlNormalView 

     .DisplayPageBreaks = False 

     Firstrow = .UsedRange.Cells(1).Row 
     Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row 

     For Lrow = Lastrow To Firstrow Step -1 
      With .Cells(Lrow, Column) 
       If Not IsError(.Value) Then 
        If .Value = Check Then .EntireRow.Delete 
       End If 
      End With 
     Next Lrow 

    End With 

End Sub 

ответ

0

Оптимизация путем применения autofiler против колонок, которые вы хотите удалить, если существуют значения, код удаляет их. Я сделал это очень быстро, непроверено, но логика работает, надеюсь, это поможет! :)

Код Добавлено:

Sub Filter() 
Dim ColALookup As String 
Dim ColSLookup As String 
Dim colAWlookup As String 
Dim i As Long 

ColALookup = "X1" 
ColSLookup = "X2" 
colAWlookup = "X3" 

With Sheets("XXX") 
.Range("A2", .Range("A" & .Rows.Count).End(xlUp)) _ 
    .AutoFilter Field:=1, Criteria1:=Application.Transpose(ColALookup), Operator:=xlFilterValues 

    .Range("S2", .Range("S" & .Rows.Count).End(xlUp)) _ 
    .AutoFilter Field:=1, Criteria1:=Application.Transpose(ColSLookup), Operator:=xlFilterValues 

    .Range("AW2", .Range("AW" & .Rows.Count).End(xlUp)) _ 
    .AutoFilter Field:=1, Criteria1:=Application.Transpose(colAWlookup), Operator:=xlFilterValues 

.Range("A2", .Range("A" & .Rows.Count).End(xlUp)) _ 
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
    .Range("S2", .Range("S" & .Rows.Count).End(xlUp)) _ 
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
    .Range("AW2", .Range("AW" & .Rows.Count).End(xlUp)) _ 
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
.AutoFilterMode = False 

End With 


End Sub 
+0

Я знаю, я случайно отправил его в качестве ответа :( – Jaz

+0

я тоже не хватает репутации, чтобы добавить комментарий к сожалению, – Jaz

+0

Вы можете уточнить немного, @Jaz – hskrijelj

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