네이버 지식인에 올라온 문의사항이 의미하는 바를 모르겠다고 하여 주석문을 달았습니다.
F8 키를 눌러서 한줄 한줄 내려가면서 육안으로 값을 확인해 보면 내용 이해에 도움이 됩니다.
Target.Find(What:=FindCell, Lookat:=xlWhole)
Target 은 찾아야 할 셀의 범위를 지정
FindCell 은 찾을 셀
LookAt:=xlPart 는 부분적으로 일치하는 것을 찾을 때
LookAt:=xlWhole 은 전부 일치하는 경우
Find 함수를 사용할 경우 이중 For 문을 사용하는 경우와
For 문을 하나만 쓰고 Do Loop Whle 문을 쓰는 경우 속도 차이가 상당히 많이 납니다.
Debug.Print 를 하면 직접실행창(Ctrl + 5) 에 아래처럼 나옵니다.
Msgbox 를 하면 매번 팝업창으로 뜨는 불편함이 있지만, Debug.Print 를 하면 VBA 코드에 대한 이해도 쉽고, 내용 파악에도 도움이 많이 됩니다.
Sub FindData()
Dim sht1 As Worksheet '// 시트(Sheet)를 넣을 변수
Dim sht2 As Worksheet '// 시트(Sheet)를 넣을 변수
Dim strAddr As String '// 주소를 저장할 변수
Dim C As Range '// 영역변수
Dim iRow As Long '// 행의 마지막 값을 저장할 변수
Dim n As Long '// 행을 증가시킬 변수
Set sht1 = Sheets("성적") '// 성적 워크시트를 sht1 으로 지정
Set sht2 = Sheets("연도별") '// 연도별 워크시트를 sht2 로 지정
sht1.Range([E1], Cells(Rows.Count, "E").End(xlUp)).Offset(1).ClearContents
'// 성적 시트의 E1 셀을 제외하고 전부 값을 지워라
iRow = sht1.Cells(Rows.Count, "A").End(xlUp).Row '// A열의 값이 있는 마지막셀의 행번호
For n = 2 To iRow
Set C = sht2.Columns(1).Find(sht1.Cells(n, 1).Value, Lookat:=xlWhole)
'// 찾을 범위(Range)는 sht2.Columns(1)
'// sh2.Columns(1) 범위에서 sht1.Cells(n,1).Value 과 100% 일치하는 값을 찾아 C에 넣는다
'// Cells(행,열) 이므로 Cells(n,1) 은 A열에서 행번호는 변하는 값
Debug.Print "주소 : " & Cells(n, "A").Address & " 값 : " & Cells(n, "A").Value
If Not C Is Nothing Then '// C 에 값이 할당되어 있으면(찾는 값이 있으면)
strAddr = C.Address '// sh2의 C의 처음 셀주소를 strAddr 에 저장
Do
Debug.Print C.Next.Value '// C.Next.Value 의 값을 확인해보기 위해서
If C.Next.Value = sht1.Cells(n, 2).Value Then '// C.Next.Value 는 C의 다음셀의 값
sht1.Cells(n, 5).Value = C.Offset(0, 2).Value '// C의 값이 들어 있는 셀로부터 우측으로 2번째 값
Exit Do '// Do Loop 문을 빠져나가라
End If
Set C = sht2.Columns(1).FindNext(C) '// sht2 시트의 A열의 다음(아래행)을 C에 저장하라
Debug.Print "C의 값은 " & C & " C의 주소는 " & C.Address
Loop While Not C Is Nothing And C.Address <> strAddr
'// C 에 값이 할당되어 있고 C.address 와 strAddr 이 서로 다르면 DO문 처음으로 이동
End If
Next n '// 순차적으로 행을 하나씩 증가시킴
MsgBox "작업완료"
End Sub
'업무 능력 향상 > 엑셀 VBA 기초' 카테고리의 다른 글
[VBA기초] 번호제거 (0) | 2015.05.11 |
---|---|
[VBA기초] 테두리선 그리기 (Borders 속성 이용) (1) | 2015.05.07 |
[VBA기초] 행 삭제 기본 개념 이해 (1) | 2015.05.04 |
엑셀 시트 숨기기 (0) | 2015.04.27 |
[VBA기초] RemoveDuplicates 이용한 중복 제거 (2) | 2015.04.22 |