Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

External Library

도구/참조/외부라이브러리/New/CreateObject()

회원님중에서 아래와 같은 질문을 하신다

변수 선언이나 set 문에서 New 키워드의 사용법에 대하여 문의드립니다.
new 키워드의 사용법이 궁금합니다.
알듯 말듯 개념이 명확하게 잡히질 않네요...
정확한 개념을 알고 싶습니다.
새 인스턴스를 생성한다는데 무슨 의미인지,
제 감으로는 외부 라이브러리(도구-참조)에 있는 개체를 써 먹을 때
사용하는 것 같기도 하고, 머리에 팍 들어오질 않습니다.
도움말에는 이렇게 설명이 되어있는데..뭔소린지,잘 모르겠습니다

엑셀은 Application이라는 최상위오브젝트로 부터 시작하여
다양한 자식 오브젝트들이 들어 있다
엑셀프로그래밍을 배우는것은 바로 이 오브젝트들이 어떻게
구성되어있는지를 익숙하게 하는 과정이다
그런데 엑셀은 엑셀의 기능에 필요한 기능들을 수행하는
오브젝트들로 구성되어 있다
만약 엑셀의 내용을 워드문서에 자동화로 옮기고 싶다면
어떻게 해야 할까..
가장 우선 워드의 오브젝트들에 접근할수 있어야 한다
엑셀의 오브젝트들에 접근하여 이런 저런 원하는 작업을
수행하듯이 워드의 오브젝트에 접근하여 원하는 작업을
마음대로 할수 있는것이다
이때 가장 중요한것은 어떻게 워드오브젝트를 생성할것인가??
VBA언어에는 CreateObject("Word.Application")라는 함수가 제공된다
이것은 여러분의 컴퓨터를 뒤져서 워드를 찾아내서
윈도우시스템은 여러분이 컴퓨터에 깔아 놓은 모든 프로그램을
데이타베이스화시켜서 시스템데이타베이스를 갖고 있다
이곳을 뒤져서 찾아 내는 것이다
그래서

Dim oX As Object
Set oX=CreateObject ("Word.Application")

라고 하면 워드의 최상위 오브젝트인 Application오브젝트가
oX라는 변수에 연결되는 것이고
엑셀에서와 마찬가지로 oX의 하위오브젝트를 찾아내려 가면서
작업하면 된다
아래 그림과 같이 코딩을 하고
oX.
과 같이 Dot 연산자를 찍어 보시기 바란다



그림과 같이
아무것도 나타나지 않는다
도대체 oX의 하위 메소드나 속성이들 무엇이 있는지
도무지 알수가 없다
초보님들의 프로그래밍불가!!
상태가 된다
그러면 이렇게 하면 될까??

엑셀 프로그래밍에 익숙한 분들은..아마도..
아하!!!
Dim oX As Object
라고 변수를 선언하면 Late Binding이 되어
디자인타임(코딩할때)할때 해당오브젝트의 하위 속성이나 메소드를
나타내는 리스트박스가 뜨지 않았지??!!
그러니까..이렇게 하면 되겠지!!!

Dim oX As Word.Application
이라고 자신있게 선언할수 있을것이다
그런데..어렵쇼..



와 같은 에러가 뜬다!!
변수선언상태에서 전혀 뭔소린지 알아먹지를 못한다
Dim oX As Word.Application
이라고 선언하기 위하여서는 선행적으로 처리하여야할
작업이 있다
아래와 같이 하고 확인버튼 크릭후 다시 해보시기 바란다



이것은 디자인 타임(코딩할때)에 미리 오브젝트라이브러리를
찾아 놓고 하는 Early Binding 방식인것이다
이렇게 하면 컴퓨터의 데이타베이스를 찾아다니지 않고
이미 코딩할때 오브젝트를 찾아놓고 작업을 하는것이다
위와 같이 해놓으면
마치 워드오브젝트들이 엑셀의 오브젝트같이 되는 상태가 된다
그래서 위와 같이 참조후 개체찾아보기 창을 열어 보면



모든 워드오브젝트의 자원을 볼수 있고..



와 같이 oX, 워드의 Application오브젝트의 속성이나 메소드를
볼수 있는 리스트가 나타나니 쉽게 코딩할수 있게 되는것이고
이것이 Early Binding의 편리함이다

그럼 이제 New라고 하는 것은 뭐냐??
이것 또한 VBA에 새로추가된 키워드로서 CreateObject함수를
사용하는 것과 목적은 똑 같다
그런데 왜 헷갈리게 또 만들었나??
세상은 변하는것..개선하는 것..CreatObject보다 편리하게
사용하기 위한것이다
Dim oX As New Word.Application
이라고 변수를 선언하면서 그냥 사용할수 있다
CreateObject는
Dim oX As Word.Application
Set oX=CreateObject("Word.Application")
이라고 해야 하지만..

또한 New를 필수적으로 사용하여야 하는 경우는
VBA에서 배열대신에 배열과 같이 여러개의 정보를 다룰때 사용하는
Collection오브젝트를 선언할때는 반드시
Dim oCol As New Collection
과 같이 사용하여야 Collection오브젝트를 선언할수 있다
또한 Class모듈을 사용하여 사용자정의 크라스를 갖고
사용자정의 오브젝트를 만들때도 New를 사용한다
(이 부분은 Class모듈을 이야기할때 다시 설명하도록 한다)

아무튼 CreateObject()보다는 New가 편리하고
최근의 기술이니 New를 사용하는 것이 좋을것이다
주간강좌 초기 화일에서 New라는 키워드가 없을때의 강좌화일이라서
CreateObject()를 많이 사용하고 있으니..
초기화일을 없애고 싶으나..많은 분들이 없애지 말라고 하여
이런 나쁜점(헷갈리게 하는 점)을 알면서도 그냥 유지 하고 있다
초기화일을 보는 것보다는 이 UNO-XL-Progamming을 보면
좋을텐데..@#$#

또한 인스턴스(Instance)라고 하는 것은 무엇인지 질문을
하셨다

Object is instance of a Class

오브젝트는 크래스의 인스턴스이다
말 그대로이다
심각하게 생각하지 마시기 바란다
크래스를 참조하여 메모리상에 크래스의 설계대로
뚝딱거리고 집을 짓는 작업이 인스턴싱이고
지어 놓은 구체적인 집이 된것이 오브젝트인 것이다
그러니 복잡하게 생각하지 말고 오브젝트를 생성했다는 단계만
생각하면 된다
그리고 New라는 키워드 CreatObject라는 함수는
이런 과정을 지시하는 명령일뿐이다

그런데 엑셀에서 Shape오브젝트라던가
Range오브젝트를 만들때는 왜 New를 사용하지 않습니까??
라고 시비를 건다면..
외부 라이브러리를 통하여 만들어 놓은 워드나 엑셀이나 파워포인트내의
부모,형제,자매등의 오브젝트족보들은 스스로 자식(오브젝트)를 생성하는
약속된 Method나 속성(Property)를 갖고 있으니..
필요없지..그렇게 만들어진 것을 어떻게 하겠는가??!!

Dim shpX As New Shape
라는것은 있을수 없다
왜냐하면 Shape는 어떤 부모의 자식 오브젝트이고

Dim shpX As Shape
Set shpX=ActiveSheet.Shapes.Add(...)
와 같이 Shapes오브젝트의 Add메소드로 만들어지는것이다

이제 부터 한 동안 워드나 파워포인트를 엑셀에서 다루는것을
해보도록 하자
좀더 능력있는 엑셀프로그래머로 확장해보도록 하자!!

아래의 그림과 같이 엑셀의 정보를 워드로 옮기면서
서식을 살짝 한번 해보도록 하자



계속 워드나 파워포인트를 다루어서 좀더 확장된
엑셀프로그래머들이 되도록 할것이다


ExcelRangeToWordRange.