배열 내 값 존재여부를 확인하는 명령문 : 엑셀 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} 를 반환합니다.

예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [VBA예제] 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'로 설정
- 정확히일치 또는 유사일치 여부 확인
- '정확히일치'일경우 ⇨ 값이 하나라도 존재하면, 해당 값 출력 후 명령문 종료
- '유사일치'일 경우
⇨ 반환형식이 '값' 또는 '순번'일 경우 값이 하나라도 존재하면, 해당 값 출력 후 명령문 종료
⇨ 반환형식이 '배열'일 경우 배열의 모든값 조회 후, 유사일치하는 값들을 배열로 출력
- 초기값으로 IsInArray의 결과값을 '-1'로 설정합니다. 따라서 배열안에 찾을값이 없을경우 IsInArray 함수는 '-1'을 반환합니다.
'// IsInArray 초기값을 설정합니다. IsInArray = -1
- 정확히 일치일 경우 출력되는 값은 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
- 유사일치일 경우 출력되는 값은 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