2011-07-29 9 views
3
Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    count = Range("Q" & Rows.count).End(xlUp).Row 
    MsgBox count 
    For i = 2 To count 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 

코드가 즉시 작동하지 않는 이유는 무엇입니까?특정 열의 특정 값을 갖는 행 삭제

run time error 13 

그게 무슨 뜻 이죠 : 나는 엑셀 위의 VBA 코드를 실행하면,이 메시지와 함께 밖으로 종료 후 일부 행을 삭제하고 있어요? 때때로 나는이 메시지를 얻을 : VBA 코드 위에

type mismatch 

을, 나는 누구의 Q 열 값이 2 행을 삭제하고 싶지만 작동하지 않습니다. 그 버그가 어디에 있는지 알려주시겠습니까?

나에게 무슨 일이 일어나고 있는지 말해 보자. 코드가 작동하지만 일부 행을 삭제하고 런타임 오류 13으로 중단합니다. Q 열을 보려면 EXCEL 파일을 열 때 Q 열의 일부 행이 #REF! 인 것을 관찰했습니다.

나는이 원인 일 수 있습니다 생각하지만 난 그것을 통해 어떻게해야합니까? 코드를 올바르게 작동하게하려면 어떻게해야합니까? Q 값이 1,2 개의 값으로 구성된 열이 있습니다. 2가 들어있는 Q 열의 행을 삭제해야합니다. 전체 행을 의미합니다.

+1

나는 오류를 재현 할 수 있습니다. 절차가 끝나면'i'의 값을 편집 할 수 있습니까? – Jacob

+0

테스트 데이터의 마지막 행에 Q 열에 2가 있습니까? – James

답변

1

큰 워크 시트에서 각 행을 루핑하는 데 시간이 많이 걸릴 수 있습니다. find 메소드를 사용해보십시오. 또한 화면 업데이트를 해제하십시오.

Sub HTH() 
    Dim rCell As Range 
    Dim strAddress As String 

    Application.ScreenUpdating = False 

    With ActiveSheet.Columns("Q") 
     Set rCell = .Find(What:=2, LookIn:=xlValues, SearchOrder:=xlByColumns) 

     If Not rCell Is Nothing Then 
      Do 
       strAddress = rCell.Address 
       rCell.EntireRow.Delete 
       Set rCell = .FindNext(Range(strAddress)) 
      Loop Until rCell Is Nothing 
     End If 

    End With 

    Application.ScreenUpdating = True 

End Sub 
2

하면 행 # 10 == 2 다음 행 # 10를 삭제; 루프의 다음 반복에서 행 # 11이 행 12의 값을 가지는지 확인합니다. 행 11의 값이 삭제 된 후 위로 이동 했으므로 삭제 된 행 바로 아래의 모든 행을 건너 뜁니다.

아마도 거꾸로 돌아가고 싶을 것입니다.

Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    '//assuming all filled rows from Q2 downwards? 
    count = Range("Q2").End(xlDown).Row 

    For i = count To 2 Step -1 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 
+0

거꾸로 반복하는 것이 좋습니다. ^^ 좋은 대답! – aevanko