엑셀 VBA 개체란?(Object)
VBA 시작 전 반드시 알고 넘어가야 할 필수지식! - VBA 개체 알아보기
이 강의에서는 엑셀 VBA의 개체(Object) 변수가 일반 데이터 타입과 어떻게 다른지, 그리고 개체에 값을 할당할 때 왜 반드시 Set 키워드를 사용해야 하는지 단계별로 살펴봅니다. Dim의 메모리 예약 동작부터 클래스 모듈을 활용해 사용자 정의 개체를 만드는 방법, Set 누락 시 발생하는 런타임 91 에러까지 함께 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
1. 개체변수(Object)를 지정할 때 Dim / Set을 사용하는 이유
개체(Object)를 VBA 변수로 지정할 때에는 반드시 Set 키워드를 함께 사용해야 합니다. 그 이유를 이해하려면 먼저 Dim (Declare In Memory)이 어떤 동작을 수행하는지 정확히 알아야 합니다.
1-A. Dim (Declare In Memory) : 메모리를 예약
VBA에서 Dim은 변수를 선언하기 위해 사용하는 키워드입니다. 변수를 선언한다는 것은 프로그래머 입장에서 코드 작성을 편리하게 만들어 주는 동시에, 컴퓨터 입장에서는 코드 실행에 필요한 메모리 영역을 미리 할당하여 실행 속도를 최적화하는 작업이기도 합니다.
즉, Dim으로 변수를 선언하면 VBA는 컴퓨터에게 "이 코드를 실행하려면 이만큼의 메모리가 필요하니 미리 예약해 두자"라는 명령을 전달합니다.

1-B. Set: 개체변수를 할당
Dim으로 변수를 선언한 뒤, 일반 데이터 타입(숫자·문자·논리값)은 Set 없이 바로 값을 대입할 수 있지만, 개체(Object) 데이터 타입은 반드시 Set 키워드를 사용해 데이터를 할당해야 합니다.

1-C. 왜 개체(Object) 변수 안에 데이터를 할당할 때는 Set을 사용하나요?
일반 데이터 타입은 Set 없이도 변수에 곧바로 값을 대입할 수 있습니다. 그 이유는 무엇일까요?
사실 일반 데이터 타입도 원칙적으로는 값을 할당할 때 앞에 'Let' 키워드를 입력해야 하지만, VBA는 사용자의 편의를 위해 Let을 기본값으로 처리하여 사용자가 별도의 키워드 없이 바로 값을 대입할 수 있도록 설계되어 있습니다.

2. VBA 일반 데이터타입과 개체 데이터타입의 차이점
두 데이터 타입의 차이는 다음 한 줄로 정리할 수 있습니다.
일반 데이터 타입과 개체 데이터 타입의 보다 자세한 차이점은 영상강의에서 단계별로 설명합니다.
2-A. 일반 데이터타입의 입/출력 확인
Sub Test1() Dim myName as String Dim myAge as Integer myName = "오빠두" myAge = 20 Msgbox myName Msgbox myAge End Sub
2-B. 개체 데이터타입의 입/출력 확인
Sub test2() Dim myRange As Range Set myRange = Sheet1.Range("A1") myRange.Value = "오빠두" MsgBox myRange.Address Msgbox myRange.ColumnWidth myRange.ColumnWidth = 30 myRange.Interior.Color = vbYellow End Sub
3. VBA에서 개체변수(Object 변수)는 왜 사용하는가?
개체변수가 왜 필요한지 이해하기 위해 자동차에 비유한 예시를 살펴보겠습니다.
VBA 변수의 보다 기본적인 개념이 궁금하다면 엑셀 VBA - 자주 쓰는 변수 7가지 총정리 강의를 먼저 참고해 주세요.
| 변수 | ⇨ 자동차 |
| 데이터 | ⇨ 자동차에 탑승하는 사람 |
| 데이터타입 | ⇨ 자동차의 종류 (차의 크기, 차의 종류, 차의 옵션 등) |
3-A. 일반 데이터타입 설정의 예시 (자동차의 크기를 정할 때)
자동차의 종류 가운데 '자동차의 크기'를 지정해 보겠습니다. 자동차의 크기는 일반적으로 다음과 같이 사이즈가 정해져 있습니다.
자동차의 크기 = "소형차" 또는 "중형차" 또는 "준중형차" 또는 "대형차"
3-B. 개체 데이터타입 설정의 예시 (바퀴의 종류를 정할 때)
이번에는 자동차의 옵션 중 하나인 바퀴의 종류를 지정해 보겠습니다. 바퀴는 타이어의 종류, 금속 재질, 색상 등 다양한 속성으로 구성되어 있습니다.
따라서 바퀴를 지정할 때에는 여러 가지 속성을 조합해 종류를 정의해야 합니다.
Set 바퀴의종류 As 자동차바퀴 바퀴의종류.타이어종류 = "레이싱용" 바퀴의종류.금속의재질 = "합금" 바퀴의종류.색상 = "은색"
이처럼 바퀴는 여러 속성을 조합해 원하는 형태를 정의해야 합니다.
타이어 하나를 교체하는 작업만 보더라도 공기를 빼고 고무를 분리하는 등 여러 단계를 거치게 됩니다. 그러나 사용자 입장에서 중요한 것은 세부 작업 공정이 아니라, 어떤 종류의 타이어를 선택할지 결정하는 일입니다.
따라서 개체변수를 사용하면 여러 속성값이 필요한 대상을 마치 블록을 조립하듯 다룰 수 있어, 코드를 한층 쉽고 체계적으로 작성할 수 있습니다.

3-C. 개체 변수를 이해하기 위한 클래스모듈 설정해보기
클래스 모듈은 사용자가 VBA 안에 직접 Object(개체)를 정의할 수 있도록 지원하는 모듈입니다.
아래의 코드를 클래스 모듈에 입력하고 모듈 이름을 '자동차'로 변경하면, 해당 워크북 안에서 '자동차'라는 개체변수를 자유롭게 사용할 수 있습니다.
'## 클래스모듈 안에 입력하세요. '## 클래스모듈 이름은 '자동차'로 변경해주세요. Enum 엔진 Cc1000 = 1 Cc2000 = 2 Cc3000 = 3 End Enum Public 엔진종류 As 엔진 Public 선팅 As Boolean

'##일반 모듈안에 입력하세요. '##클래스모듈안에 속성을 설정하였으므로, 새자동차 입력후 .(점)을 입력하면편집창에서 해당하는 속성값을 자동으로 보여줍니다. Sub Test3() Dim 새자동차 AS 자동차 새자동차.엔진종류 = cc2000 새자동차.선팅 = True End Sub

4. VBA에서 Set 없이 개체(Object) 변수에 데이터를 할당할 경우?
VBA에서 Set 키워드 없이 개체(Object) 변수에 데이터를 할당하면 'Runtime 91 (런타임 91) 에러'가 발생합니다.

Sub Test4() Dim WB As Workbook WB = ThisWorkbook '## Set을 WB 앞에 입력하세요. MsgBox WB.Name End Sub
강의중에 모듈과 클래스의 차이점을 설명해 주신다고 하셨는데 그런 내용이 안보여서 혹시 설명을 하신 강의가 있는지 알고 싶습니다.
어흑 ㅠ-ㅠ... 이것저것 준비할게 많다보니.. 아직 강의를 준비하지 못했습니다. 양해부탁드려요 ㅠ_ㅠ
간략히 설명 드리자면, (모든 상황에 해당되는건 아닙니당!)
모듈 : 명령문, 함수를 포함하고 실행합니다.
클래스모듈 : 개체를 포함하고 실행합니다.
로만 이해하셔도 99% 상황에서 적용하실 수 있습니다 ^_^*
두세번 더 읽고 갈께요
감사합니다.
Sub Test1() 부분은 노란색으로 표시되고
myName = “오빠두” 부분은 빨간색으로 표시가 됐어요
죄송합니다.ㅠㅠ 홈페이지 명령문에 큰따옴표(")가 VBA에서는 인식하지 못하는 큰따옴표로 사용되어있네요.
큰따옴표를 지운 뒤 다시 작성해보시겠어요?
감사합니다.
공부가 재미 있어 지네요. 화이팅입니다.
좋은 영상 감사합니다.
이번에 엑셀 책은 구매했는데 vba 관련 책은 출간 예정 없으신가요?
VBA 커리큘럼도 추후 교재와 함께 제작할 예정입니다. 빠르면 내년 중순이 될 것 같습니다. 자세한 일정은 정해지는대로 홈페이지와 유튜브 커뮤니티로 안내해드리겠습니다.
실습파일을 내려 받을 수 없는데요. 어떻게 해야 하나요?
감사합니다.