배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   WorksheetFunction, MATCH함수
제목:   WorksheetFunction의 힘
     
 

새 페이지 1

  STEP> 따라하기


엑셀에서 주된 VBA 프로그래밍 작업을 하는 필자에게 VBA가 다른 언어보다 나은 점을 꼽으라면 WorksheetFunction을 얘기합니다. 이것은 다른 언어에서는 찾아볼 수 없는 요소입니다. WorksheetFunction을 통해 우리는 엑셀의 함수를 사용할 수 있습니다.

그래서 구현하기 까다로운 기능을 따로 만들지 않고 WorksheetFunction을 사용하여 얻을 수 있습니다. 엑셀함수를 응용하여 구현하는 것이야 말로 VBA의 진수를 맛보는 것이라고 할 수 있습니다. 

오늘은 엑셀의 워크시트 함수중 MATCH함수를 VBA에서 사용하는 사례를 보도록 하겠습니다.

다 아시다시피 MATCH()함수는 값이 아닌 값의 위치를 알려주는 함수입니다. 값을 찾는다면 LOOKUP함수를 사용해야 합니다.

*MATCH()함수의 구문*

 MATCH(lookup_value, lookup_array, match_type)

  lookup_value : 찾고자 하는 값
  lookup_array : 검색 영역, 엑셀에서 배열상수나 셀 영역
  match_type : 검색유형

VBA에서 lookup_value 인수로는 변수를 사용하면 되겠고 lookup_array는 Range개체나 배열을 지정할 수 있습니다. 즉 엑셀의 셀 영역을 지정하는 부분은 Range개체나 배열을 사용하면 됩니다. match_type은 1,0,-1중 하나만 지정하면 되므로 그리 어려울 건 없습니다. 

다음은 Match함수를 VBA에서 이용해 본 예입니다. MATCH함수 도움말의 예를 사용하였습니다.

신경을 써야 하는 부분이 있는데, match_type에 따라 lookup_array인수는 정렬이 필요하기도 합니다. match_type이 1이면 오름차순, -1이면 내림차순으로 정렬되어야 합니다. 그렇치 않은 경우 런타임 에러가 발생합니다. lookup_array인수로서 Range개체를 준다면 Range개체의 Sort메소드를 사용하여 해결하면 되고 배열을 준다면 따로 정렬해주어야 합니다.

Sub Match()

// match_type
// lookup_array에서 lookup_value를 찾는 방법(-1, 0, 1)

// 1  lookup_value보다 작거나 같은 값 중에서 최대값을 찾습니다.
// 
  Lookup_array는 반드시 오름차순(...-2, -1, 0, 1, 2,...A-Z, FALSE, TRUE)으로 정렬되어 있어야 합니다.
// 0  lookup_value와 같은 첫째 값을 찾습니다.
//    Lookup_array는 임의의 순서이어도 됩니다. 

// -1 lookup_value보다 크거나 같은 값 중 가장 작은 값을 찾습니다.
//   
Lookup_array는 TRUE, FALSE, Z-A, ...2, 1, 0, -1, -2, ..., 등으로 내림차순으로 입력되어야 합니다.

// match_type을 생략하면 1로 간주합니다.

    Dim lookup_array_asc
    Dim lookup_array_des
    Dim lookup_value
    Dim match_type

    // match_type을 1로 사용하기 위해 오름차순으로 정렬된 배열   
    lookup_array_asc = Array(25, 38, 40, 41)

    With Application.WorksheetFunction
        lookup_value = 39
        match_type = 1
        Debug.Print .Match(lookup_value, lookup_array_asc, match_type)

        // match_type을 0으로 하여 정확한 값을 찾음
        lookup_value = 40
        match_type = 0
        Debug.Print .Match(lookup_value, lookup_array_asc, match_type)
    End With

    // match_type을 -1로 사용하기 위해 내림차순으로 정렬된 배열
    lookup_array_des = Array(41, 40, 38, 25)

    With Application.WorksheetFunction
        lookup_value = 40
        match_type = -1
        Debug.Print .Match(lookup_value, lookup_array_des, match_type)

        lookup_value = 41
        match_type = 0
        Debug.Print .Match(lookup_value, lookup_array_des, match_type)

        // 다음은 에러가 나는 코드입니다.
        // 1.lookup_array 인수 배열이 match_type에 맞게 정렬되어 있지 않은 경우
        // 2.일치하는 값을 못 찾은 경우
        // ' Match속성을 구할 수 없다'는 런타임에러가 발생.

lookup_array 인수 배열이 match_type에 맞게 정렬되어 있지 않은 경우

        lookup_value = 40
        match_type = -1
        Debug.Print .Match(lookup_value, lookup_array_asc, match_type)

일치하는 값을 못 찾은 경우
        lookup_value = 45
        match_type = 0
        Debug.Print .Match(lookup_value, lookup_array_asc, match_type)

    End With

End Sub