• 최초 작성일: 2000-12-22
  • 최종 수정일: 2026-09-30
  • 조회수: 14 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 사용자 정의 변수에 대하여

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 사용자정의 변수(User-defined Type Variable)에 대해 알아보도록 하겠습니다. 사용자정의 변수에 대해서는 얼마 전에도 한번 소개해 드린 기억이 있습니다만 중요한 것이니까 이번 기회에 잘 정리해서 내 것으로 만들어 두시기 바랍니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

사용자 정의 변수에 대하여

핵심 요약: 사용자 정의 변수

Type 문으로 여러 변수를 하나로 묶은 사용자 정의 형식을 만들고, 배열로 선언하여 각 행의 자료를 체계적으로 관리합니다.

  • 1단계: 모듈 선언부에 Type ~ End Type으로 형식을 정의합니다.
  • 2단계: Dim 변수명() As 형식명으로 동적 배열을 선언하고 ReDim으로 크기를 정합니다.
  • 3단계: 변수명(i).항목 형태로 값을 저장하고 꺼내 씁니다.

Step 1: 사용자정의 변수란?

보통 변수는 Integer, String, Date, Single, Long 등과 같이 정해진 타입이 있습니다. 변수란 쉽게 말하자면 (값을 저장해 두는) 그릇입니다. 그런데 그릇에도 여러 가지 종류가 있지요? 큰 가마솥에서부터 간장 종지에 이르기까지 크기에 따라 쓰임새가 다 다릅니다.

그런데 "사용자정의 변수"라는 것은 쉽게 말하자면, 여행갈 때 사용하는 "코펠" 이라고 할 수 있습니다. "여러 형태의 그릇(변수) 여러 개를 한데 합쳐놓은 것" 이지요.

아래의 표를 보시기 바랍니다.

이 예제에서 사용한 표는 다음과 같습니다(Start 셀이 표의 첫 칸이며 이름은 임의로 만든 예시입니다).

이름전화번호주소회사명직책연봉(천원)
김유신222-2222서울시 용산구삼호물산대리30000
권율333-3333서울시 동작구삼도식품사장150000
곱단이444-4444서울시 종로구태평양부장50000
조자룡555-5555서울시 도봉구삼송양행차장45000
성춘향666-6666경기도 고양시남해수산사원20000
심청이777-7777경기도 성남시성남식품경리18000
월매888-8888서울시 양천구삼성부사장85000
향단이999-9999강원도 춘천시대우상무80000
제갈량456-7890서울시 서초구동양건설주임25000
김대교567-8901서울시 양천구남해중공업과장38000

여기에서 이름은 문자열(String) 타입 변수, 전화번호도 문자열(String) 타입 변수, 주소, 회사명, 직책도 문자열(String) 타입 변수, 연봉은 통화형(Currency) 변수이지요?

Step 2: Type 문으로 큰 그릇 만들기

이러한 정보를 담아두기 위한 그릇을 모두 따로 만들어 두는 것이 아니라

Type CustInfo
    strName As String * 10
    strTel As String * 10
    strAddress As String * 30
    strCompany As String * 20
    strRank As String * 10
    curPayment As Currency
End Type

이와 같이 CustInfo라는 큰 그릇을 만들어 두고 그 안에 다시 작은 그릇들을 만들어 두는 것입니다. 그리고 이 큰 그릇은 모듈시트에서 특정 프로시저 내부가 아닌 외부에다 선언을 해 둡니다.

String * 10과 같은 고정 길이 문자열은 값이 짧으면 뒤가 공백으로 채워지므로, 화면에 표시하거나 비교할 때는 Trim으로 공백을 제거하는 것이 좋습니다. 또한 Type 문은 모듈 맨 위(선언부)에 두어야 하며, 최근에는 클래스 모듈을 사용해 같은 목적을 더 유연하게 구현하기도 합니다.

Step 3: 사용자정의 변수 사용하기

코드는 아래와 같습니다.

Sub UserDefinedTypeTest()
    Dim typMyInfo() As CustInfo
    Dim Msg As String
    Dim i As Integer
    Dim intCount As Integer
    Dim intNum As Integer
    Dim curTotalPayment As Currency
    i = Range("Start").CurrentRegion.Columns(1).Cells.Count - 2
    ReDim typMyInfo(i)
    '//모듈시트의 도입부분에 사용자정의 변수를 지정해 두었으니까 프로시저에서 그것을 불러
    '//사용하는 것입니다. 불러오는 방법은 "Dim 변수명() As 사용자정의변수명"과 같은 형태로
    '//사용합니다. 여기서는 레코드가 몇 개인지 알 수 없다고 가정하고 동적배열변수를 사용해
    '//보았습니다.

    '//여기서 동적배열변수의 크기를 Redimension문으로 재정의 할 때,
    '//i = Range("Start").CurrentRegion.Columns(1).Cells.Count - 2와 같이 사용하였는데 왜 뒤에
    '//-2를 해 주는지 아시겠습니까? 배열은 다른 조건을 주지않는 한, Lbound의 크기가 0이지요?
    '//거기다가 Start 셀의 CurrentRegion 영역의 첫번째 라인은 타이틀 부분이 있기 때문에
    '//-2를 해 준 것입니다.

    For intCount = LBound(typMyInfo) To UBound(typMyInfo)
        With Range("Start")
            typMyInfo(intCount).strName = .Offset(intCount, 0)
            typMyInfo(intCount).strTel = .Offset(intCount, 1)
            typMyInfo(intCount).strAddress = .Offset(intCount, 2)
            typMyInfo(intCount).strCompany = .Offset(intCount, 3)
            typMyInfo(intCount).strRank = .Offset(intCount, 4)
            typMyInfo(intCount).curPayment = .Offset(intCount, 5)
        End With
        '//배열의 크기만큼 순환문을 돌면서 큰 그릇(사용자정의 변수) 안에 있는 작은 그릇에
        '//해당값들을 종류별로 담습니다.

    Next intCount

    For intCount = LBound(typMyInfo) To UBound(typMyInfo)
        With typMyInfo(intCount)
            Msg = "<" & intCount + 1 & " 번째 데이터의 정보>" & vbCr & vbCr
            Msg = Msg & "이    름:   " & .strName & vbCr
            Msg = Msg & "전화번호:   " & .strTel & vbCr
            Msg = Msg & "주    소:   " & .strAddress & vbCr
            Msg = Msg & "회 사 명:   " & .strCompany & vbCr
            Msg = Msg & "직    책:   " & .strRank & vbCr
            Msg = Msg & "연    봉:   " & .curPayment & " 천원"
        End With
        MsgBox Msg, , typMyInfo(intCount).strName & " 기본 정보//Exceller"
        curTotalPayment = curTotalPayment + typMyInfo(intCount).curPayment
        '//마찬가지로 배열의 크기만큼 순환문을 돌면서 변수에 저장된 값들을 메시지 박스에
        '//뿌려 줍니다.

    Next intCount
    MsgBox "급여총액은 " & Format(curTotalPayment, "#,##0") & " 천원 입니다"
End Sub

마무리

이와 같이 사용자정의 변수를 사용하면 같은 성격의 서로 다른 데이터들을 보다 체계적으로 관리할 수 있게 됩니다. 처음 보시는 분들은 좀 복잡해 보일지 모르겠는데 잘 따져보면 그다지 어려운 것이 아니니까 잘 익혀두시기 바랍니다.

다음 시간에…

정리 — 사용자 정의 변수 핵심

구분 사용한 코드 역할
형식 정의 Type CustInfo ... End Type 여러 변수를 묶은 형식 선언
배열 선언 Dim typMyInfo() As CustInfo 동적 배열 변수
크기 지정 ReDim typMyInfo(i) 레코드 수에 맞게 재정의
값 저장 typMyInfo(n).strName = ... 항목별로 담기
범위 순환 LBound(...) To UBound(...) 배열 전체 순환

자주 묻는 질문 (FAQ)

Q1. 사용자 정의 변수는 무엇인가요?

여러 형태의 변수를 하나로 묶어 놓은 자료형으로 Type ~ End Type 문으로 정의합니다.

Q2. Type 문은 어디에 선언하나요?

모듈 시트에서 특정 프로시저 안이 아니라 맨 위 선언부(프로시저 바깥)에 선언합니다.

Q3. ReDim에서 왜 -2를 하나요?

배열의 하한이 0이고, 표의 첫 행은 제목이므로 전체 행 수에서 2를 빼야 마지막 인덱스가 되기 때문입니다.

마치며

사용자 정의 변수를 활용하면 같은 성격의 서로 다른 데이터를 체계적으로 관리할 수 있습니다.