"For Each...를 사용하여 셀을 삭제합니다. Excel의 다음" 루프

요약

Microsoft Excel 2002 이상 버전의 Excel은 "For Each...에서 셀을 삭제합니다. 다음" 루프는 Microsoft Excel 97 및 이전 버전의 Excel과는 다른 방식으로 진행됩니다.

이 문서에서는 차이점을 설명하고 루프에서 셀을 삭제하는 방법을 보여 주는 Visual Basic for Applications 매크로 예제를 제공합니다.

추가 정보

Microsoft에서 제공하는 프로그래밍 예제는 예시를 위한 것일 뿐이며 이와 관련하여 명시적이거나 묵시적인 어떠한 보증도 하지 않습니다. 이는 상품성이나 특정 목적에 대한 적합성의 묵시적인 보증을 포함하며 이에 제한되지 않습니다. 이 문서에서는 예제에 사용되고 있는 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구를 사용자가 잘 알고 있는 것으로 가정합니다. Microsoft 지원 엔지니어가 특정 프로시저의 기능을 설명하여 도움을 줄 수 있습니다. 사용자의 특정 요구 사항에 맞도록 예제를 수정하여 추가 기능을 제공하거나 프로시저를 구성하지는 않습니다.

예제 데이터

이 문서의 매크로를 사용하려면 워크시트에 다음 샘플 데이터를 입력합니다.

A1: a B1: 1
A2: b B2: 2
A3: x B3: 3
A4: x B4: 4
A5: c B5: 5
A6: x B6: 6
A7: d B7: 7
A8: x B8: 8
A9: x B9: 9
A10: e B10: 10

샘플 매크로

새 매크로 모듈에서 다음 매크로를 입력합니다.

Sub DeleteCells()

     'Loop through cells A1:A10 and delete cells that contain an "x."
     For Each c in Range("A1:A10")
        If c = "x" Then c.EntireRow.Delete
    Next

End Sub

Excel 2002 이상 버전의 Excel에서 샘플 매크로의 동작

Excel 2002 및 이후 버전의 Excel에서 DeleteCells 매크로를 실행하면 행 3, 6 및 8만 삭제됩니다. 4행과 9행은 A열에 "x"를 포함하지만 매크로는 행을 삭제하지 않습니다. 매크로의 결과는 다음과 같습니다.

A1: a B1: 1
A2: b B2: 2
A3: x B3: 4
A4: c B4: 5
A5: d B5: 7
A6: x B6: 9
A7: e B7: 10

Microsoft Excel에서 행 3을 삭제하면 모든 셀이 한 행 위로 이동합니다. 예를 들어 셀 A3은 셀 A4의 내용을 가정하고 A4 셀은 셀 A5 등의 내용을 가정합니다. For Each 이후... 다음 루프는 셀을 계산하고 다음 셀을 평가합니다. 따라서 셀이 이동되면 루프에서 건너뛸 수 있습니다.

Microsoft Excel 5.0 및 Microsoft Excel 7.0의 샘플 매크로 동작

Excel 5.0 및 Excel 7.0에서 DeleteCells 매크로를 실행하면 매크로는 "x"가 포함된 모든 행을 삭제합니다. 매크로의 결과는 다음과 같습니다.

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

행 3이 삭제되면 모든 셀이 한 행 위로 이동합니다. 그런 다음 셀 A3은 셀 A4의 내용을 가정하고 A4 셀은 셀 A5의 내용을 가정합니다.

그러나 Excel 2002 및 이후 버전의 Excel에서 루프의 동작과 달리 "For Each... 다음" 루프는 Excel 5.0에서 셀을 평가하고 Excel 7.0에서는 루프에서 셀이 삭제된 경우 셀을 다시 평가합니다. 따라서 셀은 건너뛰지 않습니다.

루프를 사용하여 셀을 삭제하려면 다음 매크로를 사용합니다.

Sub DeleteCells2()

     Dim rng As Range
     Dim i As Integer, counter As Integer
    
     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")
    
     'initialize i to 1
     i = 1
    
     'Loop for a count of 1 to the number of rows
     'in the range that you want to evaluate.
     For counter = 1 To rng.Rows.Count
    
          'If cell i in the range contains an "x",
           'delete the row.
           'Else increment i
            If rng.Cells(i) = "x" Then
                rng.Cells(i).EntireRow.Delete
            Else
                i = i + 1
            End If
    
     Next

End Sub

모든 버전의 Excel에서 이 매크로의 결과는 다음과 같습니다.

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

루프를 사용하여 셀을 삭제하는 추가 방법

위에 표시된 메서드의 대체 메서드입니다. 이 메서드는 동일한 결과를 생성합니다.

 Sub DeleteCells3()

     Dim rng As Range, i As Integer

     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")

     'Loop backwards through the rows
     'in the range that you want to evaluate.
     For i = rng.Rows.Count To 1 Step -1
    
             'If cell i in the range contains an "x", delete the entire row.
             If rng.Cells(i).Value = "x" Then rng.Cells(i).EntireRow.Delete
     Next

End Sub