메뉴

IsInArray

Function

배열 안에 찾을 값이 존재하는지 확인한 뒤 순번·값·목록 중 하나의 형식으로 반환하는 VBA 사용자 지정 함수입니다.

IsInArray 코드 미리보기
구문 = IsInArray ( FindValue, vaArray, [ExactMatch], [returnType], [Dimension], [vbCompare] )
인수구분 형식 설명
FindValue 필수 Variant
배열에서 찾을 값입니다.
vaArray 필수 Variant
값을 찾을 배열입니다.
ExactMatch 선택 Boolean
TRUE 일 경우 정확히 일치하는 값을 검색합니다.
FALSE 일 경우 유사 일치로 검색합니다.
returnType 선택 xlArrayReturnType
반환할 값 형식입니다. 기본값은 값 반환입니다.
rtnSequence 는 값의 순번을, rtnValue 는 값을, rtnArrayValue 는 비슷한 값의 목록을 순번과 함께 반환합니다.
Dimension 선택 Integer
값을 검색할 차원 수입니다. 기본값은 1차원 검색입니다.
1 을 지정하면 2차원 배열의 두 번째 차원에서 값을 검색합니다.
vbCompare 선택 VbCompareMethod
대소문자 구분 여부입니다. 기본값은 대소문자 구분 안 함입니다.
vbBinaryCompare 를 지정하면 대소문자를 구분하여 검색합니다.

마스터 코드

복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요
Module1 · 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

활용 예제

시트 값을 배열로 담아 유사 일치로 조회
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

안내사항

배열 안에 찾을 값이 없으면 -1 을 반환합니다.
ArrayDimension 보조 함수가 함께 사용되며 위 전체 코드에 포함되어 있습니다.
댓글 8
5 (4개 평가)
카이로젠
카이로젠 2020.07.29 08:07
안녕하세요! 항상 강의 잘 보고 있습니다.
Imagelookup 함수를 사용하려고, 부수적인 함수들을 모두 VBA Code를 긁어모아 실행하고 있는데, Function IsInArray(Findvalue ~~) 에서 사용자 정의 형식이 정의되지 않았다고 오류가 뜨는데 어떻게 해야 할까요?
오빠두엑셀
오빠두엑셀 작성자 2020.07.30 15:52
안녕하세요?^^
Public Enum 구문이 누락되어서 그런 듯 보입니다.
아래 명령문을 모듈 맨 윗쪽에 추가해보시겠어요?
Public Enum xlArrayReturnType
rtnSequence = 1
rtnValue = 2
rtnArrayValue = 3
End Enum
vba를 파이썬으로
vba를 파이썬으로 2021.11.02 10:12
Option Explicit

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

이함수를 더 추가 하셔야 됩니다
이정아
이정아 2020.08.11 13:21
2차원 배열 저장하는 예시도올려주실 수 있을까요?
2차원 배열 저장하는데 아래첨자가 잘못되었다는 오류가 발생합니다.
오빠두엑셀
오빠두엑셀 작성자 2020.08.11 15:58
안녕하세요?^^
본 함수는 배열에 특정 값이 포함되어 있는지 확인하는 함수입니다.
아래첨자가 잘못되었다는 오류는 대부분 설정된 배열의 넓이보다 큰 숫자를 입력할 경우 발생합니다.
예를 들어, Redim Array (0 to 5, 0 to 5) 로 설정한 뒤,
Array(6, 6) = "값" 을 입력하면 아래첨자 오류가 발생합니다.^^
다시 확인해보세요.
Mely
Mely 2020.11.27 17:34
안녕하세요 항상 많은 도움을 받고 있습니다.

본 게시글 주제인 "IsInArray" 사용자정의함수를 사용하려 하는데
"컴파일 에러 : sub 또는 function이 정의되지 않았습니다" 라는 오류가 발생합니다.

위의 컴파일 에러 메세지창이 뜨고 확인을 누르면 아래의 코딩 부분에 노란색 하이라이트가 쳐지고 있는데요...
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
혹시 짚이는 부분이 있으신지 궁금합니다..참조설정의 문제는 아닌지 등등 해서요

위의 댓글에 적어주신 public enum 부분은 기재한 상태입니다!

감사합니다.
오빠두엑셀
오빠두엑셀 작성자 2020.11.29 04:45
안녕하세요.
해당 오류는 발생하는 원인이 매우 다양합니다.
만약 홈페이지 예제파일 또는 포스트에 적힌 명령문을 그대로 복사/붙여넣기 한 뒤 다시 시도해보세요.
예제파일을 다운받은 뒤 예제파일에 사용된 테스트명령문을 직접 실행하여 동작방식을 이해하시면 많은 도움이 되실 듯 합니다.
답변이 도움이 되셨길 바랍니다. 감사합니다.
강민준🤗
강민준🤗 2024.08.11 12:34
좋은 자료 감사합니다.🙇‍♂️
스크랩 완료