본문 바로가기

진리는어디에/VBA

[VBA] String 완벽 가이드

이 포스트는 Excel Macro Mastery 사이트의 'The Ultimate Guide to VBA String Funcitons(by Paul Kelly)'의 내용을 다시 정리한 것입니다. 

우리는 프로그래밍을 할 때 문자열을 조작하는데 꽤 많은 시간을 할애 합니다. 이번 포스트에서는 엑셀 VBA의 문자열을 다루는 다양한 방법에 대해 다루고 있습니다. 본 포스트를 효과적으로 활용하기 위해서 오른쪽에 있는 인덱스를 이용하여 사용하려는 기능을 찾아 보십시오.

String 함수 요약

동작 관련 함수 또는 연산
두 개 이상의 문자열 합치기 Format 함수 또는 "&"
배열로 부터 String 만들기 Join
두 문자열 비교 StrComp 또는 "="
두 문자열 패턴 비교 Like
문자열로 변환 CStr, Str
문자열을 Date로 변환 CDate 또는 Format
문자열을 숫자로 변환 CLng, CInt, CDbl, Val 또는 Format
유니코드, wide 또는 narrow 인코드로 변환 StrConv
대문자 또는 소문자로 변환 StrConv, UCase, LCase
문자열의 일부 추출 Left, Right, Mid
문자열 포멧팅 Format
문자열에서 특정 문자 찾기 InStr, InStrRev
문자열 생성 String
문자열의 길이 Len
공백 지우기 LTrim, RTrim, Trim
문자열의 일부를 치환 Replace
문자열 뒤집기 StrReverse
문자열을 배열로 쪼개기 Split

들어가며

프로그래밍을 함에 있어서 문자열은 가장 중요한 부분이며 우리가 자주 다루는 내용중에 하나입니다. 이번 포스트를 통해서 여러분은 :

  • 문자열의 일부를 추출
  • 문자열 비교
  • 숫자를 문자열로 변환
  • 요일을 포함하는 날짜 형식 지정
  • 문자열에서 특정 문자 찾기
  • 공백 제거
  • 문자열을 배열로 쪼개기

등을 살펴 볼 예정 입니다. VBA에는 이러한 작업을 쉽게 수행하는데 도움이 되는 많은 함수들을 제공하고 있습니다. VBA 문자열 함수를 사용함에 있어서 유의해야 할 점이 한 가지 있습니다. 문자열 함수는 문자열 원본을 변경하지 않습니다. 문자열 함수는 함수에 의해 변경된 새로운 문자열을 리턴합니다. 만일 여러분이 문자열 원본을 변경하길 원한다면 단순히 리턴된 결과를 다시 원본 문자열에 대입하는 것만으로 문자열 원본을 변경할 수 있습니다.

문자열 비교

StrComp() 또는 InStr()과 같은 함수는 Compare라는 선택 인자를 가지고 있습니다. 이 인자는 다음과 같은 역할을 수행합니다.

  • vbTextCompare : 대소문자를 구분하지 않습니다. 알파벳만 같으면 같은 문자로 간주합니다.
  • vbBinaryCompare : 대소문자를 구분합니다. 같은 알파벳이라도 대소문자가 다르면 다른 문자로 간주합니다.

다음 코드는 Compare 선택 인자의 사용 예를 보여 주기 위해 StrComp() 함수를 이용해 문자열을 비교하고 있습니다.

Sub Comp1()

    ' Prints 0  : 대소문자를 구분하지 않고 같은 문자열로 판단 
    Debug.Print StrComp("ABC", "abc", vbTextCompare)
    ' Prints -1 : 대소문자를 구분하기 때문에 다른 문자열로 판단
    Debug.Print StrComp("ABC", "abc", vbBinaryCompare)

End Sub

위 방법 외에도 매번 함수 호출 마다 선택인자를 지정하는 것이 아닌 'Option Compare' 설정을 이용해 한번에 모든 문자열 비교 연산의 대소문자 구분 여부를 지정할 수 있습니다. 옵션을 설정하면 이후 모든 Compare 선택 인자를 가진 함수를 호출할 때마다 Option Compare에 설정된 값을 기본값으로 사용하게 됩니다.

Option Compare를 사용하는 방법은 아래와 같습니다.

  • 'Option Compare Text' : vbTextCompare를 기본값으로 가집니다.
Option Compare Text

Sub Comp2()
    ' Strings match - uses vbTextCompare as Compare argument
    Debug.Print StrComp("ABC", "abc")
    Debug.Print StrComp("DEF", "def")
End Sub
  • 'Option Compare Binary' : vbBinaryCompare를 기본값으로 가집니다.
Option Compare Binary

Sub Comp2()
    ' Strings do not match - uses vbCompareBinary as Compare argument
    Debug.Print StrComp("ABC", "abc")
    Debug.Print StrComp("DEF", "def")
End Sub

만일 Option Compare 셋팅을 사용하지 않는다면 기본값으로 Option Compare Binary가 설정 됩니다.

문자열 합치기

'&' 문자를 이용해 두 개 이상의 문자열을 하나의 문자열로 합칠 수 있습니다.

Sub Append()

    Debug.Print "ABC" & "DEF"
    Debug.Print "Jane" & " " & "Smith"
    Debug.Print "Long " & 22
    Debug.Print "Double " & 14.99
    Debug.Print "Date " & #12/12/2015#

End Sub

위 예에서 서로 다른 타입일지라도 &문자를 이용해 하나의 문자열로 합쳐 질수 있다는 것을 알 수 있습니다. 여러분은 & 문자 외에도 '+'를 이용해 문자열을 합칠 수도 있습니다. 하지만 +의 경우에는 문자열이 아닌 다른 타입의 값을 합치려고 시도 할 때 에러를 발생 시킵니다.

' 정수를 문자열에 합치려 했으므로 Type Mismatch 오류를 발생 시킨다
Debug.Print "Long " + 22

문자열의 일부 추출하기

함수 인자 설명 예제
Left string, length 왼쪽으로 부터 length 만큼 문자들 리턴 Left("Jonh Smith", 4)
Right string, length 오른쪽으로 부터 length 만큼 문자들 리턴 Right("John Smith", 5)
Mid string, start, length start에서 부터 length 만큼 문자들 리턴 Mid("John Smith", 3, 2)

Left, Right, Mid 함수와 같은 경우 문자열의 일부를 추출하는데 사용되는 함수입니다. Left는 왼쪽에서 부터 오른쪽으로, Right는 오른쪽에서 부터 왼쪽으로, Mid는 지정된 위치로 부터 오른쪽으로 지정된 length 만큼의 문자열을 추출해 냅니다.

Sub UseLeftRightMid()

    Dim sCustomer As String
    sCustomer = "John Thomas Smith"

    Debug.Print Left(sCustomer, 4)  '  John
    Debug.Print Right(sCustomer, 5) '  Smith

    Debug.Print Left(sCustomer, 11)  '  John Thomas
    Debug.Print Right(sCustomer, 12)  '  Thomas Smith

    Debug.Print Mid(sCustomer, 1, 4) ' John
    Debug.Print Mid(sCustomer, 6, 6) ' Thomas
    Debug.Print Mid(sCustomer, 13, 5) ' Smith

End Sub

앞에서 설명했듯이 VBA 문자열 함수는 원본을 변경하지 않고 새로운 문자열을 생성하여 리턴합니다. 아래 예제는 Fullname 변수가 변경된 값을 리턴했지만 원본은 변하지 않았음을 보여주고 있습니다.

Sub UsingLeftExample()

    Dim Fullname As String
    Fullname = "John Smith"

    Debug.Print "Firstname is: "; Left(Fullname, 4) ' John
    Debug.Print "Fullname is: "; Fullname ' John Smith

 End Sub

만일 여러분이 원본을 변경하고 싶다면 아래 처럼 단순히 문자열 함수로 부터 리턴된 값을 원본에 재할당 해주기만 하면 됩니다.

Sub ChangingString()

    Dim name As String
    name = "John Smith"

    ' Assign return string to the name variable
    name = Left(name, 4)

    Debug.Print "Name is: "; name ' John

 End Sub

문자열에서 특정 문자(열) 찾기

함수 인자 설명 예제
InStr StringCheck,
StringMatch
지정된 문자열의 위치를 찾는다 InStr("John Smith", "h")
InStrRev StringCheck,
StringMatch
지정된 문자열의 위치를 뒤에서 부터 찾는다 InStrRev("John Smith", "h")

InStr과 InStrRev 함수는 문자열에서 특정 문자열을 찾아 내기위해 사용 됩니다. 만일 지정한 문자열이 있다면 해당 문자열이 시작하는 위치를 리턴하고 그렇지 않다면 0이 리턴 됩니다. 두 문자열 중에 하나가 null인 경우 null이 리턴 됩니다.

InStr 함수

InStr(Start[Optional], StringCheck, StringMatch, Compare[Optional])
  • Start as Long[Optional - 기본값은 1] : 문자열을 찾기 위한 시작 위치를 지정한다(왼쪽에서 부터 오른쪽으로 검색).
  • StringCheck as String : 검색 대상 문자열
  • StringMatch as String : 찾을 문자열
  • Compare as vbCompareMethod : 위의 문자열 비교 섹션 참고
Sub FindSubString()

    Dim name As String
    name = "John Smith"

    ' 첫번째 h의 위치 3 리턴
    Debug.Print InStr(name, "h")
    ' 왼쪽에서 4번째 문자 n 부터 h가 있는지 검색. 10을 리턴
    Debug.Print InStr(4, name, "h")
    ' it 가 검색 되는 위치 8 리턴
    Debug.Print InStr(name, "it")
    ' 6 리턴
    Debug.Print InStr(name, "Smith")
    ' SSS는 찾지 못했으므로 0 리턴
    Debug.Print InStr(name, "SSS")

End Sub

InStrRev 함수

InStrRev(StringCheck, StringMatch, Start[Optional], Compare[Optional])
  • StringCheck as String : 검색 대상 문자열
  • StringMatch as String : 찾을 문자열
  • Start as Long[Optional - 기본값은 -1] : 문자열을 찾기 위한 시작 위치를 지정한다(오른쪽에서 부터 왼쪽으로 검색)
  • Compare as vbCompareMethod : 위의 문자열 비교 섹션 참고

InStrRev 함수는 검색 순서가 오른쪽에서 왼쪽으로라는 것만 빼면 InStr과 완전 동일합니다. 이 함수가 리턴하는 검색된 문자열의 위치는 Start 위치에서 부터 계산 됩니다. 그러므로 동일한 문자열에 대해 같은 문자열을 검색 했다면 InStr과 InStrRev의 결과는 같습니다.

Sub UsingInstrRev()

    Dim name As String
    name = "John Smith"

    ' 아래 두 함 수는 둘 다 1을 리턴한다
    Debug.Print InStr(name, "J")
    Debug.Print InStrRev(name, "J")

    ' 오른쪽 부터 검색하므로 뒤에 있던 h의 위치. 즉 10을 리턴한다
    Debug.Print InStrRev(name, "h")
    ' 위치 9에서 부터 왼쪽으로 검색하여 처음 만난 h의 위치 3을 리턴한다
    Debug.Print InStrRev(name, "h", 9)

    ' 1 리턴
    Debug.Print InStrRev(name, "John")

End Sub

문자열 내 공백 제거하기

함수 인자 설명 예제
LTrim string 문자열 왼쪽의 공백 제거 LTrim("  John")
RTrim string 문자열 오른쪽의 공백 제거 RTrim("John  ")
Trim string 문자열 오른쪽 왼쪽의 공백을 제거 Trim("  John  ")
Sub TrimStr()

    Dim name As String
    name = "  John Smith  "

    ' 왼쪽 공백 제거 "John Smith  "
    Debug.Print LTrim(name)
    ' 오른쪽 공백 제거 "  John Smith"
    Debug.Print RTrim(name)
    ' 양쪽 공백 제거 "John Smith"
    Debug.Print Trim(name)

End Sub

문자열 길이 구하기

함수 인자 설명 예제
Len string 문자열의 길이 리턴 LTrim("John Smith")

Len 함수를 이용해 문자열의 길이를 구할 수 있습니다. 또한 인자로 Long과 같은 숫자형 타입을 넘겨주면 해당 데이터 타입의 사이즈를 리턴합니다.

Sub GetLen()

    Dim name As String
    name = "John Smith"

    ' 10
    Debug.Print Len("John Smith")
    ' 3
    Debug.Print Len("ABC")

    ' Long은 4 바이트이기 때문에 4를 리턴
    Dim total As Long
    Debug.Print Len(total)

End Sub

문자열 뒤집기

함수 인자 설명 예제
StrReverse string 문자열을 뒤집는다 StrReverse("John Smith")
Sub RevStr()

    Dim s As String
    s = "Jane Smith"
    ' "htimS enaJ"가 출력 된다.
    Debug.Print StrReverse(s)

End Sub

문자열 비교

함수 인자 설명 예제
StrComp string1, string2 두 문자열을 비교한다 StrComp("John", "John")
  • string1 as String : 비교할 첫 번째 문자열
  • string2 as String : 비교할 두 번째 문자열
  • Compare as vbCompareMethod : 위의 문자열 비교 섹션 참고

StrComp의 두 문자열의 비교 결과에 따른 리턴 값은 아래와 같습니다.

  • -1 : string1이 string2 보다 작다(알파벳 이나 가나다 순서가 더 빠르다)
  • 0 : 두 문자열은 동일하다
  • 1 : string1이 string2 보다 크다.
  • Null : 두 비교 문자열 중에 하나라도 null이 있다.
Sub UsingStrComp()

   ' Returns 0
   Debug.Print StrComp("ABC", "ABC", vbTextCompare)
   ' Returns 1
   Debug.Print StrComp("ABCD", "ABC", vbTextCompare)
   ' Returns -1
   Debug.Print StrComp("ABC", "ABCD", vbTextCompare)
   ' Returns Null
   Debug.Print StrComp(Null, "ABCD", vbTextCompare)

End Sub

StrComp 함수 외에도 연산자를 이용해 문자열을 비교할 수도 있습니다. 다만 아래와 같은 제약 사항이 있습니다.

  •   '=' 로 문자열을 비교하는 경우 같은지 다른지에 대해 true 또는 false만을 리턴합니다.
  • Compare 인자를 사용할 수 없습니다. 대신 대소문자 차이를 무시하기 위해 'Option Compare Text'를 사용할 수 있습니다.
Option Compare Text

Sub CompareUsingEquals()

    ' Returns true
    Debug.Print "ABC" = "ABC"
    ' "Compare Text" 옵션이 설정되어 있으므로 true 리턴
    Debug.Print "ABC" = "abc"
    ' Returns false
    Debug.Print "ABCD" = "ABC"
    ' Returns false
    Debug.Print "ABC" = "ABCD"
    ' Returns null
    Debug.Print Null = "ABCD"

End Sub

'=' 외에도 '<>'를 이용하여 두 문자열이 같지 않은 경우 true를 리턴하도록 사용할 수도 있습니다.

Option Compare Text

Sub CompareWithNotEqual()

    ' Returns false
    Debug.Print "ABC" <> "ABC"
    ' Returns false because "Compare Text" is set above
    Debug.Print "ABC" <> "abc"
    ' Returns true
    Debug.Print "ABCD" <> "ABC"
    ' Returns true
    Debug.Print "ABC" <> "ABCD"
    ' Returns null
    Debug.Print Null <> "ABCD"

End Sub

패턴 매칭을 이용해 문자열 비교

연산자 인자 설명 예제
Like string, pattern 문자열에서 패턴을 검색한다 "abX" Like "??X"
"54abc5" Like "*abc#"
패턴 토큰 의미
? 아무 문자 하나와 매칭
# 0 에서 9 중의 숫자 하나와 매칭
* 0 개 또는 하나 이상의 아무 문자와 매칭
[charlist] 리스트 안에 있는 아무 문자 하나와 매칭
[!charlist] 리스트 안에 없는 아무 문자 하나와 매칭

패턴 매칭은 문자열에 특정 패턴의 문자가 있는지 확인하는데 사용됩니다. 예를 들어 고객 번호에 3자리 숫자와 3개의 알파벳 문자가 있는지 또는 문자열에 XX 문자와 임의의 수의 문자가 있는지 확인할 수 있습니다.

문자열이 패턴과 일치하면 반환 값은 true이고, 그렇지 않으면 false입니다.

이번 섹션에서는 패턴 매칭의 작동 방식을 위주로 살펴 보도록 하겠습니다. 먼저 아래의 토큰을 사용하는 예를 살펴 보도록 하겠습니다.

[abc][!def]?#X*
  1. [abc] - 대괄호로 싸여진 문자 리스트는 리스트 안에 있는 문자 중 하나와 매칭 되는지를 찾습니다. 이 예에서는 a, b 또는 c 인문자와 매칭 됩니다.
  2. [!def] - d, e 또는 f가 아닌 문자 하나와 매칭 됩니다.
  3. ? - 어떠한 문자든 상관 없이 하나의 문자와 매칭 됩니다.
  4. # - 임의의 숫자 하나와 매칭 됩니다.
  5. X - 문자 X와 매칭 됩니다. 말그대로 알파벳 X입니다.
  6. * - 문자가 없어도 되고 하나 이상의 아무 문자들과 매칭 됩니다.

따라서 아래의 문자열은 패턴 매칭에 의해 유효한 문자열입니다.

apY6X
  1. a는 a, b, c 중에 하나 입니다.
  2. p는 d, e, f 중 어느 것도 아닙니다.
  3. Y는 문자 하나 입니다.
  4. 6은 숫자이므로 #에 매칭 됩니다.
  5. X는 X에 매칭 됩니다.
  6. 그 뒤로 아무런 문자가 없지만 *는 문자가 없어도 되므로 매칭 조건에 부합합니다.

아래 코드 샘플은 다양한 문자열 패턴 매칭의 결과를 보여줍니다.

Sub Patterns()

    ' True
    Debug.Print 1; "apY6X" Like "[abc][!def]?#X*"
    ' True - any combination of chars after x is valid
    Debug.Print 2; "apY6Xsf34FAD" Like "[abc][!def]?#X*"
    ' False - char d not in [abc]
    Debug.Print 3; "dpY6X" Like "[abc][!def]?#X*"
    ' False - 2nd char e is in [def]
    Debug.Print 4; "aeY6X" Like "[abc][!def]?#X*"
    ' False - A at position 4 is not a digit
    Debug.Print 5; "apYAX" Like "[abc][!def]?#X*"
    ' False - char at position 5 must be X
    Debug.Print 6; "apY6Z" Like "[abc][!def]?#X*"

End Sub

부분 문자열 변경하기

함수 인자 설명 예제
Replace string, find, replace,
start, count, compare
문자열의 부분 문자열을 주어진 문자열로 교체한다 Replace("Jon", "n", hn")

Replace 함수는 문자열 내의 부분 문자열을 변경하는데 사용됩니다. 기본적으로 검색하려는 문자열과 일치하는 모든 부분 문자열을 교체합니다.

Replace(Expression, Find, Replace, Start[Optional], Count[Optional], Compare[Optional])
  • Expression as String : 대상 문자열
  • Find as String : 변경하기 위해 찾을 대상 부분 문자열
  • Replace as String : 변경 될 문자열
  • Start as Long[Optional - Default 1] : 대상 부분 문자열을 찾기 위해 검색을 시작할 위치. 기본 값 1
  • Count as Long[Optional - Default -1] : 몇개의 부분 문자열을 변경 할지 지정. 기본 값 -1
  • Compare as vbCompareMethod :  위의 문자열 비교 섹션 참고

기본적인 Replace 예제를 살펴 보도록 하겠습니다.

Sub ReplaceExamples()

    ' 모든 물음표(?)를 세미콜론(;)으로 바꿉니다.
    Debug.Print Replace("A?B?C?D?E", "?", ";")
    ' Smith 를 Jones로 교체
    Debug.Print Replace("Peter Smith, Ann Smith", "Smith", "Jones")
    ' AX를 AB로 교체
    Debug.Print Replace("ACD AXC BAX", "AX", "AB")

End Sub

Output :
A;B;C;D;E
Peter Jones, Sophia Jones
ACD ABC BAB

아래의 예제에서는 Count 선택 인자를 사용하는 것을 보여 주고 있습니다. Count 인자는 검색된 부분 문자열 중 몇개를 변경할지 결정 합니다. 예를 들어 Count를 1로 설정하면 가장 첫번째 발견된 부분 문자열만을 변경합니다.

Sub ReplaceCount()

    ' 첫번째 물음표(?)를 세미콜론(;)으로 변경합니다.
    Debug.Print Replace("A?B?C?D?E", "?", ";", Count:=1)
    ' 세개의 물음표(?)를 세미콜론(;)으로 변경합니다.
    Debug.Print Replace("A?B?C?D?E", "?", ";", Count:=3)

End Sub

Output :
A;B?C?D?E
A;B;C;D?E

Start 선택 인자를 사용하면 문자열의 중간 부터 시작하는 문자열의 일부를 반환할 수 있습니다. Start를 사용하여 지정하는 는 위치는 반환 되는 문자열의 시작 위치입니다. 

Sub ReplacePartial()

    ' 문자열의 4번째 위치 'C' 앞의 물음표(?) 부터 사용
    Debug.Print Replace("A?B?C?D?E", "?", ";", Start:=4)
    ' 8번째 위치부터 사용
    Debug.Print Replace("AA?B?C?D?E", "?", ";", Start:=8)
    ' 교체 되는 문자는 없지만 3번째 위치 부터 시작하는 문자열이 리턴된다.
    Debug.Print Replace("ABCD", "X", "Y", Start:=3)

End Sub

Output :
;C;D;E
;E
CD

때로는 대문자나 소문자만 바꾸고 싶을 수도 있습니다. Compare 인자를 사용하여 이를 수행할 수 있습니다.

Sub ReplaceCase()

    ' 대문자 A만을 교체한다
    Debug.Print Replace("AaAa", "A", "X", Compare:=vbBinaryCompare)
    ' 모든 알파벳 A를 교체한다.
    Debug.Print Replace("AaAa", "A", "X", Compare:=vbTextCompare)

End Sub

Output :
XaXa
XXXX

String으로 타입 변경하기

이 섹션은 Long 과 같은 숫자 타입을 String으로 변경하는 것에 대해 설명 합니다. 다행히도 아래 예제 처럼 VBA는 숫자 타입을 자동으로 String으로 변경해 줍니다.

Sub AutoConverts()

    Dim s As String
    ' 자동으로 숫자를 문자열로 변경
    s = 12.99
    Debug.Print s

    ' 자동으로 여러개의 숫자를 문자열로 변경
    s = "ABC" & 6 & 12.99
    Debug.Print s

    ' double 타입을 자동으로 문자열로 변경
    Dim d As Double, l As Long
    d = 19.99
    l = 55
    s = "Values are " & d & " " & l
    Debug.Print s

End Sub

위 코드를 실행하면 숫자가 자동으로 문자열로 변환되는 것을 볼 수 있습니다. 대부분의 문자열에 값을 할당할 때 VBA가 변환을 대신 해줍니다. 하지만 VBA는 별도의 변환 함수를 제공하고 있으며 다음 섹션에서 그 이유를 알아 보도록 하겠습니다.

명시적 변환

함수 인자 설명 예제
CStr expression 숫자를 문자열로 변경 CStr("45.78")
Str number 숫자를 문자열로 변경 Str("45.78")

특정 경우 여러분은 String 변수를 생성하지 않고 바로 숫자를 문자로 변경하고 싶을 수도 있습니다. 이 경우 여러분은 Str 또는 CStr 함수를 사용할 수 있습니다. 두 함수 모두 long, double, data 또는 boolean과 같은 모든 타입을 인자로 사용 가능합니다.

간단한 예제를 살펴 보도록 하겠습니다. 아래 예제는 다양한 타입의 셀에서 컬렉션으로 값을 읽고 있습니다. Str/CStr 함수를 이용하여 모두 문자열로 저장되도록 할 수 있습니다.

Sub UseStr()

    Dim coll As New Collection
    Dim c As Range

    ' 셀에서 값을 읽어 컬렉션에 저장 합니다
    For Each c In Range("A1:A10")
        ' Str함수를 이용해 값을 문자열로 변환 합니다
        coll.Add Str(c)
    Next

    ' 컬렉션의 값과 타입을 프린트
    Dim i As Variant
    For Each i In coll
        Debug.Print i, TypeName(i)
    Next

End Sub

위 예제에서 Str함수를 이용해 값을 문자열로 변경하고 있습니다. 만일 Str 함수를 사용하지 않고 위와 같은 작업을 하기 위해서는 String 타입 변수를 생성하고 거기에 값을 할당한 다음 컬렉션에 저장해야 합니다. 이런 경우 Str을 사용하는 것이 훨씬 효율적임을 알 수 있습니다.

다중 Region

Str 함수와 CStr 함수의 차이점은 CStr함수는 Region을 대상으로 동작한다는 것입니다. 만일 여러분의 스크립트가 여러 Region에서 사용되는 경우 문자열 변환에 CStr을 사용해야 합니다.

String타입을 숫자 타입으로 변환

함수 반환 값 설명
CBool Boolean CBool("True"), CBool("0)
CCur Currency CCur("245.567")
CDate Date CDate("1/1/2017")
CDbl Double CDbl("245.567")
CDec Decimal CDec("245.567")
CInt Integer CInt("45")
CLng Long Integer CLng("45.78")
CVar Variant CVar("")

위 함수들은 문자열을 다양한 타입으로 변경하는데 사용됩니다. 만일 여러분이 이러한 타입의 변수에 값을 할당하는 경우 VBA가 자동으로 변환을 수행합니다.

Sub StrToNumeric()

    Dim l As Long, d As Double, c As Currency
    Dim s As String
    s = "45.923239"

    l = s
    d = s
    c = s

    Debug.Print "Long is "; l
    Debug.Print "Double is "; d
    Debug.Print "Currency is "; c

End Sub

타입 변환을 사용하면 코드에 유연성이 향상됩니다. 이는 여러분이 런타임에 타입을 결정할 수 있음을 의미합니다. 아래 코드에서는 PrintValue 함수에 전달된 sType 인자를 기반으로 변수의 타입을 설정합니다. 변수를 Long으로 선언하면 코드가 실행될 때 항상 Long 타입이 됩니다.

Sub Test()
    ' Prints  46
    PrintValue "45.56", "Long"
    ' Print 45.56
    PrintValue "45.56", ""
End Sub

Sub PrintValue(ByVal s As String, ByVal sType As String)

    Dim value

    ' Set the data type based on a type string
    If sType = "Long" Then
        value = CLng(s)
    Else
        value = CDbl(s)
    End If
    Debug.Print "Type is "; TypeName(value); value

End Sub

만일 문자열이 적절한 숫자가 아닌경우(예를 들어 문자가 가운데 들어 있다거나..) "Type Mismatch" 에러를 발생 시킵니다.

Sub InvalidNumber()

    Dim l As Long

    ' A 때문에 Mismatch 에러가 발생합니다.
    l = CLng("45A")

End Sub

Val 함수

Val 함수는 문자열의 숫자 부분을 올바른 숫자 타입으로 변경 해줍니다.

Val 함수는 만나는 첫 번째 숫자를 변환합니다. 문자열에서 문자를 만나면 중지됩니다. 문자만 있는 경우 값으로 0을 반환합니다. 다음 코드는 Val 사용의 몇 가지 예를 보여줍니다.

Sub UseVal()

    ' Prints 45
    Debug.Print Val("45 New Street")

    ' Prints 45
    Debug.Print Val("    45 New Street")

    ' Prints 0
    Debug.Print Val("New Street 45")

    ' Prints 12
    Debug.Print Val("12 f 34")

End Sub

Val 함수에는 두 가지 단점이 있습니다.

1. Not Multi-Region –  Val은 소수 대신 쉼표를 사용하는 것과 같은 국제 버전의 숫자를 인식하지 못합니다. 따라서 여러 지역에서 응용 프로그램을 사용할 경우 위의 변환 기능을 사용해야 합니다.

2. 잘못된 문자열을 0으로 변환 - 어떤 경우에는 괜찮을 수 있지만 대부분의 경우 잘못된 문자열로 인해 오류가 발생하면 더 좋습니다. 그러면 애플리케이션은 문제가 있음을 인식하고 그에 따라 조치를 취할 수 있습니다. 문자열에 숫자가 아닌 문자가 포함되어 있으면 CLng와 같은 변환 함수에서 오류가 발생합니다.

String 함수

함수 인자 설명 예제
String number, character 숫자를 문자로 변경합니다. String(5, "*")

String 함수는 반복되는 문자의 문자열을 생성하는 데 사용됩니다. 첫 번째 인수는 반복 횟수이고 두 번째 인수는 문자입니다.

Sub GenString()

    ' Prints: AAAAA
    Debug.Print String(5, "A")
    ' Prints: >>>>>
    Debug.Print String(5, 62)
    ' Prints: (((ABC)))
    Debug.Print String(3, "(") & "ABC" & String(3, ")")

End Sub

대소문자 변경 및 유니코드 변경 함수 - StrConv, UCase, LCase

함수 인자 설명 예제
StrConv string, conversion, LCID 문자를 변경합니다. StrConv("abc", vbUpperCase)
  • string : 변환할 문자열(필수)
  • conversion : 수행할 변환 유형을 지정하는 값(필수)
  • LCID : LocaleID(선택)

문자열의 대소문자를 대문자 또는 소문자로 변환하려면 UCase 및 LCase 함수를 각각 대문자 및 소문자로 사용할 수 있습니다. vbUpperCase 또는 vbLowerCase 인수와 함께 StrConv 함수를 사용할 수도 있습니다. 다음 코드는 이 세 가지 기능을 사용하는 예를 보여줍니다.

Sub ConvCase()

    Dim s As String
    s = "Mary had a little lamb"

    ' Upper
    Debug.Print UCase(s)
    Debug.Print StrConv(s, vbUpperCase)

    ' Lower
    Debug.Print LCase(s)
    Debug.Print StrConv(s, vbLowerCase)

    ' Sets the first letter of each word to upper case
    Debug.Print StrConv(s, vbProperCase)

End Sub

출력
MARY HAD A LITTLE LAMB
MARY HAD A LITTLE LAMB
mary had a little lamb
mary had a little lamb
Mary Had A Little Lamb

기타 변환

뿐만 아니라 StrConv는 Conversion 매개변수를 기반으로 다른 변환을 수행할 수 있습니다. 다음 표는 다양한 매개변수 값의 목록과 그 역할을 보여줍니다. StrConv에 대한 자세한 내용은 MSDN 페이지를 확인하십시오 .

상수 변환
vbUpperCase 1 대문자로 변경
vbLowerCase 2 소문자로 변경
vbProperCase 3 문자열의 첫번째 글자를 대문자로 변경
vbWide 4 Narrow(싱글 바이트) 캐릭터를 Wide(더블바이트) 캐릭터로 변경
vbNarrow 8 Wide(더블바이트) 캐릭터를 Narrow(싱글 바이트) 캐릭터로 변경
vbKatakana 16 히라가나를 카타카나로 변경
vbHiragana 32 카타카나를 히라가나로 변경
vbUnicode 64 시스템 기본 코드 페이지를 이용하여 유니코드로 변경
(매킨토시에서는 사용 불가)
vbFromUnicode 128 유니코드에서 시스템의 기본 코드 페이지로 변경
(매킨토시에서는 사용 불가)

배열과 함께 문자열 사용하기

함수 인자 설명 예제
Split expression,
delimiter,
limit, compare
구분자를 이용해 문자열을 파싱하여 배열로 변환 arr = Split("A;B;C", ";")
Join source array,
delimiter
1차원 배열을 문자열로 변경 s = Join(arr, ";")

Split 함수 - 문자열을 배열로 변경

구분된 문자열을 배열로 쉽게 변환할 수 있습니다. 구분 기호를 매개 변수로 사용하여 Split 함수를 사용하기만 하면 됩니다. 다음 코드는 Split 함수를 사용하는 예를 보여줍니다.

Sub StrToArr()

    Dim arr() As String
    ' Parse string to array
    arr = Split("John,Jane,Paul,Sophie", ",")

    Dim name As Variant
    For Each name In arr
        Debug.Print name
    Next

End Sub

출력
John
Jane
Paul
Sophie

Join - 배열을 문자열로 변경

여러분은 Join 함수를 이용해 배열로 부터 문자열을 쉽게 만들어 낼 수 있습니다. 아래 코드는 Join 함수를 사용하는 예를 보여 줍니다.

Sub ArrToStr()

    Dim Arr(0 To 3) As String
    Arr(0) = "John"
    Arr(1) = "Jane"
    Arr(2) = "Paul"
    Arr(3) = "Sophie"

    ' Build string from array
    Dim sNames As String
    sNames = Join(Arr, ",")

    Debug.Print sNames

End Sub

문자열 서식(Format) 적용

함수 인자 설명 예제
Format expression,
format, firstdayofweek, firstweekofyear
문자열에 서식을 적용한다 Format(0.5, "0.00%")

Format함수는 문자열에 서식을 적용하기 위해 사용 됩니다. 주로 날짜나 숫자를 특정 포멧으로 배치하는데 사용 됩니다. 아래는 Date 타입을 지정하는 일반적인 방법을 보여 줍니다.

Sub FormatDate()

    Dim s As String
    s = "31/12/2015 10:15:45"

    ' Prints: 31 12 15
    Debug.Print Format(s, "DD MM YY")
    ' Prints: Thu 31 Dec 2015
    Debug.Print Format(s, "DDD DD MMM YYYY")
    ' Prints: Thursday 31 December 2015
    Debug.Print Format(s, "DDDD DD MMMM YYYY")
    ' Prints: 10:15
    Debug.Print Format(s, "HH:MM")
    ' Prints: 10:15:45 AM
    Debug.Print Format(s, "HH:MM:SS AM/PM")

End Sub

다음 예는 숫자 포멧을 지정하는 방법 입니다.

Sub FormatNumbers()

    ' Prints: 50.00%
    Debug.Print Format(0.5, "0.00%")
    ' Prints: 023.45
    Debug.Print Format(23.45, "00#.00")
    ' Prints: 23,000
    Debug.Print Format(23000, "##,000")
    ' Prints: 023,000
    Debug.Print Format(23000, "0##,000")
    ' Prints: $23.99
    Debug.Print Format(23.99, "$#0.00")

End Sub

서식 적용 팁

사용할 서식을 파악하는 빠른 방법은 Excel 워크시트에서 셀 서식을 사용하는 것입니다. 예를 들어 셀에 숫자를 추가합니다. 그런 다음 마우스 오른쪽 버튼을 클릭하고 원하는 방식으로 셀 서식을 지정합니다. 형식이 마음에 들면 왼쪽의 범주 목록 상자에서 사용자 지정을 선택합니다.이것을 선택하면 형식 텍스트 상자에서 포멧 문자열을 볼 수 있습니다.

마치며

이상 VBA 문자열을 다루는 다양한 방법에 대해 살펴 보았습니다. 한번에 다 기억하실 필요는 없고 필요한 것이 생길때 마다 인덱스나 맨 처음에 요약 테이블을 이용해 필요한 부분만 살펴 보시면 보다 효율적으로 본 포스트를 이용하실 수 있습니다.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!