Variables|Variable|Variable Declaration|Dim|As|Integer|
|For|Next|To|MsgBox()|String|Debug|Option Explicit|
|Print|WorkSheets.Add|GoTo|Inputbox()|Long|
|IsNumeric()|Decision Block|Looping Block|If|Then|Else|
|End If|Label Block|implicit declaration|explicit declaration|
컴퓨터프로그래밍은 정보를 다루는것이 목적이다
컴퓨터프로그래밍의 목적은 정보(DATA)의
수집,보관,가공,새정보의 생성등의
일을 쏜살같이 효율적으로 해대는 일을 하기 위함이다
이때 다루는 물건이 정보라는것이니..
당연히 정보가 임시로 머물수 있는 어떤 장소가 필요하게 된다
바로 이것이 변수(Variable)인것이다
컴퓨터프로그래밍은 정보를 여하히 효율적으로 잘 관리할것인가??
그것이 목적이라는것을 잊어 먹으면 안된다!!
엑셀을 프로그래밍하기 위하여 엑셀과 대화를 하기 위한 언어
VBA를 습득한다고 하는것은 다른 입으로 하는 언어를 배우는것과 같다
기본적으로
1,문장을 구성하는 단어의 의미를 알아야 하고
2,그 단어를 어떤 문법으로 연결을 해야 하는지 문법을 배우고
3,의미있는 문장즉 명령문을 만들고(Statements)
4,과연 왜 엑셀과 무엇을 대화 해야 하는지를
생각해야 한다
생각없이 떠드는 바보는 없으니까..
가장 기본인 변수(Variable)라는것을 살펴보자
변수의 선언(Variable Declaration)
변수의 선언!!이라고 하니까..좀 거창하다
여기서 선언은 변수를 이렇게 사용하겠다고 컴퓨터에게 알려 주는것이다
Dim iX As Integer
라고 하는 구문은
iX라는 이름으로 Integer타입의 정보를 임시 사용하고자
하오니..그렇게 아시기 바랍니다!!
라고 컴퓨터에게 신고를 하는것이다
Declaration은 선언이라는 번역보다는 신고가 어울린다
Statement페이지에서 잠시 이야기 하였듯이
Declaration Statement(선언적명령문) 인것이다
입국절차를 받을때,세관에서..혹시 신고하실것 있습니까??라는 질문을
Do you have anything to declare??!!
라고 하니까..!!
여기에서 Dim이라는 키워드는
Dimension의 약자로서
어느 크기로 컴퓨터의 메모리부분에 영역을 확보하고
앞으로 당분간,임시로,이 영역을 사용하겠다는 약속을 하는것이다
영역을 확보한다면 어떤 크기가 필요할것이다
무한대의 영역을 사용할수 없을것이다
그래서 변수 하나마다 적절한 크기의 영역을 할당받을수 있는것이고
그래서 Integer타입이라는 크기(나중에 자세히..)만한 영역을 말하고..
앞으로 이 영역에 접근하고 싶을때는 iX라는 선언된 변수명으로
접근하겠다는 약속의 명령문인것이다
삭제된 화일을 다시 복원시켜서 증거를 확보한다는 둥..
흔히 하는 소리들이다
화일을 삭제한다함은 화일내용을 몽땅 삭제하는것이 아니고
(포멧을 하지 않으면 그대로 유지되고 이름만 잃어먹는것이다)
화일내용이 확보하고 있는 영역과 이것을 참조할수 있는
화일이름에 관한 등록정보를 삭제한것이다
역시 화일이름도 하나의 변수인것이다
단지 하드드라이브에 저장이 된것뿐이고
여기에서 변수는 메모리에 임시저장되는 이름들인것이다
컴퓨터프로그램이란 엑셀프로그래밍이던..다른 어떤 언어로 만든것이던..
변수를 만들고 변수에 이름을 지어주고 변수를 활용하는것이
전부라고 해도 과언이 아니다
초보님들은 대개가 변수가 왜중요한지 감이 잘안온다
그러나 프로그램이 좀더 성능이 좋아지기 위하여서는
변수를 여하히 적절히 잘 구성하고 활용하느냐가 가장 중요한 문제이다
예를 하나 들어 보자
1에서 부터 100까지 계속 합계를 내면 얼마가 되나??
1+2+3+4+5....+100 이라고 계속 계산할까
1+2라는 값을 합치고 또 그값에 +3을 합치고 그렇게 할까??
컴퓨터는 시키는대로 일을 열심히 해준다
일만 제대로 시키면 되는것이다
아직은 안나왔지만 VB에는 순환문이라고 하는것이 있다
변수를 좀더 이해하기 편하게 미리 같이 설명하도록 한다
1에서 부터 100까지 열심히 같은 일을 반복해라!!
라고 하면 계속 쉴새없이 반복한다
반복하면서 계속 합계를 내라!!라고 해도 역시 시키는대로 한다
위와 같은 내용을 말로 표현해 보자
Dim iX As Integer
Dim iTemp As Integer
For iX=1 To 100
iTemp=iTemp+iX
Next
MsgBox iTemp
말로 표현하자면 1에서 부터 100까지 즉 백번을 작업하는데
어떤 작업을 하냐 하면 순환하는 차례의 번호를 앞의 작업번호와 합하라!!
라는 말을 위와 같이 표현한것이 VBA의 문법인것이다
이때 변수가 없으면 일을 못한다
내가 몇번째 작업을 하고 있지???
어디엔가 기억을 시켜야 한다
iX라는 변수가 몇번째 순환하고 있는지 기억하고 있는 역할을 하는것이다
메모리의 한구탱이를 빌려서 이곳에 정보를 담고 iX라는 변수이름으로
이 메모리의 내용을 읽어오는것이다
또 계속반복된 값을 어디엔가에 보관하여야 한다
이것은 iTemp라는 변수가 그 역할을 하는것이다
위의 내용을 실행해보자
순환문은 신경쓰지 마시고 선언된 변수 iX와 iTemp가 임시로 값을
어떻게 저장하였는지만 관찰하시면 ..
아하!!!변수가 이래서 필요한것이구나!! 라고 느끼시면 된다
변수에 값을 전달하는 명령을 구태여 구분하여 보자면
Assignment Statement(할당명령문)라고
할수있다
값을 변수에 할당(전달)해주라는 명령인것이다
웹페이지에서 실행하던
엑셀에서 실행하던 어떤 언어를 사용하던 변수라는것은 필요하고
위와 같은 일을 하는것이다
변수가 없다면 임시로 값을 어디에 저장할지..??!!
초보님들은 ..그냥 컴퓨터가 알아서 저장하고 있겠지??라면
정말 오산이다
프로그래밍을 하는 사람이 지정을 해주고 준비를 해주어야 하고
그런 작업이 바로 컴퓨터 프로그래밍인것이다
아래의 코드를 복사하여 모듈시트에 붙여넣고
편집기내의 실행버튼을 크릭하여 보시기 바란다
직접실행창에 위의 내용과 같은 것이 기록되는것을 볼수있다
Dim sX As String
이라는 명령으로 변수를 하나 더 선언하였다
이것은 문자열정보를 임시로 저장하는 역할을 한것이다
꼭 복사하여 붙여넣고 실행해보시기 바란다
Sub observeVariables()
Dim iX As Integer
Dim iTemp As Integer
Dim sX As String
For iX = 1 To 100
iTemp = iTemp + iX
'Debug.Print는 직접실행창에 결과를 나타나게 한다
Debug.Print "iX=" & iX & " | iTemp= " & iTemp
Next
End Sub
왜 변수가 필요한지 하나 더 해보자
아래의 버튼을 크릭해 보시기 바란다
사용자에게서 그림을 몇개 만들까요??라고 물어보고
사용자가 입력하는 갯수만큼 그림을 그려주려고 한다
그런데 사용자가 100개..1000개라는 갯수를 입력한다면
그것을 모두 수용할수는 없다
5개보다 많이 입력할때는 5개만 그림을 그려준다는 원칙을
프로그래밍하여 두면 되는것이다
왼쪽의 그림을 몇개 만들까요??버튼 크릭
아래의 프로시져를 모듈시트에 옮기고 실행을 시켜보자
아래에서 실제적인 일을 하는 명령문은
WorkSheets.Add
라는 명령이다
즉 통합문서에 워크시트를 새로 삽입하라!!라는 명령문인것이다
나머지는 모두 부속품이다
함수가 InputBox(),MsgBox(),IsNumeric()이 수고하고
다른 명령문은 Decision Block이라는 프로그래밍에서 가장 중요한
If~End If 블록..조건 명령문이 출연했다
또한 For~Next라는 순환문을 진행하는 Looping Block Statement도 볼수있다
될수있는 한 간단하면서 VBA구문의 기본구조를 모두 보기 위한 쌤플이고
단순히 변수의 선언만 보는것이 아니니까..
몇번을 반복하여 보시기 바란다
또 다른 명령문으로서 GoTo문이 나타났다
어떤 조건이 맞을 경우 어떤 라벨브록으로 이동하라는 명령문이다
변수외에는 아직은 낯섫지만
실행시켜 보시기 바라고
iNum변수가 없다면 어떻게 일을 해야할지 변수의 중요성만
느끼면 된다
위에서 웹에서의 프로그래밍과 자꾸 비교하는 이유는 엑셀에서
프로그래밍의 컨셉을 쉽게 익힌다면 다른 환경에서도 같은 컨셉이
적용된다는 점을 보기 위한것이고 앞으로 계속 병행하여 보도록 한다
'아직 조건문에 대한 이야기는 나오지 않았지만
'아직이해가 안되더라도 변수의 내용을 관찰하는 차원에서 보기 바란다
Sub makeSheets()
Dim iNum As Integer, iX As Integer
iNum = InputBox("워크시트를 몇장 삽입할까요")
'아래와 같이 조건문이 실행되고..
'이런 조건문을 Decision Block Statement라고도 한다
If Not IsNumeric(iNum) Then
MsgBox "숫자만 입력하세요"
Else
If iNum > 5 Then
If MsgBox("5장이 최대갯수입니다...5장만 만들까요", _
vbYesNo) = vbYes Then
iNum = 5
GoTo X
End If
Else
'아래와 같은것을 Label Block이라고 한다
X:
For iX = 1 To iNum
'실제로 작업을 하는 부분이 아래의 한줄이다
'실행하는 명령문 Execution Statement..
Worksheets.Add
Next
End If
End If
End Sub
정보가 오고가면서 작업을 하게 되는것이고
오고가는 정보를 임시 보관하는 장치가 변수라는 점!!!
위의 구문을 다시 정리하면
1,사용자로 부터 몇장의 워크시트를 삽입할것인지
2,정보를 InputBox()함수로 받는다
3,혹시라도 사용자가 숫자를 입력하지 않고 문자를 입력하였다면 유효한 정보가
아니다..그래서 IsNumeric()함수로 유효한 숫자인지 알아본다
4,유효한 숫자가 아니면 MsgBox()함수로 숫자만 입력하라고 알려준다
5,정상적인 숫자가 들어왔다면
5-1,숫자가 5보다 큰지 알아보고 큰숫자라면 5가 최대숫자라고
MsgBox로 알려주고..5장만 삽입한다
5-2,정상적인 5이하의 숫자이면 해당 숫자만큼 순환하면서
5-3,WorkSheets.Add 구문으로 워크시트를 삽입한다
5-4,만약 0이라는 숫자를 입력하였다면 한장도 삽입되지 않을것이다
몇장이라는 숫자 정보가 가장 중요하고
이것을 임시 저장하는 변수 iNum 을 유심히 관찰하면 변수의 중요성을 안다
프로그래밍을 하려면 위와 같이 시나리오를 먼저 프로그래밍하는 습관을
갖여야 한다
변수의 묵시적선언과 명시적선언(implicit declaration and explicit declaration)
우리의 일상에서도 묵시적으로 말을 안해도 그려려니
하고 진행되는 일이 있듯이 VB에서도 변수의 선언에 있어서
묵시적으로,사용하겠다는 말없이..선언없이 사용하는 경우와
명시적으로 사용하는 경우가 있다
명시적선언이라는 지시를 하는 명령문도 변수선언과 같이
Declaration Statement(선언적 명령문)이다
변수의 명시적선언 명령을 하면 변수를 반드시 선언하고 사용하여야 하고
그렇지 않을 경우는 선언없이 그냥 변수를 사용해도 되는것이다
변수의 명시적선언과 묵시적선언
아래의 그림과 같이 VB편집기에서
도구/옵션/편집기/변수선언요구를 체크해주면
항상 모듈시트의 선언부에 Option Explicit
구문이 자동입력된다
이것의 의미는 만약 명시적으로 하겠다고 Option Explicit라고 해놓고
아래와 같이 작성하면 에러가 나게 된다
반드시
Sub sample()
Dim iX As Integer
iX=3
MsgBox iX
End Sub
와 같이 변수를 선언해야 하는것이다
그러나 Option Explicit가 선언되어 있지 않다면
Sub sample()
iX=3
MsgBox iX
End Sub
라고 변수를 선언하지 않아도 에러가 나지 않고 진행된다
대개의 프로그래밍언어는 명시적으로 변수를 선언해야 되지만
VBA에서는 특별히 편하게 변수선언없이 코딩을 할수 있게 한것이다
그러나 권하건데..항상 변수선언요구체크박스를 체크하여
Option Explicit이 선언부에 자동입력되게 하고
코딩을 하는것이 좋다
한참 하다 보면 변수의 갯수도 늘어나고 헷갈리기 쉬워지는것을
VB엔진이 통제를 하여 주니까..좋은것이다
삶의 질을 높이려면 어느정도의 통제가 필요한 경우가 이곳에서도 적용된다
아래와 같은 경우를 위하여 명시적선언이 좋다
VB에서 편집을 할때 명령줄을 입력한후 엔터키를 치면
VB의 예약어들은 당초 정해진 대문자와 소문자로 자동으로 변환된다
변수도 개발자가 의미있는 단어로 thisMonthAmount라고 지어 주었다면
명령구문에서 변수를 사용할때마다 선언할때의 대소문자로 자동변환되어
수십줄,수백줄,수천줄의 코딩을 할때 헷갈림없이 진행할수 있으나
묵시적선언으로 하면 그런 기능이 작동되지 않는다!!
그림에서 보듯이 전혀 의미없는 변수명..헷갈리는 변수명으로 바뀌어버린다
또한 명시적으로 사용하면 코딩중 선언했던 변수의 스펠을 착각하고
다른 이름으로 입력하면
노랑색으로 선택이 되고 에러메시지가 뜨게 되어
VB엔진이 선언된 변수와 입력는 내용을 비교,검토해 준다