| 엑셀 VBA 변수 기초 강의 - 개체 Object 변수에 대하여 | 엑셀 VBA 강의 1-5 |
1. 개체변수(Object)를 지정할 때 Dim / Set을 사용하는 이유
개체(Object)를 VBA 변수로 지정할 경우 반드시 Set을 사용해야 하는데요, 왜 그럴까요?
이를 이해하기 위해서는 우선 Dim (Declare In Memory)에 대해서 간단히 이해하고 넘어가야 합니다.
1-A. Dim (Declare In Memory) : 메모리를 예약
VBA에서 Dim은 변수를 지정하기 위해 사용합니다. 변수를 지정한다는 것은 프로그래머의 입장에서는 이후에 코드작성을 좀 더 편하게 하기 위한 것도 있겠지만, 코드 실행속도를 고려한다면 컴퓨터의 입장에서는 일정부분의 메모리를 미리 할당함으로써 코드 실행을 준비하는 작업이 될 수도 있습니다.
즉, Dim을 사용하여 변수를 지정하게 되면 컴퓨터에게 “내가 이 코드를 실행하려면 변수로 지정한 만큼 메모리가 필요한데 예약좀 해줘~” 라는 명령을 보내게됩니다.

1-B. Set: 개체변수를 할당
Dim을 통해서 VBA 변수를 지정하였으면 일반 데이터타입(숫자/문자/논리값)은 Set 없이 각 변수안에 데이터를 할당하고, 개체(Object) 데이터타입은 Set을 통하여 데이터를 할당합니다.

1-C. 왜 개체(Object) 변수 안에 데이터를 할당할 때는 Set을 사용하나요?
일반 데이터타입은 Set 없이 바로 변수안에 데이터를 할당할 수 있습니다. 왜 그럴까요?
사실 일반 데이터타입의 경우에는 데이터를 할당할 때에 앞에 ‘Let’ 을 입력해야 되지만, VBA에서는 유저의 편의를 위해 Let을 기본값으로 설정해서, 사용자가 바로 데이터를 할당할 수 있도록 하였습니다.

2. VBA 일반 데이터타입과 개체 데이터타입의 차이점
이것만 기억하세요!
일반 데이터타입과 개체 데이터타입의 차이점은 영상강의에서 자세히 다루고 있습니다.
2-A. 예제코드1] (일반 데이터타입의 입/출력 확인)
Sub Test1() Dim myName as String Dim myAge as Integer myName = “오빠두” myAge = 20 Msgbox myName Msgbox myAge End Sub
2-B. 예제코드2] (개체 데이터타입의 입/출력 확인)
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