2017-09-06 2 views
1

열 BD의 값이 0이면 행을 삭제하는 루프를 만들었습니다. 루프는 최대 30 분이 소요될 수 있습니다. 필자는 자동 필터를 사용하거나 기능을 신속하게 처리 할 수있는 변형 배열을 만드는 것이 좋습니다. 아래 코드에 대한 더 나은 솔루션을 제안 할 수 있다면 알려주십시오.루프를 개선하여 Excel에서 행을 빠르게 삭제

Const colBD As Long = 56 
Dim IRow  As Long 
Dim LstRow As Long 


LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
IRow = 3 

'loop to delete rows with zero in colBD 
Do While IRow <= LstRow 
    If Cells(IRow, colBD) = 0 Then 
     Cells(IRow, 1).EntireRow.Delete 
     LstRow = LstRow - 1    ' one less row 
    Else 
     IRow = IRow + 1      ' move to next row 
    End If 
Loop 
+3

가장 빠른 방법은 먼저 모든 행을 선택'Range.Delete'를 사용하여 한 번에 삭제하는 것입니다. 대부분의 시간이 걸리는 삭제 작업입니다. –

+2

John Wu의 답변에 추가하면 범위가 인접하지 않을 수 있으므로 인접하지 않은 범위를 만들어야 할 수도 있습니다. – danieltakeshi

+1

루프 앞에서'Application.ScreenUpdating = False'를 사용하십시오 (그리고 나중에 다시 켜는 것을 잊지 마십시오.) – Tragamor

답변

3

삭제하려는 모든 행을 범위에 할당 한 다음 한 번에 삭제하십시오. 이 방법은 하나씩 삭제하는 것이 훨씬 빠르며 오류를 방지합니다.

Const colBD As Long = 56 
Dim IRow  As Long 
Dim LstRow As Long 
Dim DelRng As Range 

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
IRow = 3 

'loop to delete rows with zero in colBD 
Do While IRow <= LstRow 
    If Cells(IRow, colBD) = 0 Then 
     If DelRng Is Nothing Then 
      Set DelRng = Cells(IRow, 1) 
     Else 
      Set DelRng = Union(DelRng, Cells(IRow, 1)) 
     End If 
    Else 
     IRow = IRow + 1      ' move to next row 
    End If 
Loop 

If Not DelRng Is Nothing Then DelRng.EntireRow.Delete 
4

위의 설명은 정확합니다. 한 번에 모두 삭제하는 것이 더 좋지만, 끝에서 다시 시작하고 다시 작업하는 것이 가장 좋습니다. 무한 루프로 쉽게 들어갈 수 있습니다.

Const colBD As Long = 56 
Dim IRow As Long 
Dim LstRow As Long 
Dim i As Integer 

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
IRow = 3 

'Always start with the last row and work towards the first when deleting rows 
For i= LstRow to IRow Step - 1 
    If Cells(i, colBD) = 0 Then 
     Cells(i, 1).EntireRow.Delete 
    End If 
End Sub 
3

내가 0 제 다음 삭제를 보이는 모든 행에 대해 필터링 할 것 :

Const colBD As Long = 56 
Dim IRow As Long 
Dim LstRow As Long 

LstRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
IRow = 3 

ActiveSheet.Range("A1:BD1").AutoFilter Field:=colBD, Criteria1:="0" 
Range("BD" & IRow & ":BD" & LstRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete