2017-10-03 8 views
1

나는 Excel VBA에 익숙하며 실제로 도움이 될 수 있습니다. 웹에서 솔루션을 검색했지만 유사한 문제를 찾을 수 없었습니다.엑셀 vba 기준까지 행을 삭제

특정 기준에 따라 행을 삭제하고 다른 특정 기준이 충족 될 때까지 행을 삭제하는 데 도움이되는 매크로를 만들려고합니다.

예를 들면. 아래 표에서 나는 골 A = 1 골 C <> 0

A | B | C 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
2 | TC | 1 
-----|-----|----- 
1 | TC | 0 
-----|-----|----- 
2 | TC | 2 
-----|-----|----- 
3 | TC | 1 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
1 | TC | 0 
-----|-----|----- 
1 | TC | 1 
-----|-----|----- 
2 | TC | 0 
-----|-----|----- 
3 | TC | 2 
UNTIL 골 A = 1 골 C = 0, 다음 해당 행 아래 행을 삭제 계속 행을 삭제하려면

그래서 매크로의 최종 결과가 될 것이다 : 이상적

A | B | C 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
2 | TC | 1 
-----|-----|----- 
1 | TC | 2 
-----|-----|----- 
1 | TC | 1 
-----|-----|----- 
2 | TC | 0 
-----|-----|----- 
3 | TC | 2 

, I이 다시까지 해당 행의 다음 행의 행을 삭제 여기서 골 A = 2 골 C = 0 및 삭제와 루프 싶습니다 Col A = 2 및 Col C <> 0

다음은 내가 언급 한 매크로입니다. 모든 제안에 열리고 배우기를 열망합니다.

Sub deleterow() 

Range("C2").Select 
Do Until ActiveCell.Offset(0, -2) = "1" And ActiveCell.Value <> "0" 
If ActiveCell.Value = "0" And ActiveCell.Offset(0, -2) = "1" Then 
Rows(ActiveCell.Row & ":" & Rows.Count).Delete 
End If 
Loop 

End Sub 

답글을 기다리십시오!

감사합니다.

답변

0

기준이 충족되기 때문에 루프가 첫 번째 줄에서 멈 춥니 다. 따라서 아래의 코드는 첫 번째 행부터 마지막 ​​행까지 반복하여 기준을 검색합니다. 시트가 큰 경우,이 방법 최적이 아니라고

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 'Set the first worksheet to work 
Dim n As Long, i As Long 
Dim rng As Range, new_rng As Range 

lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'lastrow number 
For n = 1 To 2 'Criteria is Col A = 1 To 2 
    For i = 1 To lastrow 'Loop from 1 to last row 
     If ws.Cells(i, 1) = n And ws.Cells(i, 3) = 0 Then 
      If rng Is Nothing Then Set rng = ws.Range("A" & i) 'Set first Range so Union won't give an error 
      Set new_rng = ws.Range("A" & i) 
      Set rng = Union(rng, new_rng) 'create a non contiguous range to delete 
     End If 
    Next i 
Next n 

rng.EntireRow.Delete 

참고. 코드 성능을 향상시키는 가장 좋은 방법이 있습니다. OP가 시도한 방법이기 때문에 루프가 사용되었습니다.

또 다른 방법은 다중 기준을 필터링하고 표시된 행을 삭제하는 것입니다.

+0

사과로 사전에 나는 이것에 아주 새롭다. 위의 코드를 적용하려고했지만 작동하지 않는 것 같습니다. 귀하의 코드를 검토 중이며 이해할 수 있는지 잘 모르겠습니다. 코드의 개념을 이해할 수는 있지만 특정 행을 파악할 수는 없습니다. 왜 "rng가 설정되지 않았다면 ..."? "rng이 설정되지 않은 경우라면"이어야하지 않습니까? 그리고 나는 "rng = Union (rng, new_rng)"이라는 줄을 이해하지 못합니다. rng가 자신과 새로운 rng의 동맹과 어떻게 동등한 관계가 가능합니까? –

+0

또한이 특정 문제에 대해 필터 및 삭제 방법이 어떻게 작동하는지 잘 모르겠습니다. 매크로는 기준이 충족 될 때까지 계속 삭제해야하기 때문입니다. 그러나, 나는 그것이 작동하는 한 모든 솔루션에 열려 있습니다. –

+0

연합은'Range ("B1 : B5", "C42 : C65", "Z300")'와 같이 인접하지 않은 범위를 만드는 데 사용되므로 delete를 사용하여 모든 것을 한 번 삭제할 수 있습니다. 삭제 작업이 느리기 때문에 한 번 삭제하면 해당 작업을 수행하는 데 걸리는 시간을 최적화 할 수 있습니다. 그리고'rng is Nothing Then Set rng = ws.Range ("A"& i)'는 Union을 사용하는데, 왜냐하면 2 개의 범위가 없으면 Union은 에러를 내기 때문입니다. 첫 번째 범위 (rng가 비어 있거나 아무것도없는 경우)는'rng = new_rng = ws.Range ("A"& i)' – danieltakeshi