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 개체, 속성, 함수, 이벤트 사용법과 사례 검색해서 참고하기 (0) | 2022.04.26 |
---|---|
엑셀 VBA 이항 논리 연산자 And, Or, Xor 와 단항 논리 연산자 Not 사용하기 (0) | 2022.04.19 |
엑셀 VBA Function 와 Sub 프로시저의 차이점과 사용법 알아 보기 (0) | 2022.04.18 |
엑셀 VBA 동일한 글자색 셀 개수 구하기 (9) | 2022.04.09 |
엑셀 VBA 입력된 값 형식 확인 Information 관련 함수 모음 (0) | 2022.04.01 |
엑셀 VBA 이미지 셀 영역에 맞춰서 넣기, ShapeRange 함수 이용 (1) | 2022.03.28 |
엑셀 VBA 날짜 차이를 계산하는 DateDiff 함수 사용하기 (0) | 2022.03.26 |
엑셀 VBA 날짜 관련 함수, 개체 사용하는 방법 (0) | 2022.03.26 |