VBA :

2012-04-09 3 views
4

내가 열 A. 여기VBA :

에 "참"이 모든 행을 삭제하는 매크로를 작성하는 것을 시도하고 내가 지금까지 가지고 무엇을 특정 값으로 행 삭제 :

Sub deleteBlankRows3() 
Dim lastrow as Long 
Dim x as Long 

lastrow = 4650 
For x=8 to x=lastrow 
    If (Range("A1").Offset(x,0) = True) Then 
    Range("A1").Offset(x,0).EntireRow.Delete 
    x = x + 1 
End if 
Next x 

End Sub 

나는 틀린 것을 말할 수 없다!

답변

4

세 가지 일이 여기에 있습니다. 당신이 기본 값 동등성을 테스트하고 명시 적으로 경우

먼저 셀의 값을보고해야합니다 saying.Value없이

If (Range("A1").Offset(x,0).Value = True) Then 

, 나는 기본 반환에 의한 셀은 텍스트 속성 생각 비 범위 속성에 대한 동등성 테스트

둘째, 당신의 세포가 아마 오히려 값보다 True 그럼 당신이 실제로 종료됩니다, 당신이 실제로 행을 발견하면, 마지막으로

If (Range("A1").Offset(x,0).Value = "True") Then 

를 사용하여 시도하고 당신이 그것을 삭제, "참"문자열을 포함 (행 5가 4 행 등이됩니다.) 도 x만큼 증가하므로 삭제 한 모든 행의 바로 다음 행을 건너 뜁니다. . 순서 감소에 어느 루프를이 문제를 해결하려면 다음

For x=lastrow to 8 step -1 

또는 그냥 행 삭제 한 경우 X를 증가하지 않습니다 :이 같은 더 낫다 테스트하지 않고

If (Range("A1").Offset(x,0).Value = "True") Then 
    Range("A1").Offset(x,0).EntireRow.Delete 
Else 
    x = x + 1 
EndIf 
+0

감사합니다.3 점 모두 오른쪽에, 하하. –

2

을 :

For x=lastrow to 8 step -1 
     If (Range("A1").Offset(x,0) = True) Then 
      Range("A1").Offset(x,0).EntireRow.Delete 
     End if 
    Next 

카운팅 업에는 루프가 모든 행을 보지 않도록 위로 이동 한 후에 한 행을 삭제하면 모든 행이 삭제된다는 문제가 있습니다. 그리고 그 경우에 x에 1을 더하면 더 악화됩니다. -1은 다른 문제를 일으킬 수있는 총 4650 + number_of_deleted_rows를 여전히 확인한 경우를 제외하고는 더 좋았을 것입니다. 끝에서 시작하여 시작으로 이동하면 두 문제를 모두 방지 할 수 있습니다.

1

문제는 알고리즘이 올바르지 않다는 것입니다. 손상된 루프 변수의 클래식 케이스입니다. 문제는 루프가 종속 된 변수가 잘못 수정 된 것입니다.

올바른 방법은이 방법입니다.

Dim x as integer 
x = 8 
do 
    if (Range("a1").Offset(x, 0) = True) Then 
     Range("a1").Offset(x, 0).EntireRow.Delete 
    Else 
     x = x + 1 'We only increase the row number in the loop when we encounter a row that is false for containing true in cell a1 and their offsets 
    End If 
Loop Until (x > 4650) 
+0

죄송합니다. 답변을 편집하는 동안 질문이 해결 된 것을 알 수 없습니다. – ervinbosenbacher

6

나는 당신이 이미 찾고있는 것을 알고 있습니다. 그러나 여기에도 Autofilter을 사용하는 다른 방법이 있습니다. 이것은 각 행을 반복하고 값을 확인하는 것보다 훨씬 빠릅니다.

Sub Sample() 
    Dim lastRow As Long 

    With Sheets("Sheet1") 

     lastRow = .Range("A" & Rows.Count).End(xlUp).Row 

     '~~> Remove any filters 
     .AutoFilterMode = False 

     '~~> Filter, offset(to exclude headers) and delete visible rows 
     With .Range("A1:A" & lastRow) 
      .AutoFilter Field:=1, Criteria1:="TRUE" 
      .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
     End With 

     '~~> Remove any filters 
     .AutoFilterMode = False 
    End With 
End Sub 

내가 라인을 숨겨했다 및 필터링 방법을 수행하는 그들을 숨기기를 취소하고 싶지 않았다

+1

+1 루핑보다 훨씬 낫다 – brettdj

+0

+1 나는 brettdj에 동의한다. –

0

HTH. 또한 모든 줄마다 반복하지 않으므로 여기에 내 10c .....

Sub DelError() 
    Dim i As Integer 
    Dim rngErrRange As Range 
    With ActiveSheet 
     Do 
      Set rngErrRange = .Columns("A:A").Find(What:="#REF!", _ 
       After:=.Cells(1), LookIn:=xlFormulas, _ 
       LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False) 
       If Not rngErrRange Is Nothing Then 
        rngErrRange.EntireRow.Delete 
       Else 
        End 
       End If 
     Loop 
    End With 
End Sub