배열 내 값 존재여부를 확인하는 명령문 : 엑셀 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

Imagelookup 함수를 사용하려고, 부수적인 함수들을 모두 VBA Code를 긁어모아 실행하고 있는데, Function IsInArray(Findvalue ~~) 에서 사용자 정의 형식이 정의되지 않았다고 오류가 뜨는데 어떻게 해야 할까요?
Public Enum 구문이 누락되어서 그런 듯 보입니다.
아래 명령문을 모듈 맨 윗쪽에 추가해보시겠어요?
Public Enum xlArrayReturnType
rtnSequence = 1
rtnValue = 2
rtnArrayValue = 3
End Enum
이분분을 젤 위에다 두시고(첫번째 라인)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ ArrayDimension 함수
'▶ 배열의 차원수를 반환합니다.
'▶ 인수 설명
'_____________vaArray : 차원을 검토할 배열을 입력합니다.
'###############################################################
Function ArrayDimension(vaArray As Variant) As Integer
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
이함수를 더 추가 하셔야 됩니다
2차원 배열 저장하는데 아래첨자가 잘못되었다는 오류가 발생합니다.
본 함수는 배열에 특정 값이 포함되어 있는지 확인하는 함수입니다.
아래첨자가 잘못되었다는 오류는 대부분 설정된 배열의 넓이보다 큰 숫자를 입력할 경우 발생합니다.
예를 들어, Redim Array (0 to 5, 0 to 5) 로 설정한 뒤,
Array(6, 6) = "값" 을 입력하면 아래첨자 오류가 발생합니다.^^
다시 확인해보세요.
본 게시글 주제인 "IsInArray" 사용자정의함수를 사용하려 하는데
"컴파일 에러 : sub 또는 function이 정의되지 않았습니다" 라는 오류가 발생합니다.
위의 컴파일 에러 메세지창이 뜨고 확인을 누르면 아래의 코딩 부분에 노란색 하이라이트가 쳐지고 있는데요...
혹시 짚이는 부분이 있으신지 궁금합니다..참조설정의 문제는 아닌지 등등 해서요
위의 댓글에 적어주신 public enum 부분은 기재한 상태입니다!
감사합니다.
해당 오류는 발생하는 원인이 매우 다양합니다.
만약 홈페이지 예제파일 또는 포스트에 적힌 명령문을 그대로 복사/붙여넣기 한 뒤 다시 시도해보세요.
예제파일을 다운받은 뒤 예제파일에 사용된 테스트명령문을 직접 실행하여 동작방식을 이해하시면 많은 도움이 되실 듯 합니다.
답변이 도움이 되셨길 바랍니다. 감사합니다.