[VBA]데이터 형식

모든 프로그래밍 언어에는 자신들만의 데이터 형식을 갖고 있다.

다음은 엑셀의 도움말에 있는 내용이다.

데이터 형식저장 용량범위
Byte1바이트0부터 255까지
Boolean2바이트True 또는 False
Integer 2바이트-32,768부터 32,767까지
Long
(긴 정수)
4바이트-2,147,483,648부터 2,147,483,647까지
Single
(단정도 부동 소수점)
4바이트-3.402823E38부터 -1.401298E-45까지(음수값). 1.401298E-45부터 3.402823E38까지(양수값)
Double
(배정도 부동 소수점)
8바이트-1.79769313486232E308부터
-4.94065645841247E-324까지(음수값). 4.94065645841247E-324부터 1.79769313486232E308까지(양수값)
Currency
(정수 값 잘림)
8바이트-922,337,203,685,477.5808부터 922,337,203,685,477.5807까지
Decimal14바이트+/-79,228,162,514,264,337,593,543,950,335(소수점 이하 없음);
+/-7.9228162514264337593543950335(숫자의 오른쪽으로부터 28번째); +/-0.0000000000000000000000000001(0이 아닌 최소 숫자)
Date8바이트100년 1월 1일부터 9999년 10월 31까지
Object4바이트모든 개체 참조
String
(가변 길이)
10바이트 +문자열 길이0부터 약 20억까지
String
(고정 길이)
문자열 길이1부터 약 65,400까지
Variant
(숫자)
16바이트Double형 범위 내의 모든 숫자
Variant
(문자)
22바이트 + 문자열 길이변수 길이 String과 같은 범위
사용자 정의 형식
(Type 사용)
요소가 사용하는 숫자해당 데이터 형식의 범위값과 각 요소의 범위값이 같음

메모 모든 데이터 형식의 배열은 20바이트 + 각 차원당 4바이트 + 데이터 자체가 차지하는 바이트 만큼의 메모리를 차지하며, 각 항목의 수에 항목의 크기를 곱하면 데이터가 차지하는 메모리의 용량을 구할 수 있습니다. 예를 들면 2바이트를 차지하는 4개의 Integer 데이터 요소로 된 1차원 배열은 8바이트를 차지합니다. 데이터의 8바이트와 오버헤드 24바이트를 더하면 배열에 필요한 메모리 양은 32바이트가 됩니다.

Variant는 배열 자체보다 12바이트를 더 차지하는 배열을 가지고 있습니다.

메모 StrConv 함수는 문자열 데이터를 다른 형식의 문자열 데이터로 변환할 때 사용된다.

도움말 끝

<개인 생각>

개인적으로 실수는 Double을, 엑셀의 셀을 참조하기 위한 행, 열 관련 변수는 Long으로 하는 것이 좋다.

[VBA]Do-Loop문의 이해

이 함수들을 호출하는 서브 프로시저는 다음과 같다.

위 코드에는 불필요한 중복이 있다. 어떻게 할 것인가?

[VBA]For-Next문의 이해

반복 횟수만큼 실행문을 반복할 때 사용한다.

Option Explicit

Function GetMean(Score() As Double) As Double
Dim L As Long
Dim U As Long
Dim i As Long
Dim sum As Double

L = LBound(Score, 1)
U = UBound(Score, 1)

sum = 0
For i = L To U
sum = sum + Score(i)
Next i

GetMean = sum / (U – L + 1)
End Function

이상은 평균을 구하는 함수이다. 다음은 분산(Variance)를 구하는 함수이다.

Function GetVariance(Score() As Double) As Double
Dim L As Long
Dim U As Long
Dim i As Long
Dim sum As Double
Dim avg As Double

L = LBound(Score, 1)
U = UBound(Score, 1)

avg = GetMean(Score)

sum = 0
For i = L To U
sum = sum + (Score(i) – avg) ^ 2
Next i

GetVariance = sum / (U – L + 1)
End Function

다음은 표준편차를 구하는 함수이다.

Function GetStandardError(Score() As Double) As Double
Dim L As Long
Dim U As Long
Dim i As Long
Dim sum As Double
Dim avg As Double

L = LBound(Score, 1)
U = UBound(Score, 1)

avg = GetMean(Score)

sum = 0
For i = L To U
sum = sum + (Score(i) * Score(i))
Next i

GetStandardError = (sum / (U – L + 1)) – (avg * avg)
End Function

위에는 오류 코드(버그)가 숨겨 있다. 잘 찾아보아 보세요.

[VBA]If문과 Select문의 비교

프로그래밍의 가장 기본 중의 하나가 If문에 의한 실행의 분기일 것이다.

단순한 분기에서부터 다중 분기까지 가능하다.

<문제>

성적 점수에 따라 평점(A, B, C, D, F 등으로 표시되는 것. 학점하고 구분)을 반환하는 함수를 작성하라.

1) If문을 이용한 함수 1

조건이 굉장히 복잡하게 보이지만, 계산 논리를 한번에 알아볼 수 있다. 이렇게 다중 분기하는 경우 다음과 같이 Select문을 생각해 볼 수 있다.

2)Select문을 이용한 함수

이 함수는 심각한 문제를 안고 있다. 즉, 85.5와 같은 점수에 대해서는 “F”를 줄 수 있기 때문이다. Case 간에 비어있는 범위가 생길 수 있다는 점에서 유의해야 한다.

3)다시 If문을 이용한 함수

처음 If문을 간결하게 다시 작성하면 다음과 같이 할 수 있다. 여기서 중요하게 볼 것은 처음 조건문은 그 다음 조건문의 필터 역할을 한다는 것이다. 예를들어 85.5점은 처음 조건문부터해서 두번째 조건문까지 만족하지 않는다. 그러나, 세번째 조건문에서는 통과하여 평점을 받게 된다. 즉, 세번째 조건문에 ’90보다 작다’는 필터가 두번째의 조건문을 통해서 만들어진 것이다.

주의사항 : 제대로 된 필터 기능을 사용하고자 한다면, 점수가 고득점부터 저득점으로 내려오든, 저득점에서 고득점으로 올라가든, 일정한 순서로 조건문을 배열해야 한다는 점이다.

정령 Select문으로는 해결할 수 없는가?
이것을 Select문으로 바꾸면 다음과 같이 될 것이다.

4) 다시 Select문을 이용한 함수

Is라는 키워드를 사용하면 다음과 같이 작성할 수 있다.

이 방법도 Case 점수가 일정한 순서로 배치되어 가능하다는 점을 유의해야 한다.

[Excel]Range와 Cells

1)  Range 이해

  • Range(“K7”) –> K7 셀 (단일 셀)
  • Range(“A3:B4”) –> A3:B4 영역 (단일 영역)
  • Range(“A1,A4,A5,B4,K3,K5,K7”) –> A1,A4,A5,B4,K3,K5,K7 셀 (다중 셀)
  • Range(“A1:A5, K3:K7”) –> A1:A5, K3:K7 영역 (다중 영역)
  • Range(“B:B”) –> B열 전체 (단일 열)
  • Range(“2:2”) –> 2행 전체 (단일 행)
  • Range(“B:K”) –> B:K열 전체 (다중 열)
  • Range(“3:4”) –> 2:5행 전체 (다중 행)
  • Range(“B:B, E:E, D:D”) –> B, E, D 열 전체
  • Range(“1:1, 3:3, 4:4”) –> 1, 3,4행 전체
  • Range(Range(“B1”), Range(“K3”)) –> B1:K3 영역
  • Range(Cells(1,2), Cells(3,4)) –> B1:D3 영역

2) Cells

  • Cells(3,4) –> Range(“D3”)와 같음
  • Cells는 행(3), 열(4)의 순서이고 Range는 열(D), 행(3)의 순서임

[VBA]TwipsPerPixel

비주얼 베이직 6.0이하에서는 화면의 크기를 트윕(twip)으로 표시한다.

VBA에서는 없기에 다음과 같은 함수를 이용해야 한다. (source : MSDN)

공기상태 계산 엑셀 프로그램(Visual Air 2010)

건축환경 및 설비 분야에서 공기의 상태값(psychrometrics)을 아는 것이 매우 중요하다.

(Excepted from Wikipedia) Although the principles of psychrometry apply to any physical system consisting of gas-vapor mixtures, the most common system of interest is the mixture of water vapor and air, because of its application in heating, ventilating, and air-conditioning and meteorology. In human terms, our thermal comfort is in large part a consequence of not just the temperature of the surrounding air, but (because we cool ourselves via perspiration) the extent to which that air is saturated with water vapor.
공기 상태를 계산하는 엑셀 프로그램을 여기에 올린다.

사용전 엑셀 보안 설정
– 도구 -> 매크로 -> 보안 -> “보안 수준” 탭에서 “보통”을 선택 (Excel 2003이하)

사용법
1) 시트 안에 있는 “계산기” 단추를 누른다.
사용자 삽입 이미지2) 알고 있는 두 값을 선택해서 그 값을 입력한 다음 “계산” 단추를 누른다.
예) 건구온도 20도, 상대습도 55%를 입력해서 나머지 값을 구하고자 할 경우 다음과 같이 입력한다.
사용자 삽입 이미지
3) 계산결과는 엑셀 시트와 대화상자 동시에 출력이 된다.
사용자 삽입 이미지4) 첨부 엑셀 파일(You can download the following file)

psychrometrics.xls

[프로그램등록] Visual Air (software for psychrometic chart)

공기의 물리적인 상태값은 공기와 관련한 수치계산의 기본이 된다. 공조 설비에서 취급하는 공기는 습공기이기 때문에, 공기조화에 관한 계산은 습공기의 성질을 충분히 파악한 상태에서 가능하다. 이런 습공기의 상태값에는 밀도, 수증기압, 절대습도, 상대습도, 노점온도, 습구온도 등과 함께 습공기가 안고 있는 열량인 엔탈피가 있다.
습공기의 상태값은 표로 제시되기도 하지만, 모든 경우에 대한 자료를 주지 못한다. 이에 가장 기본적인 자료로서 습공기선도를 사용하게 되는데, 습공기의 상태값을 구하는데 사용됨과 동시에 공기조화 프로세스를 설계, 해석하는데도 사용된다.
따라서, 습공기에 대한 이론적인 것을 살펴보고, 상태값을 계산하는 함수와 함께 습공기선도를 그리는 함수를 작성하는 프로그램을 만들었다.
프로그램 제작은 사용자 인터페이스가 좋은 윈도우 환경에서 쓸 수 있게 Visual Basic 6.0 Professional Version으로 하였다.

사용자 삽입 이미지
Visual Air 실행 화면

이 프로그램에 대한 등록증은 아래와 같다.
사용자 삽입 이미지

[VB]코드 생성기

프로그래밍을 하다보면 기계적으로 반복해야 할 일들이 생긴다. 이런 일들로 일일이 타이핑을 한다는 것은 매우 지루하고 따분한 일이다. 그래서 코드을 자동으로 생성하도록 할 필요가 생긴다.
곧 개발환경의 매크로를 이용하거나, Perl과 같은 문자열 처리기를 통하여 코드를 자동처리하도록 한다.
다음의 사이트도 그 중의 하나이다.

http://kimsk99.springnote.com/pages/63531
– 미리 지정된 텍스트를 현재 커서위치(실렉트된 것)에 삽입하는 매크로
– 현재 편집중인 파일과 같은 이름이고 확장자만 cpp <-> h 로 바뀐 파일을 열어주는 매크로

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8423&ref=8423
– 이름과 날짜를 입력
– 수평 라인 주석을 입력

http://serious-code.net/tc/tag/Visual%20Studio%20Macro
– 선택된 라인들에서 중복된 라인들은 삭제하고 나머지를 정렬하기
– 자동으로 getter/setter생성하기

Using Visual Studio .NET Macros

  • 속성을 위한 매크로
사용자 삽입 이미지
Private 변수를 Property Procedure로 확장하기

[VBA]VBA에서 엑셀함수 사용하기

엑셀 함수는 VBA 함수보다 훨씬 다양한 분야에 많은 함수들을 보유하고 있다.
앞서 살펴본 것처럼, 삼각함수 분야에도 많은 역함수를 보유하고 있다. 더군다나 스프레드시트 프로그램으로서 당연히 갖추어야 하는 함수도 많이 보유하고 있다. 예를 들면 다음과 같다.

첫줄은 원주율을 참조한 것이고, 둘째줄은 코사인 역함수를 호출하여 사용한 것이다.
셋째줄은 워크시트 내의 특정범위를 설정한 것이며, 네째줄에서 이 범위에 대한 합을 엑셀함수를 이용하여 구했다.

또 다른 방법으로는 Evaluate 메소드를 사용하는 것이다.