VBA 에서도 재귀 호출을 사용해야 원활하게 문제를 해결할 수 있는 경우가 종종 있습니다. 그 예가 오늘 샘플로 소개할 중복 데이터 삭제 입니다. C, C++, Java 등을 다뤄 보신 분들은 한번쯤 경험이 있을 겁니다. 만약 처음 접하시는 분들이 있다고 하더라도 예제를 통해서 꼭 자기 것으로 만들어야 합니다. 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 반복문 For Next 문 사용하기 ▶ 엑셀 VBA 반복문 For Next, For Each Next 사용하기 ▶ 엑셀 VBA 반복문 Do While 사용하기 ▶ 엑셀 VBA 반복문으로 여러 컨트롤 한번에 제어하기 ▶ 엑셀 VBA On Error GoTo 반복문에서 에러 거르기 |
'엑셀(Excel) > VBA' 카테고리의 다른 글
엑셀 VBA 데이터 분리해서 다른 시트에 붙여 넣기 (3) | 2024.06.13 |
---|---|
엑셀 VBA 웹브라우저(인터넷 익스플로러) 띄우는 방법 (0) | 2024.06.12 |
엑셀 VBA 통합 문서 문서가 열리는 순간 기능 구현하기 (0) | 2024.06.05 |
엑셀 VBA 날짜 관련 함수, 개체 사용하는 방법 (0) | 2024.06.02 |
엑셀 VBA 문자열, 텍스트 숫자를 문자열 숫자로 변경하기 (0) | 2024.06.01 |
엑셀 VBA 문자열 글자 하나씩 추출하기 (0) | 2024.05.31 |
엑셀 VBA 다른 셀에 일치하는 코드 값에 데이터 찾아 추가하기 (4) | 2024.05.29 |
엑셀 VBA 배열 처리를 위한 Array 객체 사용하는 방법 (0) | 2024.05.27 |