[VBA 제 38강] 중복자료 정리하기 썸네일 이미지
[VBA 제 38강] 중복자료 정리하기
콘텐츠 타입 MS 오피스 엑셀 2003(2007, 2010가능), Windows XP 이상
용량0KB
조회1,842
즐겨찾기
[VBA 제 38강] 중복자료 정리하기를 즐겨찾기 한 횟수는 0 0입니다.
이용등급 프리미엄
제품 상세정보

 




[ 기초 강좌 ]

 

제 38 강

중복자료 정리하기

 

Excel의 생명이라고 할 수 있는 중복자료 정리하기

그 사용법을 알아봅니다.

이럴 때 필요해요

 

중복되어있는 자료들이 마구잡이로 섞여 있을 떄, 유일한 데이터만 추출하기 위해서 필요합니다. 

이렇게 사용해요

먼저, 예시를 살펴보겠습니다.

아래의 그림처럼 C5,C6,C7...영역의 중복된 데이터를 아무셀(F5셀)을 클릭했을때, F5:F13영역처럼

유일한 데이터만 나오게 하려면,

 

 

 

아래의 수식이 필요합니다. (컬렉션 개체(Collection Object)를 사용하여 해결하는 방법으로 접근해 보도록 하겠습니다.)

 Sub ExtractOneItem()
    Dim rngAll As Range, rngCell As Range
    Dim rngOut As Range
    Dim X As New Collection
    Dim varItem
    Dim sht As Worksheet
    Dim r As Integer

    '// 먼저, 등장인물과 배역을 각각 지정해 주었습니다.

    '// 변수 rngAll은 아이템들이 있는 전체 영역을 지정하기 위한 Range 오브젝트이고, 변수 rngCell

    '// For Each~Next 문으로 rngAll 내에 있는 각 셀들에 접근하기 위한 오브젝트이며, 또한 rngOut

    '// 정리된 데이터를 출력할 위치로 선택하게 될 셀의 오브젝트 변수입니다.

    '// 그런데, 그 다음에 Dim X As New Collection이라는 듣도 보도 못한 새로운 것이 하나 나왔지요?

    '// 이것이 바로, 컬렉션 오브젝트 입니다. 이것을 통해 새로운 아이템들을 임시로 담아 둘 수 있는데

    '// 상세한 내용은 아래에서 설명을 드리도록 하겠습니다.

 

  Set sht = ActiveSheet
    Set rngAll = sht.Columns(3).SpecialCells(xlTextValues)
    Set rngOut = ActiveCell

    '// 현재 활성화된 시트, 즉 ActiveSheet를 sht라는 시트 오브젝트 변수에 담아 두고, rngAll에는 앞에서

    '// 정의된 sht의 3번째 열 중에서 문자열이 들어 있는 모든 셀이 포함이 됩니다.

    '// 즉, 문자열이 연속되지 않아도 되는 것이지요. 그리고 변수 rngOut은 앞에서도 소개해 드린 바와 같이

    '// 정리된 아이템들을 출력할 위치로써, 즉 사용자가 선택하게 될 셀의 위치로 정의합니다.

 

 On Error Resume Next

    '// On Error Resume Next는 "에러가 발생하더라도 계속해서 그 다음 문장을 실행하라"는 뜻이라는 건

    '// 다들 아실 터이고, 여기서 한 가지 유념하셔야 할 점은 오늘의 컬렉션 오브젝트의 사용을 위해서는

    '// 이 구문을 반드시 적어 주어야 한다는 것입니다. 그 이유는… 아래에서 설명드겠습니다.

 

     For Each rngCell In rngAll

        X.Add rngCell.Value, CStr(rngCell.Value)

     '// 컬렉션 오브젝트의 기본적인 사용형태는 [오브젝트명.Add Item, key, (before), (after)] 입니다.

     '// 여기서 key의 요소(정식 용어로는 argument라고 하지요)는 Unique한 텍스트, 즉 중복되지 않는

     '// 텍스트일 경우에만 유효합니다.

     '// 이게 무슨얘기냐 하면, 만약에 위에서 나왔던 값을 밑에서 또 만나게 되면 에러가 발생하게 되고

     '// 따라서 아이템에도 추가가 되지 않는다는 얘기입니다. 또한, 이러한 성질머리를 최대한 활용해서

     '// 오늘의 과제를 해결하게 되는 것이지요.

 

    '// 다시 한번 더 정리해 보면, key라는 argument가 사용되면 중복되는 값이 나타 날 경우, 에러가 발생

    '// 하게 됩니다. 또한, 에러가 발생되면 당연히(!) 아이템이 추가가 되지 않을 것입니다.

    '// 그렇지만, 위에서 On Error Resume Next라는 구문을 사용하여 미리 조치해 두었으므로 프로그램

    '// 자체를 종료하지는 않고 (대부분의 경우, 에러가 발생하면 프로그램 자체가 종료됩니다) 그 다음의

    '// 아이템을 계속 순환하면서 새로운 아이템이 발견될 경우, 이를 추가하게 되는 것이지요.

 

    '// 즉, 에러가 발생되면(중복 아이템이 있으면) 아이템이 추가가 되지 않습니다.

 

     Next rngCell

    

  For Each varItem In X

        rngOut.Offset(r, 0) = varItem

       r = r + 1

     Next varItem

    '// 앞서 컬렉션 오브젝트인 X에 임시로 저장한, 정리된 아이템(들)에 대해 다시 순환문을 돌려서 변수

    '// 앞서 컬렉션 오브젝트인 X에 임시로 저장한, 정리된 아이템(들)에 대해 다시 순환문을 돌려서 변수

 

     Next varItem

End Sub

 

오늘 소개해 드린 Collection Object는 아마 실무에서도 응용할 부분이 많으리라 생각됩니다.

 

 

 

 

저작권정보
1. 콘텐츠의 저작권은 쿠키(www.coukey.co.kr)에 있으며, 사용권한은 1인 1카피입니다.
2. 다운로드 받은 콘텐츠는 본인(본인회사)만 사용할 수 있습니다.
3. 다른 사람과 공유하거나 원본 또는 수정 후 무단전제,무단배포,무단판매,무단 공유할 수 없습니다.
4. 웹상에서 배포는 상업,비상업적 목적을 불문하고, 손해배상등 가중처벌됩니다.
[VBA 제 38강] 중복자료 정리하기
이용후기

업무자동화 맞춤제작

고객님의 상황에 100% 맞춘 콘텐츠 제작 전문 서비스를 이용해 보세요.
프리미엄 무료 이벤트 중