본문 바로가기

코딩/엑셀,VBA

[엑셀/VBA] Find 함수 사용법, 예시

반응형

 

  원래 엑셀 VBA를 많이 쓰고는 있었지만 인터넷에 나와있는 코드를 짜집기 하는 형태여서 실제 이 코드가 어떤건지 모르는 내용이 많다. 엑셀을 많이 다루고 있는 만큼 처음부터는 아니더라도 중요하다고 생각되는 부분만큼은 블로그에 정리해볼 예정.

 

  추가로 파이썬의 xlwings라는 모듈을 사용하면 엑셀 VBA와 연동하여 유용하게 활용할 수 있다고 한다. 업무자동화에 관심이 많다면 공부해보면 좋을 것 같다.

 

 

1. Find 함수

 

  Find 함수는 엑셀에서 데이터가 일치하거나, 또는 부분일치하는 값을 찾는 VBA 메서드(함수)이다. Find 함수의 기본 사용법은 아래와 같다.


※ 사용법

 

셀 범위(Range).Find(What:=찾을 값,Lookat:=xlWhole)

 

-. Lookat:= xlWhole 일 경우 찾을 값과 전체 일치하는 값을 찾음

   Lookat:= xlPart는 부분적으로 일치해도 값을 찾은 것으로 인식

 

-. 참고로 Find는 값을 찾는다고 설명하였지만 Range 의 형식을 갖는다.(아래에서 설명)

 


 

2. 사용 예시

예시

 

  위 엑셀 양식에서 G2(찾을 Data인 Apple) 값에 따라 H:I에 위치하는 이름과 표시열에 일치하는 Data가 있다면 빨간색으로 수정하고 표시열에 Check 문자열을 출력하는 예시코드이다. 참고링크에도 기재하였지만 니꾸님의 블로그 코드를 조금 수정하여 작성.

(참고링크 : http://blog.naver.com/PostView.nhn?blogId=rosa0189&logNo=60132847693) 

 

 

<예시 코드>

Option Explicit

Sub find_data()

    Dim strAddr As String                         '처음 검색하여 찾은 셀의 주소 넣을 변수
    Dim C As Range                                '검색하여 찾은 영역을 넣을 변수
    Dim name As String
    
    name = ActiveSheet.Range("G2")
    ActiveSheet.Range("H:H").Font.Color = RGB(0, 0, 0)
    
     With ActiveSheet.Range("H:H")
        Set C = .Find(What:=name, Lookat:=xlWhole) '처음 일치하는 데이터 name을 찾아 C에 넣고
               
        If Not C Is Nothing Then                  '만일 일치하는 데이터가 있으면
            strAddr = C.Address                   '첫 일치하는 주소를 strAddr에 넣고
           
            Do                                           '다음을 실행
                C.Font.Color = RGB(255, 0, 0)     '셀 폰트 컬러를 빨간색으로
                C.Offset(, 1) = "Check"           'Offset을 통해 다음 열위치에 Check 표시

                Set C = .FindNext(C)             '다음 일치하는 데이터를 찾아 변수에 넣고

            Loop While Not C Is Nothing And C.Address <> strAddr '일치하는 데이터 없고 처음 일치한 주소 아닐때까지 반복
        End If
       
    End With
End Sub

 

-. Fine 함수를 통해 얻은 C 결과값은 Range 형식을 가진다.  따라서 변수 지정시 Set C로 해줘야 오류가 발생하지 않는다.

그냥 C 로 지정하는 경우 아래와 같이 '91' 런타임 오류가 발생한다.

 

<'91' 런타임 오류>

 

-.  C가 Range의 형식을 가지므로 Offset 함수를 사용하여 상대 위치로 이동할 수 있다. C.Offset(Row index, Column index) 형태를 가지며, 위와 같이  C.offset(,1)로 입력할 경우 C 값에서 오른쪽로 1열 이동한 위치를 참조한다. 왼쪽으로 이동하고 싶으면 -1을 입력하면 된다.

 

-. Loop While Not C Is Nothing And C.Address <> strAddr

  : 마지막에 있는 구문은 Fine 함수를 통해 얻은 결과가 비어있지 않고, C의 주소가 첫 일치하는 주소랑 다른 동안은 계속 DO ~ Loop        구문을 실행하라는 의미이다.

 

-. 결과는 아래와 같다. Apple고 일치하는 이름에 빨간색으로 수정되고, 표시란에 "Check"가 입력된다.

 

 

<결과>

 


 

참고링크 : http://blog.naver.com/PostView.nhn?blogId=rosa0189&logNo=60132847693 

 

(46) 찾기(find), 다음찾기(findnext) 기본 코드 (엑셀 VBA 매크로)

이것 또한 찾기(find) 할 때 공식처럼 사용되는 코드입니다. 한 번에 쫙 써내려갈 수 있도록 여러번 사용해...

blog.naver.com

 

728x90