ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VBA 유튜브 학습기 8 - 전체 지우기, 서식 지우기, 값만 지우기, 행과 열 삭제하기, IF문과 FOR문으로 삭제하기(feat. 파워 문과 기획자)
    공부하는 노예/VBA(유튜브 무료 강의) 2021. 4. 8. 08:45
    728x90

    youtu.be/3tQ7EHkXCRE

     

    엑사남 님 VBA 강의 8강 듣고 왔습니다.

     

    제가 VBA 강의 7강까지 좀 들락거려 봤다고, 요즘 회사에서 필요한 자료를 VBA로 만들어 보고 있는데요.

    딱 막히던 부분이 바로 8강에 나오더라고요.👍👍👍

    (조건에 해당하는 행만 삭제하고 싶었음)

     

    8강은 삭제에 관한 VBA의 모든 것입니다.

     

     

    예제1. 전체(서식 & 내용) 지우기

     

     

    이렇게 생긴 표가 있습니다.

     

     

     

     

    표에서 빨간색으로 네모 표시한 영역(F7부터 L26까지)의 값과 서식을 모두 지우는 방법이에요.

     

     

    코드는 이렇습니다.

     

    Sub all_delete()

         Range("F7:L26").Clear

    End Sub

     

    핵심은 Clear 예요.

    영역을 지정하고 Clear를 써 주면 이렇게!

     

     

     

    해당 영역의 값과 서식이 모두 지워집니다.

     

     

     

    예제2. 값만 지우기

     

     

    아마 제일 자주 사용할 삭제에 관한 코드 중 하나일 거 같은데요.

    서식은 그대로 두고, 값만 삭제하는 방법입니다.

     

     

     

    표에서 표시한 영역(F7에서 L26까지)의 값만 삭제할 거예요.

     

     

    코드는 이렇습니다.

     

    Sub contents_delete()

         Range("F7:L26").ClearContents

    End Sub

     

    핵심은 ClearContents 예요.

    "콘텐츠만 삭제하겠다." 그런 의미겠죠?

     

    코드를 실행해 보면

     

     

     

    이렇게 서식은 남겨 두고, 값만 날아갔습니다.

     

     

     

    예제3. 행, 열 삭제하기

     

     

    표의 행 전체를 통째로 삭제하는 방법인데요.

     

     

     

    표에서 표시한 범위(7행부터 26행까지)의 행을 모두 삭제할 겁니다.

     

    그런데 행 삭제에 앞서 비교해야 할 게 있어요.

     

     

     

    표의 K4 셀을 찍어 보면 위의 수식 입력란에 수식이 적용된 걸 볼 수 있는데요.

     

     

    아래와 같이

     

    Sub row_clear()

         Range("F7:L26").Clear

    End Sub

     

    Clear를 이용해 내용을 지워 보면

     

     

     

    결과는 마치 행을 삭제한 것과 같아 보이지만.

    Clear로 삭제할 경우엔 K4 셀의 수식이 그대로 살아 있습니다.

     

    즉, Clear는 '행 삭제'가 아니라 해당 영역의 '내용과 서식'을 삭제한 거죠.

     

     

    그럼 행을 삭제하면 어떻게 될까요?

     

    행 삭제 코드는 이렇습니다.

     

    Sub row_delete()

         Range("7:26").Delete

    End Sub

     

    행 삭제는 Delete를 이용합니다.

     

    코드를 실행하고 K4 셀을 확인해 보면

     

     

     

    수식의 참조 행이 삭제돼 버리니까 수식에 오류가 뜹니다.

     

    행 삭제(Delete)와 내용 & 서식 삭제(Clear)를 상황에 맞게 잘 구분해야 써야겠네요.

     

     

     

    예제4. 서식만 지우기

     

     

    뭐 얼마나 쓰겠냐 싶지만 또 막상 모르면 답답할 거 같은

    서식만 지우는 방법이에요.

     

     

     

    표의 표시한 영역(F7부터 L26까지)의 서식만 삭제하겠습니다.

     

     

    코드는 이렇습니다.

     

    Sub clear_formats()

         Range("F7:L26").ClearFormats

    End Sub

     

    서식만 삭제할 때는 ClearFormats을 씁니다.

     

     

    코드를 실행해 보면

     

     

    이렇게 해당 범위의 서식이 모두 삭제됐어요.

     

     

    예제5. IF문, FOR문에서 조건에 맞는 값 삭제하기

     

     

    이 부분이 제가 찾던 삭제 방법이에요.

     

    표에서 G열의 값이 "남"일 경우에는 해당 값이 들어 있는 행 전체를 삭제하려고 합니다.

    (제 상황이 딱 이런 상황이었습니다. 생초보인 제가 필요로 했던 거 보면 생각보다 자주 활용되는 삭제 방법인가 보네요.)

     

     

    코드는 이렇습니다.

     

    Sub if_delete()

         Dim i As Long

         For i = 26 To 7 Step -1
              If Cells(i, "G") = "남" Then
                   Cells(i, "G").EntireRow.Delete
              End If
         Next i

    End Sub

     

    * 셀.EntireRow : 셀이 위치한 행 전체

    * 셀.EntireColumn : 셀이 위치한 열 전체

     

     

    특이한 게 있는데요.

     

    For i = 26 To 7 Step -1

     

    이 부분.

     

    제가 7강까지 오면서 For문을 좀 봤는데....

    Step -1은 초면입니다.

     

    이게 이 삭제 구문의 가장 중요한 부분이더라고요.

     

    코드의 해석은

    26행부터 7행까지(즉, 역순으로) 반복한 건데, -1씩(한 행씩 올라가면서)하면서 반복해라.

     

    이런 의미입니다.

     

    이렇게 하는 이유가 있겠죠?

     

    5행과 6행에 모두 삭제할 행이 있을 때

    i가 위에서부터 조건에 맞는 값을 삭제하면서 내려온다고 치면,

    5행이 삭제되면서 6행이 5행이 되겠죠?

     

    그런데 i는 5행은 이미 돌았으니까,

    5행으로 올라온, 삭제돼야 할 6행에서 5행이 된 데이터는 건너뛰고 6행으로 바로 이동을 합니다.

    (문장 표현력이 되게 거지 같은데 30번 읽어 보시면 이해되실 거예요....😄😅)

     

    그런 참사를 방지하기 위해서 조건에 맞는 행을 삭제하려고 할 때는 밑에서부터 삭제를 한다고 하네요.

     

     

    행을 삭제하는 데 아래와 같은 코드를 썼는데.

     

    셀.EntireRow.Delete          '셀이 위치한 행 전체

     

    이 코드는 아래의 코드로 바꿔 쓸 수도 있습니다.

     

    Sub if_delete()

         Dim i As Long

         For i = 26 To 7 Step -1
              If Cells(i, "G") = "남" Then
                   Rows(i).Delete
              End If
         Next i

    End Sub

     

    문과의 눈엔 왠지 Row(i).Delete 코드가 더 쉬워 보이네요.

     

     

    어떤 코드든 실행해 보면

     

     

    이렇게 G열이 "남"인 행이 삭제됩니다.

     

     

    [과제]

     

    과제가 있었어요.

     

    표에서 성별이 "남"이거나 평균이 70이하인 셀을 삭제하시오.(5점)

     

     

    이번 과제는 전보단 쉽게 느껴지네요.

    실력이 늘어서일 거라고 정신 승리해 봅니다.

     

    이번엔 코드를 좀 자신 있게 작성했어요. ㅋㅋㅋ

     

    Sub homework()

         Dim i As Long

         For i = 26 To 7 Step -1
              If Cells(i, "G") = "남" Or Cells(i, "L") <= 70 Then
                   Rows(i).Delete
              End If
         Next i

    End Sub

     

    실행해 보면

     

     

     

    이렇게.

    조건에 맞는 셀들은 모두 삭제됐습니다.

     


    7강 과제할 때는 현타 거하게 왔었는데, 이번 과제로 좀 회복하고 9강 달리러 갑니다.

    반응형

    댓글

Designed by Tistory.