PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

VSTO|
COMAddIn,AddIn 의 제거와 설치

엑셀을 그렇게 많이 이야기 하면서도
사용하지 않았던 속성,메소드가 많다
VSTO 추가기능화일을 이것 저것 너무 많이 만들어 사용하다 보니..
로딩할때 시간이 많이 걸리니
필요할때마다 선택하여 로딩하게 할수 없겠냐는 질문이 있었다
사용하지 않던 속성이라서..그런것이 있을까??라는 바보같은
생각으로 MS문헌을 찾아 본다
너무 쉬운 문제라서 그런 것에 대한 답이 없다..
어라..이상하네..있을텐데..
그래서 엑셀 VBA편집기의 개체탐색기를 찾아 본다.
눈에 들어 오는 것..COMAddIns속성,COMAddIn개체!!
아하..전에 많이 보았지만..그냥 별 관심없이 보았던 것들이다
이런!!@$#@!!
그런데 이것을 통제하려면 메뉴를 한참 찾아가야 한다
아래 그림과 같이 손작업으로 처리 할 수 있다



이것을 VBA에서 처리한다면..직접실행창에서

Application.COMAddIns.Count

라고 하면 모두 몇개의 COM 추가기능화일이 사용가능한지
알수 있다

이것을 VSTO에서 읽어서 이렇게 표현해 보자

소루션을 만들때 어떤 개체가 몇개인지 모르는 경우가 허다하다
개체의 갯수에 맞추어 콘트롤을 만들어야 하는 것이다
이런 것이 싫으면 목록상자나, 콤보상자를 사용하면 좋기도 하지만
시각적으로 좀 매력적으로 만들고 싶다면 다른 콘트롤을 사용하는 것도 좋다



윈도우 폼을 만들고 옵션버튼을 두개 달고
옵셥버튼을 체크할때마다(Checked=True|False) 런타임으로
하나는 COMAddIns( VSTO나 win32 Com형식 으로 만든것)의 목록을 체크박스로 만들고
또 하나는 Excel Addins( Excel화일로 만든 형식)의 목록을 체크박스로 만들고

For Each oadd As Office.COMAddIn In Globals.ThisAddIn.Application.COMAddIns Dim oCheckBox As New Windows.Forms.CheckBox iAddinCheckBox += 1 If oadd.ProgId = My.Application.Info.ProductName Then oCheckBox.ForeColor = Drawing.Color.Red End If oCheckBox.Text = oadd.ProgId oCheckBox.Name = "Check_" & iAddinCheckBox oCheckBox.Checked = oadd.Connect oCheckBox.Font = New System.Drawing.Font("맑은 고딕", 10) AddHandler oCheckBox.CheckedChanged, AddressOf CheckComAddins Me.Controls.Add(oCheckBox) oCheckBox.Top = lTop + iNext * 20 oCheckBox.Width = 200 oCheckBox.Left = 20 iNext += 1 Next Else DeleteChekBoxControls() sAddInMode = "AddIn" Dim lTop As Long = Me.GroupBoxSelect.Top + Me.GroupBoxSelect.Height + 20 Dim iNext As Integer = 0 For Each oX As Excel.AddIn In Globals.ThisAddIn.Application.AddIns iAddinCheckBox += 1 Dim oCheckBox As New Windows.Forms.CheckBox oCheckBox.Text = oX.Name oCheckBox.Name = "Check_" & iAddinCheckBox oCheckBox.Checked = oX.Installed oCheckBox.Font = New System.Drawing.Font("맑은 고딕", 10) AddHandler oCheckBox.CheckedChanged, AddressOf CheckComAddins Me.Controls.Add(oCheckBox) oCheckBox.Top = lTop + iNext * 20 oCheckBox.Width = 200 oCheckBox.Left = 20 iNext += 1 Next End If

옵션버튼이 선택될때의 이벤트프로시져의 내용을 위와 같이 작성한다
중요한 것은 COMAddIns 개체의 집합체를 어디서 읽어오냐는 것

Globals.ThisAddIn.Application.COMAddIns

엑셀타입 추가기능화일은

Globals.ThisAddIn.Application.AddIns

VSTO는 하나도 어렵지 않다
조금만 요령만 알면 된다
앞의 두 개체..Globals.ThisAddIn 을 한후 나머지는 엑셀 VBA와 같은 것이다
Application은 엑셀 VBA에서는 생략을 해도 되니까..생략하는 것이고
정식은 앞에 Application개체가 붙는다는 점..

도전 하시기를...

또 하나는 엑셀 VBA이던 워드 VBA이던 UserForm을 자주 사용하는 습관을
갖는 것이 다른 개발환경으로 졈프하기 좋은 습관이다
왜냐면 ..VSTO를 사용하는 이유는 윈도우폼을 그대로 사용하고 싶은 욕구이고
.NetFrameWork 라이브러리의 모든 것을 자유롭게 활용하고 싶어서 이다

연습삼아 위의 코드를 그대로 엑셀 VBA로 옯겨서
UserForm에 구현하여 보셔도 좋다

또 하나 VSTO에서 자신의 소루션 이름을 어디서 얻어낼수 있을까?
위에서 체크박스를 런타임으로 만들면서 자신의 화일 COMAddin일 경우
빨강색으로 표시하고 또한 자신을 체크하면 지우면 지금 현재의 것이
메모리에서 사라진다는 메시지박스를 띄워야 할 것이니..
조건문을 띄우기 위하여 이름을 알아내야 할 것이다
My 라는 NameSpace가 아주 편리한 것이다

My.Application.Info.ProductName

와 같은 경로로 Info개체의 ProductName이라는 속성에서 얻어낼 수 있는 것

CheckBox콘트롤을 생성하면서 이벤트프로시져를 만들어주어야 하니까
이 부분이 중요한 것이고..

AddHandler oCheckBox.CheckedChanged, AddressOf CheckComAddins

체크박스를 체크하면 CheckComAddins 프로시져를 실행하라는 구문

***[LOG-IN]***