엑셀 VBA 강좌(6): 엑셀 VBA 언어 기본-변수
이번 글은 엑셀 VBA 언어 기본 중 변수에 대한 내용을 살펴본다.
이전 글에서 이어지는 내용이다.
엑셀 VBA 강좌(5): 엑셀 파일 확장자, VBE, 글꼴 설정
3. 엑셀 VBA 언어 기본
3.1. 변수
변수 선언과 binding 방식에 대해 살펴본다.
3.1.1. 변수 선언
다음과 같은 구문으로 변수를 선언한다.
'변수 선언 문법 Dim <변수명> [As Type]
Visual Basic은 변수를 선언하지 않고 바로 사용할 수 있고, 선언하더라도 Type을 지정하지 않을 수 있다.
Dim t, x
위와 같이 t와 x 변수를 선언하면서 Type은 지정하지 않아도 문제가 없다.
하지만, 오류나 버그 발생 가능성을 줄이고 코드를 읽기 쉽게 하기 위하여 다음과 같은 사항을 지키는 것이 좋다.
- 변수는 반드시 선언하고 사용한다. (Option Explicit 권장)
- Type도 반드시 지정한다.
- 변수명에는 type을 쉽게 알아볼 수 있도록 type의 약어를 prefix로 사용하는 헝가리안 표기법을 적용한다.
'문자열 Title Dim sTitle As String
- 변수명, 프로시져명, 함수명 등의 명칭에 한글을 사용해도 전혀 문제가 없으니, 변수명을 정하기 어렵거나 가독성을 높일 필요가 있다면 한글 명칭을 적극 사용한다.
주로 사용하는 type, prefix는 다음과 같다.
Prefix | Type | Length | 참고 |
---|---|---|---|
s | String | 10 + 문자열길이 | 약 20억개의 문자 표현 가능 |
i | Integer | 2 Byte | 한계값: -32,768 ~ 32,767 |
l | Long | 4 Byte | 한계값: -2,147,483,648 ~ 2,147,483,647 |
b | Boolean | 2 Byte | 참(True), 거짓(False) |
o | Object | Workbook, Worksheet, Range, Collection 등의 객체 |
위 Prefix를 사용하여 변수를 선언하는 예시는 다음과 같다.
Dim s단어 As String Dim b단어발견 As Boolean Dim oTargetBook As Workbook Dim oTargetSht As Worksheet
3.1.2. 변수 Early binding, Late binding
변수 type이 선언할 때 정해지는 방식을 Early binding이라고 하고, 실행할 때 정해지는 방식을 Late binding이라고 한다. 두 방식의 개념, 예시, 권장사항, 장점, 단점을 다음 표에 정리하였다.
구분 | Early binding | Late binding |
---|---|---|
개념 | 변수 선언시 Type을 지정하는 방법 기본 제공 Type이 아닌 경우 해당 Type을 참조 추가하고 Type 지정 | 실행시 Type이 지정되는 방법 |
예시 | Dim s단어 As String Dim oRecordSet As ADO.RecordSet | Dim s단어 Dim oRecordSet As Object |
권장사항 | 대부분의 경우 권장됨 | 꼭 필요한 경우에만 사용 (Object type에만 한정) |
장점 | 코드 작성시 자동완성, 동적 도움말 지원 (편리) 컴파일시 Type이 결정되므로 성능에 유리함 | 실행하는 컴퓨터에 참조 Library가 없으면 Late binding된 코드 부분만 실행 되지 않음 |
단점 | 실행하는 컴퓨터에 참조 Library가 없으면 전체가 실행 되지 않음 | 코드 작성시 자동완성 지원 안됨(불편) 실행시 Type이 결정되고 동적으로 binding 되므로 성능이 상대적으로 나쁨 |
각 방식의 예시 코드를 살펴보자. Outlook으로 메일의 수신자, 제목, 내용을 작성하고 화면에 표시하는 간단한 코드이다.
Early binding 방식의 예시 코드는 다음과 같다.
Sub SendOLMail_EarlyBound() ' declare variables for the Application and Mailitem objects Dim oAPP As Outlook.Application Dim oItem As Outlook.MailItem ' instantiate the Application Set oAPP = New Outlook.Application ' create a new email Set oItem = oAPP.CreateItem(olMailItem) ' set basic properties and display the email With oItem .To = "foo@bar.com" .Subject = "this is a test" .Body = "nothing to see here" .Display End With End Sub
oApp, oItem 변수는 각각 Outlook.Application type, Outlook.MailItem type으로 선언시 지정되었다. 이 경우는 다음과 같이 Outlook library를 참조 추가해 줘야 한다.
“VBE > 도구 > 참조” 메뉴를 열고 “사용 가능한 참조”에서 “Microsoft Outlook 16.0 Object Library”에 체크 표시하고 확인 버튼을 클릭한다.
다시 참조 메뉴를 열었을 때 다음과 같이 되어있어야 한다.
이 VBA 코드가 저장된 매크로 파일(.xlsm, 또는 .xlsb)을 Outlook 16이 설치되어 있지 않은 PC에 복사하고 실행하면 type을 찾을 수 없다는 오류가 발생한다.
Late binding 방식의 예시 코드는 다음과 같다.
Sub SendOLMail_LateBound() Dim oAPP As Object Dim oItem As Object ' need to declare this constant as it has no meaning without ' the reference set to the Outlook library Const olMailItem As Long = 0 ' instantiate the Application - cannot use New without a reference ' so we must use CreateObject Set oAPP = CreateObject("Outlook.Application") '이후 코드는 동일 ' create a new email Set oItem = oAPP.CreateItem(olMailItem) ' set basic properties and display the email With oItem .To = "foo@bar.com" .Subject = "this is a test" .Body = "nothing to see here" .Display End With End Sub
oApp, oItem 변수는 선언시 Object type으로 지정되었고, 개체를 생성하는 방법이 다르다.
10번째 줄 다음 코드로 개체를 생성한다.
Set oAPP = CreateObject(“Outlook.Application”)
CreateObject 함수에 대한 상세 설명은 다음 URL을 참조한다.
위 URL에서 일부를 발췌하여 남겨둔다.
Syntax
CreateObject(class, [ servername ])
The CreateObject function syntax has these parts:
Part | Description |
class | Required; Variant (String). The application name and class of the object to create. |
servername | Optional; Variant (String). The name of the network server where the object will be created. If servername is an empty string (“”), the local machine is used. |
The class argument uses the syntax appname.objecttype and has these parts:
Part | Description |
appname | Required; Variant (String). The name of the application providing the object. |
objecttype | Required; Variant (String). The type or class of object to create. |
이 VBA 코드가 저장된 매크로 파일(.xlsm, 또는 .xlsb)을 Outlook 16이 설치되어 있지 않은 PC에 복사하고 실행하면 Early binding과 마찬가지로 type을 찾을 수 없다는 오류가 발생한다. 차이점은, Early binding 방식은 참조 library가 없으면 처음부터 모든 코드가 실행되지 않고, Late binding은 다른 코드는 동작하고 CreateObject가 포함된 코드(프로시져, 함수)만 실행되지 않는다는 점이다.
여기까지 변수 선언과 binding 방식에 대해 살펴보았다. 다음에는 VBA 언어의 문법(Syntax)에 대해 설명하겠다.
<< 관련 글 목록 >>
- 엑셀 VBA 강좌를 시작합니다. (강좌예고, feat.엑셀 VBA를 권장하는 이유)
- 엑셀 VBA 강좌(1): 엑셀 VBA 개요
- 엑셀 VBA 강좌(2): 엑셀 VBA 기초
- 엑셀 VBA 강좌(3): 엑셀 Object Model
- 엑셀 VBA 강좌(4): 엑셀 Object Model 다루기
- 엑셀 VBA 강좌(5): 엑셀 파일 확장자, VBE, 글꼴 설정
- 엑셀 VBA 강좌(6): 엑셀 VBA 언어 기본-변수
- 엑셀 VBA 강좌(7): 엑셀 VBA 언어 기본-문법(Syntax)
- 엑셀 VBA 강좌(8): 엑셀 VBA 언어 기본-자료형(Data type), 자료구조(Data structure)
- 엑셀 VBA 강좌(9): 엑셀 VBA How-To
- 엑셀 VBA 강좌(10): 엑셀 VBA로 개발하여 사용중인 도구
- 엑셀 VBA 강좌 전체 목차