728x90

네이버 지식인에 올라온 문의사항이 의미하는 바를 모르겠다고 하여 주석문을 달았습니다.

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



FindVBA_예제.xlsm


블로그 이미지

Link2Me

,