자체셀내의 중복여부 검사
엑셀 데이터가 많을 경우 기준열(Column)에 반복된 값이 얼마나 들어 있는지 검사하는 VBA 코드이다.
가져다 활용하실 경우 검사열 열만 변경, 중복이라고 내용을 뿌릴 열만 지정하세요.어떻게 처리되는지 확인은 F8키를 눌러서 순차적으로 실행되는 것을 확인하면 된다.
중복검사할 때 엑셀함수 CountIF 를 사용하듯이, VBA 에서도 엑셀에서 기본 제공하는 countif 함수를 이용할 수 있다. 이용하는 방법은 application.countif(범위,조건) 을 주면 된다.
rngC.Offset(0, rngT) = "중복" 와 같이 offset(행,열) 을 이용하기도 하지만,
Cells(행,열) 사용하면 직관적으로 이해하기 쉽다. Cells(rngC.Row,"D") = "중복" 이라고 하면 D열에 표시가 되는구나 하고 이해할 수 있다.
Sub 자체셀내의중복검사()
Dim rngCh '// 입력할 열 글자
Dim rngC As Range '// 한 행(Row)씩 변하는 변수 지정
Dim rngTarget As Range '// 대상 범위 지정변수
Dim sRow As Integer '// 열을 직접 지정하지 않고 ActiveCell 기준으로 정하고자 할 때
Dim rngT As Integer '// 결과값을 표시할 위치 지정할 변수
Dim oldTime As Single
Application.ScreenUpdating = False '//화면 업데이트 일시 정지, 이걸 지정해줘야 매우 빠르게 처리함
oldTime = Timer
rngCol = "C"
Set rngTarget = Range(Cells(2, rngCol), Cells(Rows.Count, rngCol).End(3))
'// End(3) 은 End(xlUp) 으로 엑셀이 제공하는 총 행의 수로부터 위로 이동하라는 명령
'// End(3)(2) 는 값이 있는 마지막행의 offset(1,0) 과 같은 의미로 바로 아래 행을 의미
'ActiveCell.Select '// ActiveCell 있는 셀 기준으로 중복검사를 할 경우
'Set rngTarget = Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column).End(3))
rngT = 3 '// 검사하는 열로부터 몇번째 열에 중복이라는 글자를 표시할 것인가?
For Each rngC In rngTarget
rngC.Offset(0, rngT).ClearContents
rngC.Font.Bold = False
rngC.Offset(0, rngT + 1).ClearContents
If Application.CountIf(rngTarget, rngC.Value) > 1 Then '// 중복 개수가 2개 이상인 것만
rngC.Font.Bold = True
rngC.Offset(0, rngT) = "중복"
rngC.Offset(0, rngT + 1) = Application.CountIf(rngTarget, rngC.Value)
End If
Next rngC
Set rngTarget = Nothing '// 변수 초기화
MsgBox "총 " & Format(Timer - oldTime, "#0.00") & " : 초 소요"
End Sub
자료가 방대한 경우 어느정도 시간이 걸리는지 체크해보려고 넣었다
첨부파일은 텍스트파일이므로 수정해서 사용하시면 됩니다.
'업무 능력 향상 > 엑셀 VBA 기초' 카테고리의 다른 글
[VBA] convert TextNumber to Number (0) | 2014.01.25 |
---|---|
[VBA기초] InStr 를 이용한 셀 분리 (2) | 2014.01.19 |
[VBA기초] 아스키코드 알아내기 (0) | 2014.01.10 |
엑셀 VBA 참고하면 좋은 사이트 소개 (1) | 2013.12.21 |
[엑셀 VBA] 한글 영문 혼용 셀에서 한글, 영문 추출 (0) | 2013.06.14 |