Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Working With Strings
|Option CompareText|Option Compare Binary|
|Option Compare DataBase|Asc()|Like|strComp()|
|InStr()|InStrRev()|String()|Space()|strConv()|

VBA문법의 핵심은 모두 끝났고..VBA에서 제공하는 내장함수와
중요한 정보타입을 다루는 부분을 몇페이지에 걸쳐서 살펴보자

문자열정보를 다루는 일은 참 중요하다
웹에서 정보의 오고 가는것은 모두 문자열정보이다
문자열정보를 받아서 필요에 따라서 다른 정보로
변환시켜서 사용하게 된다
그래서 대표적으로 앞에서 나왔던 IsNumeric정보함수같은것이
필요하게 된다
계산을 하기 위한 숫자를 기다리고 있는데
사용자가 엉뚱하게 "ab34cd"라는 문자열을 보낸것을
유효한 숫자값이 될것인지 검토없이 사용하면 에러가 나겠지
그래서 문자열정보를 다루는 함수는 필수적으로 알아야 할 함수들이다

문자열정보의 비교

만약 아래와 같이 두개의 문자열정보를 비교 한다고 하면 어떤 값이 나올까??
"excel">"EXCEL"
True가 나올까??아니면 False가 나올까??


엑셀시트에서의 수식에서의 비교에서는 대문자 소문자를
가리지 않는다(Case-Insensitive)
그러나 VB에서는 기본적으로 대문자 소문자를 가리게 된다(Case Sensitive)
엑셀시트에서 정렬기능은 대문자 소문자를 구별하지 않는것이다
그러면 VB에서도 엑셀의 시트상에서와 같은 상태로 하고 싶다면
선언부에

Option Compare Text

라고 선언해주면 된다

Option Compare Binary

는 대소문자를 구별하겠다는것이고
VB는 기본값으로 (Default) Option Compare Binary가
선언되어 있다고 보면 된다
초보님들은 이것이 뭐 별 중요한가??
하겠지만 엑셀의 정렬기능을 사용하지 않고 VB에서 정렬를 한다거나
할때 기대하지 않은 결과를 갖여 오게 된다
또하나 Option Compare DataBase 라는것이 있으나
이것은 억세스의 VB모듈에서 기본값으로 채택되어 사용되고 있는것이니
억세스를 다루지 않는다면 신경 안써도 된다
(이것은 억세스의 테이블 정렬형식을 사용자가 정한것에 기준하여
문자열의 비교방법을 결정한다는 의미이다)

대문자소문자를 구분하는것은
ASC(""excel"")함수값과 ASC(""EXCEL"")함수값이 틀린것을 기준으로 한다는 이야기다
직접실행창에서 실행하면 아래와 같다
?asc(""excel"")
101
?asc(""EXCEL"")
69

유용한 Like 연산자

문자열중에서 어떤 문자가 섞여있는것을 찾고 싶을때
Like연산자가 유용하다
예를 들어 패스워드를 사용자로 부터 받으려고 하는데
그것이 정해진 형식에 갖추었는지 아닌지
확인하고 처리하여야 할 필요가 있을것이다

엑셀을 이미 잘알고 계신분들은 셀서식에서 사용자정의서식에서
숫자는 #표시를 한다고 하는것은 이미 알고 있으니까..
걱정 없다

Sub getPassword()
Dim sNum As String, sMsg As String
sMsg = "암호를 입력합니다" & _
     "암호의 형식은 333-333-333-4444 로 합니다"
Do
     sNum = InputBox(sMsg)
Loop While Not sNum Like ""###-###-###-####""
MsgBox "입력하신 암호는 형식이 맞고 입력한" & _
     "암호는 " & sNum & "입니다"
End Sub

입력한 정보가 "###-###-###-####"의 형식이냐고 비교하는
연산자가 Like인것이다

Like연산자와 비교할때 다양한 패턴을 비교할수 있다
예를 들어서 K로 시작하고 나머지는 숫자이어야 한다면

sNum Like "K*"

또 M으로 시작하고 G로 끝나는데 중간에 아무 문자나 2개가 있어야 한다면

sNum Like "M??G"

또 K로 시작하고 3개의 숫자가 있고 JK로 끝난다면

sNum Like "K###JK"

또 알파벳첫자와 알파벳마지막자 사이에 숫자가 2개 있어야 한다면

sNum Like "[a-z]##[!a-z]

또 알파벳 첫자와 숫자 3개와 알파벳이 아닌 마지막자가 있어야 한다면

sNum Like "[a-z]###[!a-z]"

문자열정보를 처리하는데 필수적인 연산자이다

대문자,소문자의 구별하여 비교하기 함수/strComp()

VB는 기본값(Default)으로 대소문자를 비교한다
그러나 선언부에 Option Compare의 선언에 따라서 선택적으로 비교할수 있다
그러나 모듈레벨에서의 옵션에 상관없이 프로시져레벨에서 대소문자를 비교하거나
대소문자와 상관없이 선택적으로 비교하고 싶을때가 있을것이다
이때 유용한것이 strComp()함수이다

strComp("excel","EXCEL",vbBinaryCompare)

라고 하면 결과값은 1이고(Case Sensitive)

strComp("excel","EXCEL",vbTextCompare)

라고 하면 결과값은 0이 된다
즉 대소문자 구분없이 비교(Case InSensitive)

문자열정보중에서 특정문자의 위치를 찾기/InStr()함수와 InStrRev()함수

엑셀의 워크시트함수중에서 문자열함수의 Find함수가 생각날것이다
그것과 비슷한것으로 Instr함수와 InstrRev함수가 있다
Instr함수는 앞에서 부터 몇번째 문자에 있는지 위치값을 찾아내는것이고
InstrRev함수는 뒤에서 문자열정보중에 몇번째 위치하는지 위치값을 얻어내고
예를 들어서
"\xxx\yyy\zzz\myfile.asp"
라는 경로를 나타내는 문자열정보에서 화일명만 뽑아내려면

Dim myFile As String
Dim sPath As String
sPath="\xxx\yyy\zzz\myfile.asp"
myFile=Mid(sPath,InStrRev(sPath,"\")+1)

로 하면 되는것이다
앞에서 부터 "\"문자를 찾아서 마지막까지 내려가려면 순환문을 돌리고
복잡하겠지만,InstrRev함수가 있어서 간단하게 처리된다

또한 Instr함수는 기특한 일을 해준다
위의 경로명에서 "\"문자가 몇개있는지 혹은 어떤 문자가
몇개나 들어있는지등을 알아보는데도 편리하다

주어진 문자열정보 sX변수에서 "Excel"이라는 단어가 몇 개 들어있는지
찾아보는것이다


Sub numOccur()
Dim sX As String, iStart As Integer, iPos As Integer, iCount As Integer
sX = "ExcelAccessPowerExcelPointWordExcelOutExcelLook"
iStart = 1
Do
     iPos = InStr(iStart, sX, "Excel", vbTextCompare)
     If iPos > 0 Then
         iCount = iCount + 1
         iStart = iPos + Len("Excel")
     End If
Loop Until iPos = 0
MsgBox iCount & "개가 발견되었습니다"
End Sub

Instr함수의 4개의 매개변수를 활용하는것이 필요하다
첫번째인수는 주어진 문자열정보의 몇번째 문자에서 부터 검색을
할것인가를 지정한다
그래서 처음 순환하기 전에 iStart값을 1로 초기화시켰다
처음에는 첫번째 부터 검색을 시작하라는 의미다
두번째 인수는 검색대상이 되는 문자열정보이고
세번재 인수는 찾고 싶은 문자열정보이거나 문자정보를 주고
마지막 인수는 대소문자를 가릴것이냐 말것이냐??를 정해주는것이다
이것은 선언부에서 Option Compare문이 선언되던 안되던
상관없이 지정하는 방법대로 검색한다
대문자와 소문자를 가리는 것은 찾고자 하는 단어나 문자
즉 여기에서는 "Excel"의 첫문자의 대소문자를 의미한다
"Excel"이거나 "excel"이거나
vbTextCompare는 대소문자와 상관없이 검색하고
vbBinaryCompare는 대소문자를 가려서 검색한다
순환하면서 iPos값이 0보다 크면 발견되었다는 의미이니까
iCount값을 1씩 증가시켜준다
그리고 새로운 검색시작 문자의 위치를 지정한다
iStart=iPos+Len("Excel")
를 해주면 찾은 단어의 위치를 제외한 부분서 부터 검색하는것이다
이렇게 순환을 하는데 언제까지 순환을 하는가
Loop Until iPos=1
InStr함수가 아무것도 찾지 못했을때까지..인것이다

기타 유용한 문자열함수들

기타 유용한 함수들로서
엑셀의 워크시트함수와 거의 같다
엑셀의 워크시트함수를 잘 활용한다면 위의 내용은
그냥 먹고 가는 셈이다
String함수는 REPT함수에 해당하는 함수이고
Space함수는 빈문자의 갯수를 지정하는것으로서 엑셀워크시트함수에는 없고
Proper함수는 엑셀워크시트함수에는 있지만 VB에는 없다
그러나 VB에서 엑셀워크시트함수를 사용할수 있다

Application.WorksheetFunction.Proper("excel")

의 결과값은 "Excel"을 얻는다
흐리게 표현한 부분은 표현식에서 생략해도 되는 부분을 뜻한다

실은 VB에는 엑셀의 워크시트함수 Proper보다 더 강력한것이 들어있다
strConv라는 함수가 있고 아래의 그림과 같이 다양한 변환을 시킬수 있다


엑셀워크시트함수 Proper에 해당하는 작업은 두번째인수를 vbProperCase로
주면 되는것이다
나머지의 것은 직접실행창에서 각자가 테스트해보는것이
더 이해하시기 쉬울것이다
무엇을 배우고 익히더라도 계속 확장할수 있는 내용을
습득하는것이 좋은것이다
저 산업이 과연 확장성이 있는가??
일에서도 중요하지만 지적습득에 있어서도 지혜로운 방법이다
물론 남이 전혀 손대지 않은것을 할수도 있겠으나
보통사람들에 해당되는 이야기는 아닐것이다
거의 모든것이 내가 갖고 있는 재능과 능력에 무언가 +알파하면
새로운 무엇이 창출될수 있는가를 염두에 두어야 하는것이다

아래화일은 전자와 반자를 구분하여 전자를 반자로 바꾸고 싶을때
StrConv함수를 어떻게 사용하는지를 본다

Sample Of Using Asc StrConv Abs Functions