엑셀 & VBA/엑셀 VBA 강좌

엑셀 VBA 강좌(6): 엑셀 VBA 언어 기본-변수

ProDA 2021. 7. 17.

이 글은 새로운 블로그로 옮겼습니다. 5초후 자동으로 이동합니다.

▶ 새로운 블로그 주소: https://prodskill.com/

▶ 새로운 글 주소: https://prodskill.com/excel-vba-lecture-6-variable/

이번 글은 엑셀 VBA 언어 기본 중 변수에 대한 내용을 살펴본다.

 

이전 글에서 이어지는 내용이다.

엑셀 VBA 강좌(5): 엑셀 파일 확장자, VBE

 

엑셀 VBA 강좌(5): 엑셀 파일 확장자, VBE

이전 글에서 이어지는 내용이다. 엑셀 VBA 강좌(4): 엑셀 Object Model 다루기 엑셀 VBA 강좌(4): 엑셀 Object Model 다루기 이전 글에서 이어지는 내용이다. 엑셀 VBA 강좌(3): 엑셀 Object Model 엑셀 VBA..

prodtool.tistory.com

 


목차


     

    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 되므로 성능이 상대적으로 나쁨

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

     

    Use early binding and late binding in Automation - Office

    Explains the types of binding available to Automation clients, and weighs both sides of each method.

    docs.microsoft.com

     

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

    Early binding vs. Late binding 예시 코드
    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

     

    CreateObject function (Visual Basic for Applications)

    CreateObject function In this article --> Creates and returns a reference to an ActiveX object. Syntax CreateObject(class, [ servername ]) The CreateObject function syntax has these parts: Part Description class Required; Variant (String). The application

    docs.microsoft.com

     

    위 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)에 대해 설명하겠다.

     

    댓글

    💲 추천 글