본문 바로가기
  • 반가워요 : )
엑셀

VBA의 데이터 타입과 변수

by 교육의 기울기 2024. 8. 11.
반응형

변수란 무엇인가? 그리고 왜 필요한가?


프로그래밍을 시작할 때 가장 먼저 배우는 개념 중 하나가 바로 변수입니다. 이번 글에서는 변수란 무엇인지, 왜 필요한지에 대해 알아보고, 데이터 유형과 변수 선언, 변수의 범위(scope)와 같은 핵심 개념들을 살펴보겠습니다. 또한, 변수 사용 시 유용한 몇 가지 팁도 공유할 예정입니다.

 

목차

    변수란 무엇인가?

    변수는 간단히 말해 VBA(Visual Basic for Applications)에서 데이터를 저장할 수 있는 공간입니다. 이 공간을 사용하면 특정 값을 메모리에 저장해 두고, 코드의 다른 곳에서  재사용할 수 있습니다. 예를 들어, 아래 코드를 보면 변수의 역할을 알 수 있습니다.


    ```vba
    Dim myTitle As String
    myTitle = Range("A1").Value
    ```

    위 코드에서 `myTitle`이라는 변수는 `A1` 셀의 값을 저장합니다. 이후에 이 변수를 여러 번 참조할 수 있습니다. 만약 데이터를 저장하지 않고 매번 셀 주소를 참조해야 한다면, 코드가 복잡해질 뿐만 아니라 유지보수도 어려워집니다.

    변수 선언의 규칙

    vba 변수는 먼저 선언을 해야합니다. 그리고 거기에 데이터 값을 할당하게됩니다. 아래 예시를 통해 알아봅시다.


    VBA 변수 선언 방법

    - Dim 키워드 사용: 변수를 선언할 때 `Dim` 키워드를 사용합니다.


      ```vba
      Dim myText As String
      ```

    위의 변수를 선언할때 따라야할 몇가지 규칙이있습니다.

    1. 공백을 포함할 수 없음 (대신 언더스코어 사용)
    2. 숫자로 시작할 수 없음
    3. 특수 문자 (., !, @, $, &) 사용 불가
    4. 짧고 의미 있는 이름 사용 권장

    변수 이름을 만들때, 마음대로 만들어도되지만, 데이터 타입을 변수이름에 포함하면,

    어떤 데이터 타입인지 알아보기가 쉽습니다. 물론 이는 필수가 아닙니다.

      ```vba
      Dim intAge As Integer  ' Integer 타입의 변수
      Dim strName As String  ' String 타입의 변수
      ```

     

    변수에 값을 할당하기(LET)

    일반 변수 할당에는 Let 문을 사용할 수 있지만, 이는 선택 사항이며 보통 생략됩니다.


    Dim LastRow as Long
    
    LastRow = Rows.Count ' 일반적인 할당
    Let LastRow = Rows.Count ' 선택적으로 사용

    위의 '일반적인 할당', '선택적으로 사용' 코드는 같은 코드입니다.

     

    VBA 여러가지 변수 한번에 선언하는법


    ```vba
    Dim firstRow As Long, i As Long, myText As String
    ```

    VBA 배열 선언하는법

    배열은 공통된 특성을 가진 변수 그룹을 의미합니다. 예를 들어, 월별 데이터를 배열로 선언할 수 있습니다.

    여기 있는 예시말고도, 배열에 관한 선언은 따로 목차를 만들정도로 공부할게 많습니다.


      ```vba  1차원 배열: 한 줄로 구성된 배열
      Dim myMonth(1 To 12) As String
      myMonth(1) = "Jan"
      myMonth(2) = "Feb"
      ```
    
      ```vba 2차원 배열: 행과 열로 구성된 배열
      Dim MonthSales(1 To 12, 1 To 3) As Variant
      ```

    VBA 상수 선언

    VBA 에서 변경되지 않는 값이 필요할경우 다음과 같이 변수를 선언합니다.


    ```vba
    Const myScenario As String = "Actual"
    Const profitCenter As Long = 1001
    ```

    이와 같은 방식으로 변수를 선언하고 사용하면 VBA 코드를 더 효율적이고 오류 없이 작성할 수 있습니다.

    변수 선언과 범위(scope)

    변수를 선언할 때는 `Dim` 키워드를 사용합니다. 선언된 변수는 특정 범위 내에서만 사용할 수 있는데, 이를 변수 범위(SCOPE)라고 합니다. 변수의 범위는 다음과 같이 나뉩니다.

    1. 지역 변수(Local Variable): 특정 프로시저 내에서만 사용할 수 있습니다.
    2. 모듈 수준 변수(Module-Level Variable):** 모듈 내의 모든 프로시저에서 사용할 수 있습니다.
    3. 전역 변수(Global Variable): 프로젝트 전체에서 사용할 수 있습니다.

    예를 들어, 아래 코드는 변수의 범위를 설정하는 방법을 보여줍니다.


    ```vba
    ' 모듈 수준 변수
    Private myModuleVar As String
    
    Sub ExampleProcedure()
        ' 지역 변수
        Dim myLocalVar As Integer
        myLocalVar = 10
    End Sub
    ```

    대입문과 할당의 이해


    변수에 값을 저장할 때 사용하는 `=` 기호는 대입 연산자입니다.


    ```vba
    myTitle = "Hello"
    ```


    위 코드에서 `=`는 오른쪽 값을 왼쪽 변수에 할당하는 역할을 합니다. 이는 수학에서의 "같음"과는 다른 개념이므로 혼동하지 않도록 주의해야 합니다.

    변수 사용의 장점

    변수를 사용하는 이유는 다음과 같습니다.

    1. 코드 가독성 향상
       변수에 의미 있는 이름을 사용하면 코드가 더욱 직관적이고 읽기 쉬워집니다. 예를 들어, `x` 대신 `totalSales` 같은 이름을 사용하면 그 변수가 무엇을 나타내는지 쉽게 알 수 있습니다.

    2. 코드 유지보수 용이성  
       변수를 사용하면 데이터를 저장하는 코드 한 곳만 수정하면 됩니다.  아래 코드를 살펴보겠습니다.


       ```vba
       Dim myTitle As String
       myTitle = Range("A1").Value
       Range("B1").Value = myTitle
       Range("C1").Value = myTitle
       ```


       만약 데이터를 `B1`, 'C1' 데이터를 변경하고 싶다면, `myTitle` 변수의 초기값만 수정하면 됩니다.

    3. 복잡한 작업 처리 가능
       루프나 조건문과 같은 복잡한 로직을 처리할 때 변수를 활용하면 훨씬 더 간결하고 효율적인 코드를 작성할 수 있습니다.

    VBA 객체 변수 다루기 

    객체라는 데이터 타입을 이해하기전에, 일반적인 데이터 타입을 한번더 알아보고 갑시다. VBA에는 문자열, 정수, 더블, 날짜와 같은 기본 데이터 타입이 있습니다. 이러한 데이터 타입은 변수를 생성할 때 사용됩니다.

    ```vba
    Dim Score As Long
    Dim Price As Double
    Dim Firstname As String
    Dim Startdate As Date
    
    Score = 45
    Price = 24.55
    Firstname = "John"
    Startdate = #12/12/2016#```



    기본 VBA 변수는 값 저장이라는 단일 목적만을 가집니다. 반면, 객체는 더 복잡한 기능을 수행할 수 있습니다. 예를 들어, Collection 객체는 항목을 추가, 제거하고 항목의 개수를 얻을 수 있습니다.

     

    객체는 하나의 단위로 취급될 수 있는 코드와 데이터의 조합입니다. 객체(objcet)는 컨트롤 또는 양식과 같은 응용 프로그램의 일부가 될 수 있습니다. 즉, 객체는 하나의 데이터만 다루는 형태가아니라 데이터를 컨트롤 할수있는 하나의 데이터의 형태라고 할 수 있습니다. 예를들어, worksheet, range, workbook은 객체로서, 단순한 데이터가 아닌, 데이터와 관련된 어떠한 일을 할수있죠. 아래 링크를 통해서 천천히 읽어보시는 것도 좋습니다. 어쨌든, 데이터의 형태중에는 객체라는것이 있다는 것을 알아두시고, 아래에서는 이러한 객체를 코드로 어떻게 다루는지 알아보겠습니다. 

     

     

    Creating object variables (VBA)

    Office VBA reference topic

    learn.microsoft.com

     

     

    Understanding objects, methods, properties, and events (VBA)

    Office VBA reference topic

    learn.microsoft.com

    객체 데이터타입 변수 선언의 예시

     변수는 단순 데이터, 문자열 타입만 담는 것이 아니라 객체라는 데이터도 담을 수 있습니다. 자주 사용하는 객체로는 Workbook 객체,Worksheet 객체, Range 객체 등이 있습니다. 이를 선언하는 방법은 다음과 같습니다.


    Dim NewSheet As Worksheet
    Set NewSheet = ActiveSheet

    여기서 dim은 다른 데이터 타입과 같이 선언할수있습니다. 다만 데이터를 할당 할때는 Set을 사용하셔야합니다.

    객체 변수에 값을 할당할 때는 Set 문을 사용해야 합니다. Set 문을 사용하지 않으면 오류가 발생합니다.
    (객체변수가 아닌 변수는 SET을 사용하지않습니다. LET을 사용하거나, 생략해서 사용할수있습니다.)

     

    객체 변수 활용 예제

    새로운 워크북을 생성하고 이를 객체 변수에 할당하는 예제입니다.


    Dim NewBook As Workbook
    Set NewBook = Workbooks.Add
    
    Dim NewSheet As Worksheet
    Set NewSheet = NewBook.Sheets(1)
    
    NewSheet.Range("A1").Value = "New one"

    위 코드에서 새로운 워크북을 생성하고 첫 번째 시트를 변수에 할당한 후, A1 셀에 값을 입력합니다.

     

    Range 객체 다루기

    특정 범위를 지정하고 서식을 변경하는 예제입니다.


    Dim NewRange As Range
    Set NewRange = ThisWorkbook.Worksheets("Sheet1").Range("B5:D5")
    
    NewRange.Font.Bold = True
    NewRange.Interior.Color = RGB(255, 0, 0) ' 빨간색

    데이터 유형의 역할

    VBA에서 변수는 데이터 유형(data type)을 가집니다. 데이터 유형은 변수에 저장할 수 있는 데이터의 종류를 지정합니다. 예를 들어, 숫자를 저장하려면 `Integer` 또는 `Double`을 사용하고, 텍스트를 저장하려면 `String`을 사용합니다. 데이터 유형을 명확히 지정하면 메모리를 효율적으로 사용할 수 있으며, 코드 실행 속도도 향상됩니다.

    이름 메모리양 데이터 범위
    byte 1byte 0 to 255
    Integer 2 bytes -32,768 to 32,767
    Long 4 bytes -2,147,483,648 to 2,147,483,647
    Single 4 bytes -3.402823E+38 to 3.402823E+38
    Double 8 bytes -1.79769313486232E+308 to 1.79769313486232E+308
    Currency 8 bytes -922,337,203,685,477.5808 to 922,337,203,685,477.5807
    Decimal 14 bytes Varies depending on the precision
    String 10 bytes + Variable length, depends on the string size
    Boolean 2 bytes True or False
    Date 8 bytes January 1, 100 to December 31, 9999
    Object 4 bytes Pointer to an object
    Variant (number) 16 bytes Depends on the data stored
    Variant (string) 22 bytes Depends on the data stored

     

    vba의 데이터에는 다음과 같은 목록이있습니다.

     

    • Byte: 작은 숫자를 저장할 때 사용합니다. 메모리 공간은 1바이트입니다.
    • Integer: 중간 크기의 정수를 저장할 때 사용합니다. 메모리 공간은 2바이트입니다.
    • Long: 큰 크기의 정수를 저장할 때 사용합니다. 메모리 공간은 4바이트입니다.
    • Single: 단일 정밀도의 부동 소수점 숫자를 저장할 때 사용합니다. 메모리 공간은 4바이트입니다.
    • Double: 이중 정밀도의 부동 소수점 숫자를 저장할 때 사용합니다. 메모리 공간은 8바이트입니다.
    • Currency: 통화 값을 저장할 때 사용합니다. 메모리 공간은 8바이트입니다.
    • Decimal: 소수점 이하의 높은 정밀도가 필요한 숫자를 저장할 때 사용합니다. 메모리 공간은 14바이트입니다.
    • String: 문자열을 저장할 때 사용합니다. 메모리 공간은 문자열의 길이에 따라 달라지지만, 기본 10바이트입니다.
    • Boolean: 참(True) 또는 거짓(False)을 저장할 때 사용합니다. 메모리 공간은 2바이트입니다.
    • Date: 날짜와 시간을 저장할 때 사용합니다. 메모리 공간은 8바이트입니다.
    • Object: 객체에 대한 포인터를 저장할 때 사용합니다. 메모리 공간은 4바이트입니다.
    • Variant: 다양한 유형의 데이터를 저장할 수 있는 범용 변수입니다. 숫자를 저장할 때는 16바이트, 문자열을 저장할 때는 22바이트의 메모리를 사용합니다.

    vba에서는 변수에 특정 메모리 유형을 선언하면, VBA의 메모리를 사용할수있습니다.

     

    기본적으로, 변수 선언시, 데이터타입을 지정하지않는다면, VBA는 'Variant라는 데이터 유형을 할당합니다. 이 데이터 유형은 어떤 데이터 유형이든지 다 커버할수있습니다.(텍스트, 숫자, 날짜등 여러가지 유형을 처리할수있습니다.)

    하지만 16바이트 이상의 메모리를 사용하기때문에, 꼭 필요할때만 사용하는것이좋습니다.

     

    그렇다면 작은숫자는 어떤 데이터 유형을 사용해야할까요? (예를들어, 0~255 범위의 숫자를 사용한다면). 사용할 변수가 작은 숫자일 경우그 변수를 byte로 선언할 수 있습니다. byte는 1바이트의 메모리 공간을 차지합니다. 위의 테이블을 보시면 바이트범위에 숫자가 들어가기때문에 적절한 데이터 유형이라고 할수있습니다.

    이번에는 각 데이터 유형에는 범위에 대해서 이야기해보겠습니다. 일반적으로, 데이터유형의 사용되는 메모리가 작을수록 범위도 작아집니다. 예를 들어, byte의 범위는 0~255입니다. 만약 260이라는 숫자를 byte로 선언한 변수에 저장하려고 하면 VBA 오류가 발생하게 됩니다. byte의 범위에서 벗어나기때문입니다.

     

    대신 이경우에는 integer를 사용한다면, 260을 저장할수있습니다.  integer는 2바이트로서, 훨씬 큰 범위의 숫자를 저장할수있기때문입니다. 이와 같이, 자신이 사용할 숫자의 범위를 보고 데이터의 유형을 정하는것이 안전한 코드를 만들수있습니다. 팁이있다면 다음과 같습니다.

     

    1. 엑셀 모든 행을 처리하고 싶다면, long을 사용하세요. ( 엑셀행개수는 1048576개입니다.)
    2. True of False 데이터를 처리한다면, 불리안 데이터를 사용하세요.
    3. double은 소수점이 있는 데이터, 정밀한 데이터를 원한다면 사용하는게 좋습니다.
    4. string은 텍스트를 사용한다면 사용하세요.
    5. object는 range, worksheet, workbook등을 위해서 사용하시면 됩니다.

    VBA Option Explicit 사용하는 이유


    `Option Explicit`를 사용하면 VBA 코드 내의 변수 선언을 강제하여 코드의 오류를 줄일 수 있습니다. 변수 이름을 잘못 입력했을 때, VBA가 이를 감지하여 오류 메시지를 표시합니다.
    `Option Explicit`를 사용하지 않으면 오타나 선언되지 않은 변수로 인한 오류를 찾기 어려워집니다.


    ```vba
    Option Explicit
    
    Dim lastRow As Long
    lastRow = Rows.Count
    ```



    VBA Option Explicit 설정하는법


    1. `도구` 메뉴 선택
    2. `옵션` 선택
    3. `변수 선언 요구` 체크

    이렇게 설정하면 새 모듈 생성 시 자동으로 `Option Explicit`가 추가됩니다.

     

     

    결론

    변수는 프로그래밍의 기본이자 필수 요소입니다. 올바르게 사용하면 코드의 가독성과 유지보수성을 높일 수 있을 뿐 아니라, 복잡한 작업도 쉽게 처리할 수 있습니다. 변수의 선언, 데이터 유형, 그리고 변수 범위를 잘 이해하고 활용하는 것이 중요합니다. 

    반응형

    댓글