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

Variables|Data Type|Do~ Loop While|Variant|Static|OverFlow|IsNumeric()|

정보는 몇가지 타입이 있고 타입에 따른 크기가 있다

프로그래밍언어는 실은 지극히 간단하다
크게 분류하자면

1,어떻게 정보를 변수나 배열에 저장하는가?
  (How to store infomation in variables and arrays)
2,주어진 어떤 논리에 따라 명령을 어떻게 통제하는냐?
  (How to control decision making in code)
3,어떻게 반복작업을 시킬것이냐?
  (How to repeat same pattern works)
4,어떤 경우의 에러가 나면 어떻게 할것인가?
  (How to handle error occured)

인것이고 현재 진행하는 부분은 정보를 어떻게 변수에 저장하느냐?
의 문제를 이야기하고 있는것이다
어디에 무언가 저장을 한다고 하는것은
어떤 크기의 물건을 저장하느냐??
라는 의문이 당연히 나오게 되어야 할것이다
VB에서는 정보의 크기를 규정하는 Data Type을 아래와 같이
규정한다
VBA Data Types
TypeSize in MemoryRange of Values
Byte1 byte0 to 255
Boolean2 bytesTrue or False
Integer 2 bytes-32,768 to 32,767
Long (long integer)4 bytes-2,147,483,648 to 2,147,483,647
Single(single-precision real)4 bytesApproximately -3.4E38 to 3.4E38
Double(double-precision real)8 bytesApproximately -1.8E308 to 4.9E324
Currency8 bytesApproximately -922,337,203,685,477.5808 to 922,337,203,685,477.5807
Date8 bytes1/1/100 to 12/31/9999
Object4 bytesAny Object reference
StringVariable length: 10 bytes + string length; fixed length: string length Variable length: <= about 2 billion (65,400 for Win 3.1); fixed length: up to 65,400
Variant16 bytes for numbers 22 bytes + string length Number: same as Double; String: same as String
User-definedVaries

Dim intX As Integer
라고 하는것은 위의 표에서 보듯이 -32,768 에서 32,767까지의 숫자의
크기만큼의 정보를 담아줄수있는 싸이즈의 변수타입인것이다

'InputBox함수로 나타나는 대화상자에 iAmount 변수에
'Integer타입의 크기보다 큰값을 넣으면 OverFlow라는 에러가 난다
Sub test() Dim iAmount As Integer, iBonus As Integer iAmount = InputBox("한달의 수입을 입력하세요") iBonus = iAmount * 0.2 MsgBox "보너스는 " & iBonus & "입니다" End Sub

입력한 값이 1000000이였다면
당연히 크기가 훨씬 큰 정보를 넣으려고 한것이다
그래서 이것을 Integer보다 큰 정보의 타입으로 Long타입으로
바꿔주면 아래와 같이

Sub test()
Dim iAmount As Long, iBonus As Long
     iAmount = InputBox("한달의 수입을 입력하세요")
     iBonus = iAmount * 0.2
     MsgBox "보너스는 " & iBonus & "입니다"
End Sub

변수의 크기가 맞지 않으면 흘러 넘치는 에러(OverFlow)가 나는것이다
그러나 타입이 큰것에 작은값을 넣는다면 에러가 안나겠지만..
무턱대고 크게만 잡아도 안될 것이다
위의 표를 참조하시고 적절한 크기의 변수를 선언하시기 바란다

변수의 타입이 틀리면 어떻게 될까??

크기가 크던 작던 숫자정보와 문자열정보를 크게 나누어 진다
만약 Integer타입의 숫자정보에 Long타입크기의 정보를 주면
오버플로에러가 나지만 숫자정보에 문자를 전달한다면
정보의 형식이 틀린다(Error Type Match)는 에러가 나게 된다



숫자를 기다리는데 사용자가 계속 바보같이 문자를 넣는다
개발자가 만들어서 사용자에게 주면 사용자는 개발자가 예상하지 못하였던
문제를 발견해내는 재간이 있다
경험이 풍부한 개발자는 바로 사용자가 엉뚱한 짓을 할것을
보다 많이 예측하고 방지할줄 알아야 한다
그래서 개발자는 섬세하고 상상력이 풍부해야 한다

Variable Type And Size

정상적인 정보의 타입이 들어 오도록 생각을 해보자

원하는 정보가 들어오게 하려면

  • 사용자가 입력한 정보가 기대하고 있는 정보와 크기와 형식이 같은지 검문을 하여야 한다
  • 그리고 잘못된 정보가 들어오면 그냥 아무소리없이 중단하는 경우도 있고
  • 잘못된 정보를 입력했습니다!!라는 메시지를 띄우고 중단하는 경우도 있겠고,
  • 정상적인 정보가 들어올때까지 죽기 살기로 계속 입력상자를 띄울수도 있고,
  • 또는 죽기살기로 입력상자를 띄우지 않고 3번까지만 띄우기도 할수도 있을것이고..

다양한 대응방법이 있을것이다
이래서 필요한것이 앞으로 진행될
조건문(Decision making)이나
순환문(Repeating Work)인것이다
미리 조금씩 활용하면서 면역을 키워가자

급여입력

아래와 같이 모듈시트에 옮겨보시고 실행해보시기 바란다 
'순환문과 조건식(Logical Expression)의 활용
Sub calculateBonus()
Dim iAmount As String, iBonus As Long
'정상적인 숫자가 들어올때까지 끈질기게 순환한다
Do
    iAmount = InputBox("한달 급여를 입력하세요")
Loop While  Not IsNumeric(iAmount)
iBonus = iAmount * 0.8
MsgBox "보너스는 " & iBonus & "원 입니다"
End Sub


끈질기게 숫자가 들어올때까지 순환을 한다
언제까지 순환을 하느냐 하면
Not IsNumeric(iAmount) 라는 논리식이 True가 될때까지
Do~Loop하는것이다

이번에는 Static변수가 왜필요한지 실제로 보는 좋은 기회가
될 프로시져이다
좀더 섬세한 프로그래밍을 하려면 좀더 구문을 작성하면 되는것이다
3번까지만 입력기회가 주어지도록 한다

Sub calculateBonus_1()
Dim iAmount As String, iBonus As Long
Static iX As Integer
Dim iLimit As Integer
iLimit = 3
'정상적인 숫자가 들어올때까지 끈질기게 순환한다

Do

    iX = iX + 1
    iAmount = InputBox("한달 급여를 입력하세요  " & iX)
Loop While Not IsNumeric(iAmount) And iX < iLimit
If IsNumeric(iAmount) Then
    iBonus = iAmount * 0.8
Else
    MsgBox iX & "회의 입력기회가 주어집니다"
    iX = 0
    Exit Sub
End If
iX = 0
MsgBox "보너스는 " & iBonus & "원 입니다"
End Sub

아마도 엑셀의 수식에서 논리식과 논리값에 숙달된분들은
If문과 순환조건을 결정하는 논리식을 보면 반가우실것이다
실은 VBA에서 순환문의 기능만 엑셀의 수식에 없을뿐..
개념은 똑같으니까..별로 힘들지 않을것이다


Do While Not Proper Data Type


위의 내용에서 바보같은 실수가 있었다
어떤 문제인지 눈치챈 분들은 아래페이지의 추가적 정보를 참조하시기를..꼭!!

Static변수가 필요하지 않은데요!!!

변수명만 선언하고,타입을 선언하지 않으면 어떻게 될까??!!

Dim iX As Integer
라고 선언한것과
DimiX
라고 선언한것은 어떤 차이가 있을까?

DimiX

Dim iX As Variant
와 같은것이다
VBA에서는 기본데이타타입이 Variant타입(Default Type)인것이다
아니..그렇다면 그냥 변수타입선언없이 기본타입으로 사용하면
될것을 뭐!~~그리 복잡하게 타입을 여러가지로 규정을 해놓았는가??
그렇게 하면 편리하겠지만 이것의 사이즈는 맨위의 표에서
보았듯이 숫자일 경우 16바이트의 사이즈를 요구하고 문자정보일 경우
22바이트를 기본으로 문자갯수에 따라서 사이즈가 확장된다
변수의 타입은 최소한 사용하고자 하는 정보의 사이즈에 맞추어서
사용하는것이 효율적이고 좋다
나중에 배열같은것에서 나오겠지만
특별한 경우에는 Variant타입을 꼭 사용하여야 한다
이럴 경우를 제외하고는 변수의 타입을 같이 선언하는 습관을
갖는것이 좋다

Long타입은 4바이트,Integer타입은 2바이트
Variant타입은 기본적으로 16바이트를 먹구 들어 간다는 점을
아시면..아하..용량이 터무니 없이 크구나!!