이 페이지에서
구문
= 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) 새 모듈에 붙여넣어 사용하세요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 보조 함수가 함께 사용되며 위 전체 코드에 포함되어 있습니다.
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 부분은 기재한 상태입니다!
감사합니다.
해당 오류는 발생하는 원인이 매우 다양합니다.
만약 홈페이지 예제파일 또는 포스트에 적힌 명령문을 그대로 복사/붙여넣기 한 뒤 다시 시도해보세요.
예제파일을 다운받은 뒤 예제파일에 사용된 테스트명령문을 직접 실행하여 동작방식을 이해하시면 많은 도움이 되실 듯 합니다.
답변이 도움이 되셨길 바랍니다. 감사합니다.