엑셀 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는 다음과 같다.

PrefixTypeLength참고
sString10 + 문자열길이약 20억개의 문자 표현 가능
iInteger2 Byte한계값: -32,768 ~ 32,767
lLong4 Byte한계값: -2,147,483,648 ~ 2,147,483,647
bBoolean2 Byte참(True), 거짓(False)
oObject Workbook, Worksheet, Range, Collection 등의 객체
Visual Basic 주요 변수 type, prefix

위 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 bindingLate 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 되므로 성능이 상대적으로 나쁨
변수 Early binding, Late binding 비교

* 참조: https://docs.microsoft.com/en-us/previous-versions/office/troubleshoot/office-developer/binding-type-available-to-automation-clients

각 방식의 예시 코드를 살펴보자. Outlook으로 메일의 수신자, 제목, 내용을 작성하고 화면에 표시하는 간단한 코드이다.

Early binding vs. Late binding 예시 코드

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를 참조 추가해 줘야 한다.

필요한 type library 참조 추가
필요한 type library 참조 추가

“VBE > 도구 > 참조” 메뉴를 열고 “사용 가능한 참조”에서 “Microsoft Outlook 16.0 Object Library”에 체크 표시하고 확인 버튼을 클릭한다.

다시 참조 메뉴를 열었을 때 다음과 같이 되어있어야 한다.

type library 참조 추가 확인
type 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을 참조한다.

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/createobject-function

위 URL에서 일부를 발췌하여 남겨둔다.


Syntax

CreateObject(class, [ servername ])

The CreateObject function syntax has these parts:

PartDescription
classRequired; Variant (String). The application name and class of the object to create.
servernameOptional; 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:

PartDescription
appnameRequired; Variant (String). The name of the application providing the object.
objecttypeRequired; 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)에 대해 설명하겠다.


<< 관련 글 목록 >>

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

ko_KR한국어