PROGRAMMING WORKSHOP

COMAddIns | Office Shared Addins

앞페이지에서 하였던 것은 Win32 COM을 범용으로 공개가 되는 라이브러리였다
이것은 도구메뉴에서 참조를 하여야 한다는 어떻게 보면 엑셀 AddIn은 아닌 셈이다
Visual Baisic프로그래밍을 하던, Java를 하던 COM을 참조할수 있는
곳에서는 모두 참조하고 활용하였다
이제 만들려고 하는 것은
설치하면 자동으로 엑셀을 열때마다 자동으로 로딩되는 Excel Addin 혹은
워드문서를 열면 워드용 AddIn이 만들수도 있고
VSTO는 아직 사용자의 컴퓨터에서 설치가 좀 버벅거리지만
이것은 아주 안전빵으로 설치가 자알 되는 방법이다

또한 이것은 로딩이 되면서 메뉴버튼이 생성이 되기도 한다
실은 UNO_CPM 이나 UNO_Weekly Addin을 VSTO로 만들었으나
실은 지금 만들려고 하는 것으로 만들었으면 좀더 많은 분들이
활용할수 있었을 것이다
그러나 이것의 단점은 자동업데이팅이 안된다는 점..
새로운 버전이 나타나면 삭제하고 새로 깔아야 한다는 점
그러나 이런 저런 번거로움에도 불구하고(어떤 분은 설치가 안되기도 하고)
VSTO가 좋은 것은 개발자가 웹에 새로운 버전을 설치하면
사용자는 엑셀을 열때마다 자동으로 업데이팅이 된다는 점이다
이 점을 제외하고는 지금 시작하려고 하는 Shared AddIn이 훨씬 좋다고 불수 있다

실은 이것은 앞페이지에서 만든 COM Addin과 같은 것이지만
오피스개발자들을 위하여 템프릿이 제공되고 좀더 편리하게
설치될수 있게 한 오피스개발전용의 템프릿에 의한 COM Addin인 것이다



그림과 같이 Visual Studio 2010 버전의 새프로젝트에서 선택하는 템프릿이다
참으로 흥미로운 것이고 신나는 AddIn이다
아쉬운 것은 2007버전이후는 환경과 상관없이 자동으로 인식하고 설치되는데
Vista 환경에서는 2003버전이 자동로딩이 되지 않았던 경험이 있다
아무튼 이것을 일일이 컴퓨터마다 해볼수도 없고, 각자 경험들을 해보시기 바란다
문제가 있으면 또 빠져나갈 길이 있는 것이니..

다시 정리하면 추가기능 화일로서는
VBA로 처리되는
엑셀로 만드는 전통적인 추가기능화일이 있고(이것은 대개가 만드실수 있는 것이고)
앞페이지에서 만든 COM라이브러리를 도구/참조하여 사용하는 반토막짜리 Addin이고
지금 만들려고하는 것이 엑셀로 만든 AddIn을 VB.Net으로 만들어서
엑셀로 만든 AddIn같이 사용할수 있는 것이고
차세대 AddIn인 VSTO를 활용하는 것이라고 할 수 있다
VSTO로 만드는것은 이 페이지 이후에서 하도록 하고
이제 Shared AddIn을 만들어 보도록 하자

만들고 나면 히야..이렇게 좋은 것이 이렇게 간단하게 만들어지나??!!
라는 소리가 나올 것이다
나는 VBA를 사용한 엑셀프로그래머들이 다른 프로그래머들보다 역량이
더 뛰어나다고 생각한다
다 같은 VBA프로그래머가 아니고
엑셀이 갖고 있는 개체를 잘 이해하고 활용하고 숙달된 프로그래머를 이야기 하는 것이다
만약 스스로 개체를 잘 이해하고, 어디에 사용되는 것인지 활용하고
또 숙달 되었다면 VB.Net을 활용한 다른 응용프로그래밍은 그냥
덤으로 얻는 것이다
문제는 Visual Studio라는 개발환경에 익숙치 못하다 보니까..
그냥 무지하게 어렵고, 접근하는 것이 낯섫다고 생각하는 장벽이 있을 뿐인 것이다
엑셀프로그래밍을 하는 사람은 이미 모든 것을 다 알고 있다고 해도 된다
그러니 새로운 동네의 길목을 좀더 익히는 것이 필요할 뿐인 것이다

아무쪼록 이 페이지들이 엑셀프로그래밍에서 몇단계 도약하는
도약대들이 되기를 바란다
그냥 낯섫은 환경이 새로운 신천지로 보는 안목과 긍정적인 생각이
필요할 뿐이다

그냥 마법사(AddIn Wizard)를 쫓아서 버튼을 눌러가면 된다

위에서 새프로젝트를 선택후..
(프로젝트의 이름에 숫자나 알파벳외의 문자가 들어가면 안된다)

아래와 같이 5단계 마법사 대화상자를 통과한다



1, 마법사 시작 대화상자..별거 없고
2, 어떤 언어를 사용할 것인가??당연히 VB 선택이고
   (언어의 장벽은 없다 Visual Studio가 알아서 처리한다)
3, Shared Addin은 하나로 여러곳에 공통으로 사용할수 있다
   여기에서는 Excel만 선택하고
4, Add-In이름을 지어주고, Add-In의 설명을 적어주고
5, 엑셀이 열릴때 자동 로딩이 되게 하라고 첫째 체크박스 체크해주고
6, 다 끝났다..마지막 앞전에서 처리한 내용 요약보고서

이 작업을 통하여 아래와 같이 만들어지고
중요한 엔진..Connect.vb라는 크래스모듈이 하나 열린다



셋업프로젝트를 별도로 추가하여야 하는 앞페이지의 범용의 COM Addin, 실은 AddIn이라고 보기 보다는 COM 크래스라이브러리!!!br /> 에 비하여 쎄련된 엑셀 COM Addin이 시작되는 것이다..
이제 여러분의 VBA실력에 VB.Net, .NetFrameWork의 개체군단을
신나게 활용하면 엑셀 VBA에 파워풀한 날개를 달게 되는 것이다

imports Extensibility imports System.Runtime.InteropServices <GuidAttribute("06E4B784-400C-419E-8810-6122C166EA40"), ProgIdAttribute("UNOVBNetCOMAddIn004.Connect")> _ Public Class Connect Implements Extensibility.IDTExtensibility2 Private applicationObject As Object Private addInInstance As Object Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown End Sub Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate End Sub Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete End Sub Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection End Sub Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection applicationObject = application addInInstance = addInInst End Sub End Class

중요한 것은 선언부의

Import Extensibility

와 Class 내부 선언부의

Implements Extensibility.IDTExtensibility2

인 것이다..이게 뭔지 낯섫다면 앞의 페이지를 다시 보셔야 한다
Interface라는 것때문에 한페이지를 할애 했었다
앞에서는 우리가 Interface를 만들어서 사용했었다
여기에서의 Interface는 .NetFrameWork에 이미 내장되어 있는
Interface를 사용하는 것이다
Extnsibility는 NameSpace이고 인터페이스 이름은 IDTExtensibility2 를 사용하는 것이다
무슨 소린지 모르겠다면 그냥 위의 두개를 건들지 말고 , 잘 보존하고
처음에는 무엇인지 모르고 그냥 하는 경우도 있으니까..

각 메소드에 작성을 해나가면 된다

Extensibility.IDTExtensibility2 에 대한 MS의 설명을 보려면..크릭!!
위의 참조 싸이트가
더 헷갈리시겠지만..기계로 번역된 것을 보시려면 한글을 선택하시면 된다
기술자료의 기계,한글번역은 좀..웃기는 것들이 많다
아무튼 참고가 되시기 바라고..

위의 템프릿은 엑셀의 내용은 하나도 없다..
엑셀개체에 접근하려고 하는 흔적이 하나도 없다
당연하다..
이것은 오피스에서 VBA를 사용하는 모든 프로그램에서 AddIn으로 사용할수 있는
템프릿인 것이고
모든 것을 연결하는 연결고리 IDTExtensibility2 인터페이스는
모든 오피스와 반응하기 위하여 준비된 것이다

앞에서 흔히 하듯이 엑셀 라이브러리를 참조하고 오피스라이브러리를 참조하는
작업들을 진행하게 된다
아래의 그림과 같이 참조 시켜야 엑셀로 별짓을 다하게 된다



뭔소린지 우선 대강 하나 만들어 놓고 보자
아래의 설치화일로 AddIn을 설치후

설치 화일 다운로드

엑셀을 열면 아래의 그림과 같이 메뉴버튼이 생기고
메뉴버튼을 크릭하여 보시면 ..



VBE편집기의 도구메뉴에서 참조하고 ..번거로운 짓이 하나도 필요없다
그냥 설치하고 엑셀 열면 AddIn이 들어가 앉아서 기다리고 있는 것이다
위에서 2003버전은 사용자의 환경에 따라서 나타나지 않는 것도 있으니..
그렇게 아시고

아하..이렇다면 엑셀을 마음대로 다룰수 있겠구나!!
라는 생각이 들게 될 것이다

Extensibility 라고 하는 것은 말 그대로 있는 개발환경을
좀더 확장(Extend, Stretch)시켜서 사용하게 하기 위하여 제공되는 Interface이고
말 그대로 Add-In(추가기능)을 만들어 사용하기 쉽게 제공되는 것이다
아래의 그림과 같이 크래스모듈화일을 하나 삽입하고
입력하고 엔터키를 쳐 보시기 바란다



자동으로 Interface에 들어 있는 메소드들을 Class에서 구현하게
빈탕의 메소드들이 자동입력됨을 볼수 있을 것이다
이곳에 작성하면 되는 것이다

Imports Extensibility
Public Class Class1
    Implements IDTExtensibility2

    Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
    End Sub

    Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown
    End Sub

    Public Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As Extensibility.ext_ConnectMode, ByVal AddInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
    End Sub

    Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
    End Sub

    Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete
    End Sub
End Class

간단하게 엑셀에서 통합문서가 열릴때 Open 이벤트프로시져가 있듯이
Add-In이 엑셀이 열리면서 자동 연결이 될때 발생하는 것이
OnConnection 메소드(이벤트)인 것이다
이곳에서 할 만한 것이 필요한 변수들에 필요한 개체들을 등록하고
예를 들면 OnConnection의 매개변수 Application As Object 는
사용자에 따라서 엑셀이 될수도 있을 것이고, 워드가 될수도 있을 것이고
파워포인트가 될수도 있을 것이니 구체적인 개체명이 아니고 As Object 범용개체명으로
전달 된다

그래서 프로젝트의 어딘가에
Dim oAPP As XL.Application 변수를 선언하여 이 변수에
Add-In이 연결되면서 개체를 담아두면 엑셀이 열려 있는 동안 두고, 두고
엑셀을 관리할수있게 될 것이다

oApp=CType(Application,XL.Application)

실은 마법사가 만들어준 Connect.vb 크래스 모듈에는
applicationObject가 외부변수로 선언되어 있고
아래와 같이 개체를 OnConnection에서 생성시켜 놓는 구문이 있었다
applicationObject = application

그러나 원리를 알면 변수롤 다른 접근하기 편한 이름으로 하여 만들어서
사용하여도 된다

이렇게 엑셀의 최상위개체만 잡아두면 나머지는 VBA에서 숙달된
것을 사용하면 되는것이다
물론 좀더 세련된 것들을 위한 .NetFrameWork의 접근이 필요하겠지만
기본 컨셉이 그 것 뿐인 것이다

아래의 화일의 각각의 크래스모듈과 WindowForm모듈등에 설명을 달았으니
보시면서 뭔가 수정도 해보고 확장해 보시면서 감각을 키우시기를..
특히 아래와 같이 WithEvents 로 개체변수를 선언하여
해당 개체의 이벤트프로시져를 활용하여 만들어 가는 것을 잘 감안하시기 바란다

WithEvents oTab As New Windows.Forms.TabControl
Public WithEvents oAPP As XL.Application
Public WithEvents oBtn As OFF.CommandBarButton

아래 화일을 사용하실때
위의 셋업으로 설치한 Add-In을 제거하신후 사용하시는 것이 좋다
제거하지 않아도 아래의 화일을 빌드하고 디버그 실행할때
삭제 하라고 메시지가 나타나니까..그때 해도 되고..

***[LOG-IN]***

다음 페이지에서는
VSTO로 AddIn을 하나 간단하게 만들어서 보도록 하자
그러면 모든 Add-In은 다 만들어 본 셈이 될 것이다
내부적으로 뭔가 기능을 추가하는 것은 모두 엑셀개체에 대한 감각과 경험
그리고 .NetFrameWork의 보물상자를 얼마나 잘 엑셀과 조화있게 활용하느냐의 문제가 된다