VBA 배열에서 값 검색하기
In this Article
이 튜토리얼에서는 VBA에서 배열의 값을 검색하는 방법을 보여드립니다.
배열이 1차원인지 다차원인지에 따라 배열에서 문자열을 검색하는 방법에는 여러 가지가 있습니다.
1차원 배열에서 검색하기
1차원 배열에서 값을 검색하려면 필터 함수를 사용할 수 있습니다.
Dim z As Variant
'원본 배열을 필터링합니다
z = Filter(Array, String, True, vbCompareBinary)
필터 옵션의 구문은 다음과 같습니다.
Filter(원본 배열, 검색 문자열, [Include as Boolean], [Compare as vbCompareMethod])
원본 배열과 검색 문자열은 필수옵션이고 Include as Boolean과 Compare as vbCompareMethod는 선택사항입니다. 이 옵션이 포함되지 않을 경우 기본값으로 각각 True와 vbCompareBinary로 설정됩니다.
필터와 일치하는 값 찾기
Sub FindBob()
'배열을 생성합니다
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'필터링 데이터를 저장할 변수를 선언합니다
Dim strSubNames As Variant
'원본 배열을 피렅링합니다
strSubNames = Filter(strName, "Bob")
'UBound 값이 -1보다 크면 값이 발견된 것입니다
If UBound(strSubNames ) > -1 Then MsgBox ("Bob으 검색되었습니다")
End Sub
두 번째 배열에는 필터가 찾은 값이 저장됩니다. UBound 값이 -1이 아니라면 배열이 검색한 값을 찾은 것입니다.
또한 원래 배열에 텍스트가 몇 번이나 표시되었는지도 확인할 수 있습니다.
Sub CountNames()
'Create array
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'필터링 데이터를 저장할 변수를 선언합니다
Dim strSubNames As Variant
'원본 배열을 피렅링합니다
strSubNames = Filter(strName, "Bob")
'UBound값에 1을 더하면 텍스트가 나타나는 횟수를 구할 수 있습니다
Msgbox UBound(strSubNames) + 1 & " 건의 검색결과가 있습니다."
End Sub
필터와 일치하지 않는 값 찾기
The [Include as Boolean] 옵션을 사용하면 배열에서 필터와 일치하지 않는 값의 수를 찾을 수 있습니다.
Sub CountExtraNames()
'배열을 생성합니다
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'필터링 데이터를 저장할 변수를 선언합니다
Dim strSubNames As Variant
'원본 배열을 필터링합니다
strSubNames = Filter(strName, "Bob", False)
'UBound값에 1을 더하면 텍스트가 나타나는 횟수를 구할 수 있습니다
Msgbox UBound(strSubNames) + 1 & " 건의 검색결과가 있습니다."
End Sub
Filter 함수에서 선택옵션을 변경하였습니다.
strSubNames = Filter(strName, "Bob")
아래와 같이 False를 입력하였습니다:
strSubNames = Filter(strName, "Bob", False)
위 코드를 사용하면 “Bob”과 일치하지 않는 모든 이름을 반환합니다.
대소문자 구분 필터
필터는 기본적으로 대소문자를 구분합니다. 이는 모든 VBA 함수에 해당됩니다. 대소문자를 구분하지 않는 텍스트를 검색하려면 코드를 약간 수정해야 합니다.
z = Filter(strName, "bob",, vbTextCompare)
Filter 옵션에 vbTextCompare를 추가하면 코드에서 “bob” 도는 Bob”을 찾을 수 있습니다. 이를 생략하면 VBA는 기본적으로 정확히 일치하는 데이터만 찾는 vbBinaryCompare를 사용합니다. 위 예제에서는 [Include as Boolean] 인수를 생략했으므로 기본값인 True가 설정됩니다.
Option Compare Text
또는 모듈 상단에 텍스트 Option Compare Text 를 추가하면 해당 모듈에서 작성하는 모든 함수가 대소문자를 구분하지 않게 됩니다.
반복문을 사용하여 배열 검색하기
반복문을 사용하는 것은 필터 함수를 사용하는 것보다 조금 더 복잡합니다. 배열의 모든 값을 반복하는 함수를 만들 수 있습니다.
Sub LoopThroughArray()
'배열을 생성합니다
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
Dim strFind as string
strFind = "Bob"
Dim i As Long
'배열을 반복합니다
For i = LBound(strName, 1) To UBound(strName, 1)
If InStr(strName(i), strFind) > 0 Then
MsgBox "Bob 이 검색되었습니다"
Exit For
End If
Next i
End Sub
텍스트 문자열의 일부, 즉 “Bob Smith” 또는 “Bob Williams”가 아닌 “Bob”이 포함된 문자열을 찾으려면 If 문에서 Instr 함수를 사용해야 했습니다. 이 함수는 배열에서 루프가 반환한 문자열에서 “Bob”이 문자열에 있는지 확인하고, 문자열에 있으면 메시지 박스를 반환한 다음 반복문을 종료합니다.
다차원 배열에서 검색하기
반복문을 사용하여 다차원 배열을 검색할 수도 있습니다. 배열의 모든 값을 반복할 수 있는 함수를 만들어야 합니다. 다차원 배열에서는 배열의 각 차원을 반복해야 합니다.
Function LoopThroughArray()
Dim varArray() As Variant
Dim strFind As String
strFind = "Doctor"
'배열의 크기를 선언합니다
ReDim varArray(1, 2)
'배열 초기화
varArray(0, 0) = "Mel Smith"
varArray(0, 1) = "Fred Buckle"
varArray(0, 2) = "Jane Eyre"
varArray(1, 0) = "Accountant"
varArray(1, 1) = "Secretary"
varArray(1, 2) = "Doctor"
'반복문에 사용될 변수를 정의합니다
Dim i As Long, j As Long
'첫번째 차원에 대한 반복문을 만듭니다
For i = LBound(varArray, 1) To UBound(varArray, 1)
'두번째 차원에 대한 반복문을 만듭니다
For j = LBound(varArray, 2) To UBound(varArray, 2)
'값을 찾으면 단어가 발견되었다는 메시지박스를 표시하고 함수를 종료합니다
If varArray(i, j) = strFind Then
MsgBox "Doctor 단어가 발견되었습니다!"
Exit Function
End If
Next j
Next i
End Function