엑셀 IsInArray 명령문 사용법 및 전체 명령문 :: 배열 안 값 존재여부 확인

배열 안의 값 존재여부를 정확히일치/유사일치로 검색하여 값 또는 목록을 반환하는 IsInArray 함수 사용법 및 전체명령문 동작원리를 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2022. 06. 24. 01:16
URL 복사
메모 남기기 : (8)

배열 내 값 존재여부를 확인하는 명령문 : 엑셀 IsInArray 함수

구문

IsInArray ( 찾을값, 배열, [일치옵션], [반환형식], [검색차원] )

패치노트
  • 2019년 12월 05일 : [vbCompare] 대소문자 구분 옵션을 추가하였습니다.
    vbTextCompare : 대소문자를 구분하지 않습니다. (기본값)
    vbBinaryCompare : 대소문자를 구분하여 검색합니다.
  • 2019년 12월 29일 : [Dimension] 기본값을 0에서 1로 수정하였습니다.
설명

IsInArray 명령문은 찾을값이 배열내에 존재하는지 확인 한 뒤, 해당 값을 반환하는 함수입니다. '정확히일치' 또는 '유사일치'로 값을 조회할 수 있습니다.

'유사일치'로 값을 조회할경우, 비슷한 모든 값들을 '배열'로 반환합니다.

IsInArray의 3가지 형태로 값을 반환합니다.

  • rtnSequence : 값의 순번을 반환합니다.
  • rtnValue : 값을 반환합니다.
  • rtnArrayValue : 비슷한 값의 목록을 순번과 함께 반환합니다. 첫번째 항목은 값이고, 두번째 항목은 순번입니다.

IsInArray함수는 2차원 배열을 조회할 수 있습니다. 2차원 배열의 값을 검색할경우, 5번째 인수인 [검색차원] 인수를 1로 지정하면 두번째 차원에서 값을 검색합니다.

예를 들어, 아래와 같이 배열이 있다고 가정하겠습니다.

사과 빨간색
오렌지 주황색
포도 보라색
키위 초록색
바나나 노랑색
  • IsInArray("오렌지", Array, True)  '// "오렌지"를 반환합니다.
  • IsInArray("오", Array, True)     '// -1을 반환합니다.
  • IsInArray("오", Array, False)   '// "오렌지"를 반환합니다.
  • IsInArray("오", Array, False, trnSequence)   '// '2'를 반환합니다.
  • IsInArray("오", Array, False, trnArrayValue)   '// {오렌지, 2} 를 반환합니다.
  • IsInArray("초록색", Array, False, trnArrayValue, 1)   '// {초록색, 4} 를 반환합니다.
배열 안에 값 존재여부 확인 IsInArray 명령문_
IsInArray 함수를 사용하면 많은양의 데이터를 더욱 빠르게 조회할 수 있습니다.

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


필요 보조함수
IsInArray 명령문 전체 코드
Function IsInArray(FindValue As Variant, _
                    vaArray As Variant, _
                    Optional ExactMatch As Boolean = True, _
                    Optional returnType As xlArrayReturnType = rtnValue, _
                    Optional Dimension As Integer = 0, _
                    Optional vbCompare As VbCompareMethod = vbTextCompare) As Variant
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ IsInArray 함수
'▶ 배열안에 선택한 값의 존재여부를 확인합니다. 4가지 값으로 반환 가능합니다. (순번, 값, 배열)
'▶ 인수 설명
'_____________FindValue     : 배열에서 찾을 값입니다.
'_____________vaArray       : 값을 검색할 배열입니다.
'_____________ExactMatch    : 정확히일치/유사일치 검색여부입니다.
'_____________returnType    : 반환형식을 결정합니다. 순번(1), 값(2), 배열(3), 기본값은 값(2) 입니다.
'_____________Dimension     : 값을 검색할 배열의 차원입니다.
'_____________vbCompare     : 대소문자 구분 여부입니다. (vbTextCompare : 대소문자구분X, vbBinaryCompare : 대소문자구분)
'▶ 사용된 기타 사용자지정함수
'_____________ArrayDimension 함수
'###############################################################
 
Dim i As Long: Dim j As Long
Dim dicArr As Object: Dim dicKey As Variant: Dim dicKeys As Variant
Dim rtnArr As Variant
Dim ArrDim As Integer
 
ArrDim = ArrayDimension(vaArray)
Set dicArr = CreateObject("Scripting.Dictionary")
 
'// IsInArray 초기값을 설정합니다.
IsInArray = -1
 
'// 정확히일치일 경우
If ExactMatch = True Then
        '// 값이 있을시 ReturnType에 따라 반환합니다. (정확히 일치이므로 결과는 무조건 1개만 반환)
        If ArrDim = 1 Then
        '// 배열이 1차원일 경우
            For i = LBound(vaArray) To UBound(vaArray)
                If StrComp(FindValue, vaArray(i), vbCompare) = 0 Then
                    If returnType = rtnValue Or returnType = rtnArrayValue Then IsInArray = vaArray(i): Exit For
                    If returnType = rtnSequence Then IsInArray = i: Exit For
                End If
            Next i
        Else
        '// 배열이 2차원일 경우
           For i = LBound(vaArray) To UBound(vaArray)
                If StrComp(FindValue, vaArray(i, Dimension), vbCompare) = 0 Then
                    If returnType = rtnValue Then IsInArray = vaArray(i, Dimension): Exit For
                    If returnType = rtnSequence Then IsInArray = i: Exit For
                    If returnType = rtnArrayValue Then dicArr.Add i, i: Exit For
                    Exit For
                End If
            Next i
 
            '// Dictionary에 값이 하나라도 존재시
            If dicArr.Count > 0 Then
                '배열 Redim
                ReDim rtnArr(0, 0 To ArrDim - 1)
                    '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                    For Each dicKey In dicArr.keys
                        For j = LBound(vaArray, 2) To UBound(vaArray, 2)
                            rtnArr(0, j) = vaArray(dicKey, j)
                        Next
                    Next
                '// 배열로 결과를 출력합니다
                IsInArray = rtnArr
            End If
        End If
 
'// 유사일치일 경우
Else
    If ArrDim = 1 Then
        '// 배열이 1차원일 경우
        For i = LBound(vaArray) To UBound(vaArray)
        '// 값이 있을시 ReturnType에 따라 결과를 반환합니다
            If InStr(1, vaArray(i), FindValue) > 0 Then
                If returnType = rtnValue Then IsInArray = vaArray(i): Exit For
                If returnType = rtnSequence Then IsInArray = i: Exit For
                If returnType = rtnArrayValue Then dicArr.Add i, i
            End If
        Next i
 
        '// 유사일치 값이 하나라도 존재시
        If dicArr.Count > 0 Then
            '배열 Redim
            ReDim rtnArr(0 To dicArr.Count - 1)
            i = 0
                '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                For Each dicKey In dicArr.keys
                        rtnArr(i) = vaArray(dicKey)
                    i = i + 1
                Next
            '// 배열로 결과를 출력합니다
            IsInArray = rtnArr
        End If
    Else
        '// 배열이 2차원일 경우
        For i = LBound(vaArray) To UBound(vaArray)
        '// 값이 있을시 ReturnType에 따라 결과를 반환합니다
            If InStr(1, vaArray(i, Dimension), FindValue) > 0 Then
                If returnType = rtnValue Then IsInArray = vaArray(i, Dimension): Exit For
                If returnType = rtnSequence Then IsInArray = i: Exit For
                If returnType = rtnArrayValue Then dicArr.Add i, i
            End If
        Next i
 
        '// 유사일치 값이 하나라도 존재시
        If dicArr.Count > 0 Then
            '배열 Redim
            ReDim rtnArr(0 To dicArr.Count - 1, 0 To ArrDim - 1)
            i = 0
                '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                For Each dicKey In dicArr.keys
                    For j = LBound(vaArray, 2) To UBound(vaArray, 2)
                        rtnArr(i, j) = vaArray(dicKey, j)
                    Next
                    i = i + 1
                Next
            '// 배열로 결과를 출력합니다
            IsInArray = rtnArr
        End If
 
        End If
End If
 
End Function
 
Function ArrayDimension(vaArray As Variant) As Integer
 
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ ArrayDimension 함수
'▶ 배열의 차원수를 반환합니다.
'▶ 인수 설명
'_____________vaArray     : 차원을 검토할 배열을 입력합니다.
'###############################################################
 
Dim i As Integer: Dim x As Integer
 
On Error Resume Next
 
Do
    i = i + 1
    x = UBound(vaArray, i)
Loop Until Err.Number <> 0
 
Err.Clear
 
ArrayDimension = i - 1
 
End Function

IsInArray 함수 상세설명

사용예제
Sub Test()
 
Dim i As Long
Dim vaArray As Variant
 
ReDim vaArray(0 To 4)
 
For i = 0 To 4
    vaArray(i) = Sheet1.Range("B" & i + 3).Value
Next
 
MsgBox IsInArray(Sheet1.Range("D3").Value, vaArray, False) & vbNewLine & _
        IsInArray(Sheet1.Range("D3").Value, vaArray, False, rtnSequence) & "번째에 위치합니다."
 
End Sub
인수설명

IsInArray 명령문에는 총 6개의 인수가 들어갑니다.

인수 설명
FindValue
[Variant]
배열에서 찾을 값입니다.
vaArray
[Variant]
값을 찾을 배열입니다.
ExactMatch
[Boolean, 선택인수]
TRUE 일 경우 정확히일치하는 값을 검색합니다. 기본값은 FALSE (=부분일치) 입니다.
returnType
[xlArrayReturnType, 선택인수]
반환할 값 형식입니다. 기본값은 값 반환 입니다.
Dimension
[Integer, 선택인수]
값을 검색할 차원 수입니다. (0: 1차원, 1: 2차원) 기본값은 1차원 검색입니다.
vbCompare
[VbCompareMethod, 선택인수]
대소문자 구분여부입니다. 기본값은 대소문자 구분 안함입니다.
명령문 동작원리

본 명령문은 아래의 순서로 동작합니다.

  1. 함수의 결과값으로 초기값을 '-1'로 설정
  2. 정확히일치 또는 유사일치 여부 확인
  3. '정확히일치'일경우 ⇨ 값이 하나라도 존재하면, 해당 값 출력 후 명령문 종료
  4. '유사일치'일 경우
    ⇨ 반환형식이 '값' 또는 '순번'일 경우 값이 하나라도 존재하면, 해당 값 출력 후 명령문 종료
    ⇨ 반환형식이 '배열'일 경우 배열의 모든값 조회 후, 유사일치하는 값들을 배열로 출력
  1. 초기값으로 IsInArray의 결과값을 '-1'로 설정합니다. 따라서 배열안에 찾을값이 없을경우 IsInArray 함수는 '-1'을 반환합니다.
    '// IsInArray 초기값을 설정합니다.
    IsInArray = -1
  2. 정확히 일치일 경우 출력되는 값은 1개입니다. 따라서 배열안에서 찾을값이 나오면, 해당 값을 출력한 뒤 바로 명령문을 종료합니다.
    If ArrDim = 1 Then
            '// 배열이 1차원일 경우
                For i = LBound(vaArray) To UBound(vaArray)
                    If StrComp(FindValue, vaArray(i)) = 0 Then
                        If returnType = rtnValue Or returnType = rtnArrayValue Then IsInArray = vaArray(i): Exit For
                        If returnType = rtnSequence Then IsInArray = i: Exit For
                    End If
                Next i
            Else
            '// 배열이 2차원일 경우
               For i = LBound(vaArray) To UBound(vaArray)
                    If StrComp(FindValue, vaArray(i, Dimension)) = 0 Then
                        If returnType = rtnValue Then IsInArray = vaArray(i, Dimension): Exit For
                        If returnType = rtnSequence Then IsInArray = i: Exit For
                        If returnType = rtnArrayValue Then dicArr.Add i, i: Exit For
                        Exit For
                    End If
                Next i
     
                '// Dictionary에 값이 하나라도 존재시
                If dicArr.Count > 0 Then
                    '배열 Redim
                    ReDim rtnArr(0, 0 To ArrDim - 1)
                        '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                        For Each dicKey In dicArr.keys
                            For j = LBound(vaArray, 2) To UBound(vaArray, 2)
                                rtnArr(0, j) = vaArray(dicKey, j)
                            Next
                        Next
                    '// 배열로 결과를 출력합니다
                    IsInArray = rtnArr
                End If
            End If
  3. 유사일치일 경우 출력되는 값은 1개 또는 2개 이상일 수 있습니다.
    - 값 반환형식이 '순번' 또는 '값' 으로 한개만 반환되는 경우, 찾을값이 나오면 해당 값을 출력한 뒤 명령문을 종료합니다.
    - 값 반환형식이 '배열'일 경우 For문을 통해 모든 배열의 값을 조회한 뒤, 모든 유사일치 값을 배열로 반환합니다.

    If ArrDim = 1 Then
            '// 배열이 1차원일 경우
            For i = LBound(vaArray) To UBound(vaArray)
            '// 값이 있을시 ReturnType에 따라 결과를 반환합니다
                If InStr(1, vaArray(i), FindValue) > 0 Then
                    If returnType = rtnValue Then IsInArray = vaArray(i): Exit For
                    If returnType = rtnSequence Then IsInArray = i: Exit For
                    If returnType = rtnArrayValue Then dicArr.Add i, i
                End If
            Next i
     
            '// 유사일치 값이 하나라도 존재시
            If dicArr.Count > 0 Then
                '배열 Redim
                ReDim rtnArr(0 To dicArr.Count - 1)
                i = 0
                    '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                    For Each dicKey In dicArr.keys
                            rtnArr(i) = vaArray(dicKey)
                        i = i + 1
                    Next
                '// 배열로 결과를 출력합니다
                IsInArray = rtnArr
            End If
        Else
            '// 배열이 2차원일 경우
            For i = LBound(vaArray) To UBound(vaArray)
            '// 값이 있을시 ReturnType에 따라 결과를 반환합니다
                If InStr(1, vaArray(i, Dimension), FindValue) > 0 Then
                    If returnType = rtnValue Then IsInArray = vaArray(i, Dimension): Exit For
                    If returnType = rtnSequence Then IsInArray = i: Exit For
                    If returnType = rtnArrayValue Then dicArr.Add i, i
                End If
            Next i
     
            '// 유사일치 값이 하나라도 존재시
            If dicArr.Count > 0 Then
                '배열 Redim
                ReDim rtnArr(0 To dicArr.Count - 1, 0 To ArrDim - 1)
                i = 0
                    '// Dictionary 에서 받아온 각 값을 배열로 옮깁니다
                    For Each dicKey In dicArr.keys
                        For j = LBound(vaArray, 2) To UBound(vaArray, 2)
                            rtnArr(i, j) = vaArray(dicKey, j)
                        Next
                        i = i + 1
                    Next
                '// 배열로 결과를 출력합니다
                IsInArray = rtnArr
            End If
     
            End If

링크] MS 홈페이지 배열(Array)에 대한 상세설명 보러가기

5 4 투표
게시글평점
8 댓글
Inline Feedbacks
모든 댓글 보기
8
0
여러분의 생각을 댓글로 남겨주세요.x