• 최초 작성일: 2000-11-16
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 여러 조건을 비교하는 함수 만들기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 질문 하나를 살펴봅니다.

환자의 병력 자료를 작성할 때 엑셀을 사용하는데, 하나의 조건으로 서로 다른 두 도표를 비교할 때는 VLOOKUP 함수를 사용하지만 여러 가지 조건이 기재된 참고표를 두고 여러 개의 조건을 모두 충족하는 경우의 결과값을 가져오는 방법이 궁금하다는 질문입니다. 데이터베이스 함수도 써 보았지만 해결이 안 되었다고 합니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

여러 조건을 비교하는 함수 만들기

핵심 요약: 여러 조건 비교 함수

기준값을 Type 변수 배열에 담고 인수로 받은 값들과 모두 일치하는 기준을 찾아 Type명을 돌려주는 사용자 정의 함수를 만듭니다.

  • 1단계: Type 문으로 여섯 개의 기준 항목을 묶은 형식을 정의합니다.
  • 2단계: 함수 안에서 형식 배열에 각 Type의 기준값을 저장합니다.
  • 3단계: 배열을 순환하며 모든 값이 일치하면 해당 Type명을 반환하고, 없으면 "해당없음"을 반환합니다.

Step 1: 문제 이해하기

늘상 말씀드립니다만 이제 Excel은 단순한 수치계산용 프로그램이 아닙니다. 각계 각층에서 사용을 하고 있으며 어떻게 창의적으로 생각하느냐에 따라 얼마든지 여러 가지 용도에 확장을 할 수가 있습니다.

불행하게도(?) 질문하신 분은 예제 데이터를 보내주시지 않았습니다. 하지만 다행스럽게도(!) 얼마 전에 비슷한 질문을 하신 분이 있었는데 그 때 보내주신 자료가 있습니다. ^^ 그 자료를 약간 변경해서 사용하도록 합니다. 환자의 병력과는 전혀 상관없는 것이지만 기본 원리는 똑같은 것이니까 응용을 하시면 될 것입니다.

아래와 같은 참고표가 있습니다.

Type횡단면경사면굴곡절사각마모도허용오차
A7.352.840.515.57510.0980.0075
B7.42.8540.5515.62510.1480.0385
C7.7753.22540.9251610.5230.04987
D7.81353.263540.963516.038510.56150.095
E7.90153.351541.051516.126510.64950.115

이것을 기준으로 아래의 <표 1>에 있는 각 데이터 값이 어떤 타입에 해당되는지를 구분하는 것입니다. 이 <참고표>는 예를 들기 위한 것으로 횡단면, 경사면 등 6개의 비교기준만 있지만 만약 비교할 기준이 20개 정도 되고, 또 <표 1>과 같이 비교해야 할 대상이 100개 정도 된다면 이것을 어떻게 해결할 수가 있을까요? 보통 일이 아니지요? 이런 경우에는 함수를 하나 만들어서 해결할 수 있습니다.

아래 <표 1>의 각 행(여섯 개의 값)이 어느 Type에 해당하는지 마지막 열의 사용자 정의 함수 MultiCompare()가 판정합니다(처음 10건만 표시했습니다).

Serial No횡단면경사면굴곡절사각마모도허용오차Type
17.42.8540.5515.62510.1480.0385TYPE B
27.7753.22540.9251610.5230.04987TYPE C
37.352.840.515.57510.0980.0075TYPE A
47.853.263540.963516.038510.56150.095해당없음
510.9852.840.515.57510.0980.0075해당없음
67.90153.351541.051516.126510.64950.115TYPE E
77.7753.22540.9251610.5230.04987TYPE C
87.81353.263540.963516.038510.56150.095TYPE D
97.42.8540.5515.62510.1480.0385TYPE B
107.81353.263540.963516.038510.56150.095TYPE D

Step 2: 사용자 정의 함수 살펴보기

<표 1>에서 Type 부분(빨간 네모)을 보시면 multicompare()라는 사용자 정의 함수가 들어있을 것입니다. 코드를 살펴보도록 합니다.

Type MyType
    횡단면 As Single
    경사면 As Single
    굴곡 As Single
    절사각 As Single
    마모도 As Single
    허용오차 As Single
End Type
'//사용자 정의 함수를 시작하기 전에 요상한(^^) 것이 먼저 나타났군요.
'//이것을 "사용자 정의 변수(User-defined Type Variable)"라고 합니다. 배열변수가 무엇인지는
'//이제 아시지요? 같은 타입의 변수 여러 개를 한데 합쳐놓은 것이 배열변수입니다.
'//그런데 사용자 정의 변수라는 것은 여러 형태의 변수 여러 개를 한데 합쳐놓은 것이라고
'//할 수 있습니다. 즉 변수를 한꺼번에 여러 개를 선언한 것이지요.

'//쉽게 설명하자면, 큰 그릇 하나에 여러 개의 작은 그릇이 들어있는, 즉 여러분들이 여행갈 때
'//가져가는 코펠이라고 생각하시면 이해가 빠르겠습니다(햐~ 기막힌 비유!)

Function MultiCompare(G1, G2, G3, G4, G5, G6) As String
'//이 함수는 G1, G2, … 등 여섯 개의 파라미터 변수를 받아와서 작업 결과를 문자열로 돌려줍니다.

    Dim MyData(5) As MyType
    Dim i As Integer
    Dim blnOK As Boolean
    '//MyData()라는 (정적) 배열변수의 타입을 MyType으로 선언하였습니다. 여기서는 MyType
    '//변수타입이 모두 Single Type이지만 이것을 여러 가지 Type으로 선언해 줄 수도 있습니다.

    '//각 Type의 기준이 되는 값을 각 변수에 담아둡니다.
    '//Type A의 기준값 저장
    With MyData(0)
        .횡단면 = 7.35
        .경사면 = 2.8
        .굴곡 = 40.5
        .절사각 = 15.575
        .마모도 = 10.098
        .허용오차 = 0.0075
    End With

    '//Type B의 기준값 저장
    With MyData(1)
        .횡단면 = 7.4
        .경사면 = 2.85
        .굴곡 = 40.55
        .절사각 = 15.625
        .마모도 = 10.148
        .허용오차 = 0.0385
    End With

    '//Type C의 기준값 저장
    With MyData(2)
        .횡단면 = 7.775
        .경사면 = 3.225
        .굴곡 = 40.925
        .절사각 = 16
        .마모도 = 10.523
        .허용오차 = 0.0499
    End With

    '//Type D의 기준값 저장
    With MyData(3)
        .횡단면 = 7.8135
        .경사면 = 3.2635
        .굴곡 = 40.9635
        .절사각 = 16.0385
        .마모도 = 10.5615
        .허용오차 = 0.095
    End With

    '//Type E의 기준값 저장
    With MyData(4)
        .횡단면 = 7.9015
        .경사면 = 3.3515
        .굴곡 = 41.0515
        .절사각 = 16.1265
        .마모도 = 10.6495
        .허용오차 = 0.115
    End With

    For i = 0 To 4
    '//이제 순환문을 돌면서 함수 시작시에 받아온 값들과 저장된 기준값들을 서로 비교합니다.
    '//이 때 반복회수는 저장된 기본 값들만큼만 순환하면 되겠지요? 즉, <참고표>에서 5개의
    '//기준이 있었으니까 5번만 순환하는 것입니다. 기준이 더 많다면 이 부분을 수정해 주시면
    '//되겠습니다.

        blnOK = Format(G1, "0.0000") = Format(MyData(i).횡단면, "0.0000") _
            And Format(G2, "0.0000") = Format(MyData(i).경사면, "0.0000") _
            And Format(G3, "0.0000") = Format(MyData(i).굴곡, "0.0000") _
            And Format(G4, "0.0000") = Format(MyData(i).절사각, "0.0000") _
            And Format(G5, "0.0000") = Format(MyData(i).마모도, "0.0000") _
            And Format(G6, "0.0000") = Format(MyData(i).허용오차, "0.0000")
        '//입력받은 횡단면과 <참고표>이 횡단면, 입력받은 경사면과 <참고표> 상의 경사면등을
        '//모두 비교하여 모든 값들이 완전히 일치하면 blnOK 변수에는 True값이, 그렇지 않고
        '//한 항목이라도 서로 틀리다면 False 값이 저장됩니다.

        If blnOK Then
            MultiCompare = "TYPE " & Chr(65 + i)
            Exit Function
        End If
    Next i
    MultiCompare = "해당없음"
    '//만약 blnOK 변수에 저장된 값이 True이면 TYPE 명을, 그렇지 않으면 "해당없음"이라는
    '//문자열을 되돌립니다.
End Function

요즘 버전의 엑셀에서는 XLOOKUP이나 MATCH와 배열 수식(또는 FILTER)으로 여러 조건을 만족하는 값을 찾는 방법도 많이 사용합니다. 기준이 자주 바뀐다면 코드에 값을 고정하는 대신 참고표를 시트에 두고 읽어오는 것이 유지보수에 좋습니다.

마무리

"사용자 정의 변수"라는 약간 복잡한 것이 하나 나왔지만 이것을 사용하지 않고서는 해결이 힘든 것이 많이 있으므로 잘 정리해서 완전히 내것으로 만드시기 바랍니다.

오늘은 여기까지…

정리 — 다중 조건 비교 함수 핵심

구분 사용한 코드 역할
형식 정의 Type MyType ... End Type 여섯 항목을 하나로 묶기
배열 선언 Dim MyData(5) As MyType Type별 기준값 저장
값 비교 Format(G1, "0.0000") = Format(...) 소수점 오차를 피해 비교
조건 결합 And 여섯 조건 모두 일치
결과 반환 MultiCompare = "TYPE " & Chr(65 + i) 일치한 Type명 반환

자주 묻는 질문 (FAQ)

Q1. 여러 조건을 모두 만족하는 값은 어떻게 찾나요?

각 조건을 And로 결합해 모두 참일 때만 일치로 판단하도록 사용자 정의 함수로 만들면 됩니다.

Q2. 왜 Format으로 비교하나요?

실수 값은 아주 작은 오차가 있을 수 있어 같은 자릿수로 서식을 맞춘 문자열로 비교하는 편이 안전합니다.

Q3. 사용자 정의 변수는 무엇인가요?

여러 형태의 변수를 하나로 묶어 놓은 형식으로 Type ~ End Type 문으로 정의합니다.

마치며

사용자 정의 변수까지 익히면 여러 조건을 한꺼번에 비교하는 함수도 어렵지 않게 만들 수 있습니다.