세진세상

VBA 문자열 함수 #1(StrComp, IsNull, InStr) 본문

VBA

VBA 문자열 함수 #1(StrComp, IsNull, InStr)

세진세상 2018. 2. 12. 18:11

VBA 문자열 함수 #1


VBA의 문자열 함수 중에서 '문자열 비교'와 관련한 함수를 알아보겠다.

함수 코드와 용도가 직관적이어서 쉽게 익힐 수 있다.



StrComp(문자열1, 문자열2, 비교 방식)

문자열1과 문자열2를 비교하는 함수이다. 쉽게 말해 같은지 다른지 판단한다.

문자열1이 문자열2보다 클 경우 1, 같으면 0, 작으면 -1을 출력한다. 문자열이 크고 작다고?

이전에도 언급한 적이 있지만, 문자나 기호에는 숫자로 된 코드가 있어서 그 값을 비교한다는 것이다.


비교방식은 세 가지가 있지만, 그 중에 두 가지는 잘 알아두자.

vbBinaryCompare (0) : 이진 비교, 앞서 이야기한 숫자 코드를 비교한다.

vbTextCompare (1) : 텍스트 비교, 대소문자를 구분하지 않는 텍스트 자체만을 비교한다.

괄호 안의 숫자는 비교방식를 간략하게 줄여서 쓸 수 있는 값이다.

vbDataBaseCompare 방식도 있는데, 이는 Locale ID를 비교한다. 당장 실습하기 어려워 보인다.


StrComp 함수를 이용해서 ABC와 abc를 비교해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub StrComp_ex()
    Dim str1 As String
    Dim str2 As String
    
    str1 = "ABC"
    str2 = "abc"
    
    Debug.Print str1; "와 "; str2; "의 문자열 비교"
    
    Debug.Print "이진비교 : "; StrComp(str1, str2, vbBinaryCompare)
    'Debug.Print "이진비교 : "; StrComp(str1, str2, 0)
    Debug.Print "텍스트 비교 : "; StrComp(str1, str2, vbTextCompare)
    'Debug.Print "텍스트 비교 : "; StrComp(str1, str2, 1)
    
End Sub
cs


이진 비교는 비록 읽을 때는 같은 문자열이지만 대문자와 소문자의 값이 다르다고 판단하였다.

특히, 대문자의 값이 소문자의 값보다 더 작다는 것을 확인할 수 있다.

텍스트 비교는 대소문자를 구분하지 않고 문자열을 비교하기 때문에, 두 문자열이 같다고 판단하게 된다.



IsNull(대상)

대상이 Null인지 아닌지, 그 여부를 판단하는 함수다.

리턴값은 False 또는 True의 Boolean 형태로 출력된다.

대상은 문자열이든 숫자든 관계없이 해당 변수의 Null 여부를 판단해준다.


문자열 비교에 관련된 함수를 학습하고 있는데, 왜 이걸 지금 알아야 하나요?

굳이 말하자면, 음... 바로 다음에 학습 InStr 함수에 여러가지 실습을 위해서?

그냥 알아두면 좋다. IsNull 함수를 익히면서 Null을 입력하는 방법도 같이 학습할 수 있으니까...


IsNull 함수를 활용해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Null_ex()
    Dim str1 As String
    Dim str2 As String
    Dim str3 As Variant
    
    str1 = ""
    str3 = Null
    
    Debug.Print IsNull(str1)
    Debug.Print IsNull(str2)
    Debug.Print IsNull(str3)
       
End Sub
cs

 

변수에 Null 값을 입력하기 위해 세 개를 선언했다.

결론부터 이야기하자면 변수에 Null 값을 입력하려면 변수가 Variant 타입이어야 한다.

다른 한 변수는 String 타입 선언에 공백을 입력했고, 또 다른 변수는 String 타입으로 선언만 했다.


공백도 문자열이고, 아무 문자열을 입력하지 않아도 Null이 아닌 초기값을 가지고 있다.

그리고 Variant 타입으로 Null 지정한 변수만이 IsNull 함수를 통해 True 값을 출력하게 된다.



InStr(시작 위치, 검색 대상 문자열, 찾을 문자열, 비교 방식)

'검색 대상 문자열'에서 '찾을 문자열'을 시작 위치부터 찾아, 처음으로 발견되는 '찾을 문자열'의 첫 위치를 출력해준다.

예를 들어 abc에서 bc를 맨 앞에서부터 찾으라고 한다면,

bc가 처음으로 발견되는 첫 위치는 두 번째임으로 2가 리턴된다는 이야기다.


시작 위치의 맨 앞은 0이 아니라 1이라는 점을 알아두자.

보통 주소 값 등을 보면 시작이 0이던데, 왜 그런가요?? 나도 잘 모르겠다.

직접 써보면서 추측하기로는 InStr 함수의 출력값에서 혼동이 발생하지 않게 하기 위함인 것도 같다.


비교 방식은 앞서 학습한 StrComp 함수와 동일하다.


InStr 함수를 다양하게 다뤄보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sub InStr_ex()
    Dim str1 As String
    Dim str2 As String
    Dim str3 As Variant
        
    str1 = "Always be There"
    str2 = ""
    str3 = Null
    
    '1. 기본 출력 결과
    Debug.Print "1 : "; InStr(1, str1, "e"0)
    '2. 비교방식에 따른 출력 결과
    Debug.Print "2-1 : "; InStr(1, str1, "a"0)
    Debug.Print "2-2 : "; InStr(1, str1, "a"1)
    '3. 시작 위치에 따른 출력 결과
    Debug.Print "3 : "; InStr(10, str1, "e"0)
    '4. 검색 대상 문자열의 상태에 따른 출력 결과
    Debug.Print "4-1 : "; InStr(1, str2, "a"0)
    Debug.Print "   str2의 길이 : "; Len(str2) 'Len(문자열) : 문자열의 길이 출력
    Debug.Print "4-2 : "; InStr(1, str3, "a"0)
    Debug.Print "   str3의 Null 여부 : "; IsNull(str3)
    '5. 찾을 문자열의 상태에 따른 출력 결과
    Debug.Print "5-1 : "; InStr(1, str1, str2, 0)
    Debug.Print "5-2 : "; InStr(1, str1, str3, 0)
    Debug.Print "5-3 : "; InStr(1, str1, "k"0)
End Sub
cs


설정 값에 따른 결과를 살펴보기 위해, 다양하게 차려보았다.


'Always be There'이라는 문자열의 맨 앞에서부터 최초로 'e'가 발견되는 위치는 9임을 알 수 있다.


비교 방식에 따른 출력 결과는 이진 비교냐 텍스트 비교냐에 따라 'a'가 최초로 발견되는 위치가 서로 다르다.

이진 비교는 정확히 'a'를 검색하여 4번째에서 발견하지만, 텍스트 비교는 'A'와 'a'가 동일하므로 1번째에서 발견한다.


시작 위치를 10으로 설정할 경우에는 문자열 최초의 'e'는 9번째지만,

10번째부터 검색하므로 13번째의 'e'가 처음으로 발견되는 것이다.

단, 시작 위치가 10이라고 해서 4가 출력되진 않는다.

검색을 10번째에서 시작했지, 결과는 전체에서 몇번째에 있는지 출력하게 된다.


길이가 0인 검색 대상 문자열에서 'a'를 찾을 경우, 말도 안되는 소리지만 리턴값을 확인해야 한다.

0의 값이 리턴되는데, 이는 0번째가 아니라 못 찾겠다라는 뜻인 것 같다.

앞서 첫 위치가 0이 아니라 1인 이유를 추측했다고 언급했는데, 바로 이 부분이다.

아마 첫 위치가 0이었다면 검색이 안될 경우에 리턴값이 다르게 지정되지 않았을까?

값이 Null인 검색 대상 문자열에서 'a'를 찾을 경우, 마찬가지로 말도 안되는 소리지만 '못 찾겠다'를 리턴하지 않는다.

이 경우에는 Null을 리턴하는데, 원하는 값이 검색되지 않는 경우와 구분하기 위한 것 같다.


찾을 문자열이 공백인 경우, 시작 위치가 리턴된다.

분명히 혼동이 올 수 있다. 처음부터 'A'를 찾으라고 한 것과 동일한 결과다.

사용자는 이를 반드시 인지하고, 결과에 반영해야할 것이다.

찾을 문자열이 Null인 경우, Null이 리턴된다.

찾을 문자열이 검색 대상 문자열에서 검색되지 않을 경우, 못 찾겠다며 0이 리턴된다.


아참, 난데 없이 사용한 함수가 하나 있다.

Len(문자열)

문자열의 길이를 리턴하는 함수다.

데이터 중에서 공백인 값을 핸들링할 때 유용하게 사용된다.




지금까지 문자열을 비교하는 함수는 알아보았다.

다음에는 문자열 등의 출력 방식을 지정하는 함수를 학습하겠다.

Comments