엑셀 VBA 중복 데이터 재귀 호출과 반복문 사용해서 삭제하는 방법

 

환경: Microsoft Excel 2013

 

VBA 에서도 재귀 호출을 사용해야 원활하게 문제를 해결할 수 있는 경우가 종종 있습니다. 그 예가 오늘 샘플로 소개할 중복 데이터 삭제 입니다. C, C++, Java 등을 다뤄 보신 분들은 한번쯤 경험이 있을 겁니다. 만약 처음 접하시는 분들이 있다고 하더라도 예제를 통해서 꼭 자기 것으로 만들어야 합니다. VBA 에서 어떻게 재귀 호출을 구현하는지 알아 보도록 하겠습니다.

 

재귀 호출이란 자기 자신을 호출한다는 말입니다. 그러니까 함수 안에 자기 자신의 함수를 호출하도록 코드를 구성하는 것이죠. 만약 종료 시점이 없다면 무한 루프에 빠지겠죠. 그래서 사람들이 재귀 호출을 이해하는데 힘들어 합니다.

 

대부분 재귀 호출은 동일한 코드를 계속해서 반복해야 하는 경우 적용합니다. 그림에 나와 있는 샘플처럼 중복 데이터를 삭제하려고 할 때 처음 찾은 중복 데이터를 삭제하고 또 있는지 다시 뒤지는 작업을 계속해서 반복해야 합니다. 이 때 동일한 코드를 반복해야 하기 때문에 재귀 호출을 하는 것입니다. 모든 중복 데이터를 찾아 삭제하고 나면 재귀 호출은 끝나게 됩니다.

엑셀 VBA 중복 데이터 재귀 호출과 반복문 사용해서 삭제하는 방법

 

아래 소스는 이중 For 문을 사용해서 동일한 값이 있을 때 삭제하는 내용입니다. 만약 데이터를 삭제하고 재귀 호출을 하지 않으면 어떻게 될까요? 첫 번째 찾은 데이터만 삭제하고 또 다른 중복 데이터는 삭제하지 못하겠죠.

 

Dim rng As Range

Dim i As Integer

Dim j As Integer

 

Set rng = ActiveSheet.Range("B2").CurrentRegion

 

For i = 2 To rng.Count

    For j = i + 1 To rng.Count

        If rng.Cells(j).Value = rng.Cells(i).Value Then

            rng.Cells(j).Delete

          End If

    Next j

Next i

 

재귀 호출을 하는 방법은 “Call 중복데이터_제거 입니다. 기존 함수 호출과 동일한 구조입니다. 단지 Call 뒤에 나오는 함수명이 자기 자신이라는 것만 다릅니다. 전체 소스는 다음과 같습니다.

 

Sub 중복데이터_제거()

 

    Dim rng As Range

    Dim i As Integer

    Dim j As Integer

   

    Set rng = ActiveSheet.Range("B2").CurrentRegion

   

    For i = 2 To rng.Count

        For j = i + 1 To rng.Count

            If rng.Cells(j).Value = rng.Cells(i).Value Then

                rng.Cells(j).Delete

                Call 중복데이터_제거

            End If

        Next j

    Next i

   

End Sub


엑셀 VBA 중복 데이터 재귀 호출과 반복문 사용해서 삭제하는 방법

저작자 표시 비영리 변경 금지
신고
Posted by 녹두장군