2017-09-14 1 views
2

저는 Vba의 초보자입니다. 나는 행이 이십 기가 바이트 데이터베이스에서 삭제하기 위해 다음과 같은 간단한 루프 코드를 가지고 열 아홉 셀 값 "NA"vba에서 한 조건 아래에서 전체 행을 자동으로 삭제하는 방법은 무엇입니까?

Dim n As Integer 
n = 500 

    For i = 1 To n 
    If Cells(i, 9).Value = "n.a." Then 
    Rows("i:i").Select 
    Selection.Delete Shift:=xlUp 

    End If 
    Next i 

End Sub 

하지만 1004 오류가, 누군가가 나에게 제발 도움을 줄 수? 당신은 작은 가장 큰에서 그 일을 시작 행을 삭제하는 때마다

당신에게

+1

피 [선택] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba), 그리고이 질문을 참조하는 것이 좋습니다 [삭제 성능] (https://stackoverflow.com/questions/46163851/excel-vba-performance-issues-comparing-row-to-column-delete) 및 [Excel에서 행을 삭제하는 루프 개선]을 더 빨리 살펴보십시오 ] (https://stackoverflow.com/q/46077673/7690982). 또는 [성능 - 1 백만 행 - 행 삭제] (https://stackoverflow.com/q/30959315/7690982) 워크 시트가 너무 크면 느려질 수 있습니다. – danieltakeshi

답변

3
Option Explicit 

Public Sub TestMe() 

    Dim n As Integer 
    n = 500 

    For i = n To 1 Step -1 
     If Cells(i, 9).value = "n.a." Then 
      rows(i & ":" & i).Select 
      Selection.Delete Shift:=xlUp 
     End If 
    Next i 

End Sub 

대단히 감사합니다. 나중에 Select을 피하는 방법과 Union을 사용하는 방법을 한 번에 삭제할 수 있습니다. 마지막으로 IntegerLong으로 바꿀 수 있습니다. 당신은 단순히이 필요

+0

나는 아직도 당신의 수정을 구현 한 동일한 오류가 발생하지만, 오류 텍스트는 "응용 프로그램 또는 객체에 의해 정의 된 오류"입니다. 왜 그런지 알 수 있습니까? 당신의 도움을 주셔서 감사합니다 – Mauro

+0

@ 마우로 -'행 (i & ":"& i) .Select'도 잘못되었습니다. – Vityata

+0

나는 여전히 같은 오류가 발생합니다. 왜냐하면 코드가 정확하기 때문에 왜 이해가되지 않습니다. . – Mauro

3

...

Dim n As Integer 
n = 500 
    For i = n To 1 Step -1 
    If Cells(i, 9).Value = "n.a." Then Rows(i).Delete 
    Next i 

편집 : 더 정확하게

또는이는 동적으로 만들 수 ...

Application.ScreenUpdating = False 
Dim n As Long 
n = Cells(Rows.Count, 9).End(xlUp).Row 
    For i = n To 1 Step -1 
    If Cells(i, 9).Value = "n.a." Then Rows(i).Delete 
    Next i 
Application.ScreenUpdating = True 
+1

[가장 빠른 방법은 모든 행을 먼저 선택한 다음 Range.Delete를 사용하여 한꺼번에 삭제하는 것입니다. 대부분의 시간이 걸리는 삭제 작업입니다. - John Wu Sep 6 at 14:22] (https://stackoverflow.com/a/46077868/7690982) 따라서 각 행을 삭제하지 않고 인접하지 않은 범위 나 필터를 만들어 값을 빠르게 만드는 것이 좋습니다. 코드가 작동하고 엄지 손가락을 받으면 미래에보고있는 다른 사람들을 위해 개선 할 의견 만 남습니다. – danieltakeshi

+0

고맙습니다. – Mauro

+0

@Mauro 환영합니다! – sktneer

1

가장 빠른 방법이 삭제 값이 자동 필터를 사용하고 있습니다. 루프가 필요 없습니다.

Option Explicit 

Public Sub AutoFilterDelete() 

    With Range("I1:I500") 
    .AutoFilter Field:=1, Criteria1:="n.a" 
    .Resize(WorksheetFunction.Match("*", .Cells, -1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
    .Parent.AutoFilterMode = False 
    End With 

End Sub 
관련 문제