- 최초 작성일: 2000-12-22
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 사용자 정의 변수에 대하여
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 사용자정의 변수(User-defined Type Variable)에 대해 알아보도록 하겠습니다. 사용자정의 변수에 대해서는 얼마 전에도 한번 소개해 드린 기억이 있습니다만 중요한 것이니까 이번 기회에 잘 정리해서 내 것으로 만들어 두시기 바랍니다.
사용자 정의 변수에 대하여
핵심 요약: 사용자 정의 변수
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를 빼야 마지막 인덱스가 되기 때문입니다.
마치며
사용자 정의 변수를 활용하면 같은 성격의 서로 다른 데이터를 체계적으로 관리할 수 있습니다.