PROGRAMMING WORKSHOP

COMAddIns | Excel COM라이브러리 참조하기

엑셀용 COM 라이브러리를 만들려고 하는 것이니까
VB.Net에서 엑셀COM라이브러리를 참조시켜야 하는 것이 순서다
소루션창에서 프로젝트속성페이지를 열고
References(참조)탭을 열고 Add(추가)버튼을 크릭하여
나타나는 대화상자의 COM탭에서
Microsoft Excel 11.0 Object Library를 선택하고 확인하면
참조목록에 3개의 라이브러리가 들어 온다



Microsoft Office 11.0 Object Library는
엑셀,워드,파워포인트 등등의 공통지원라이브러리니까 당연히
딸려 들어오고, VBA Extensibility 라이브러리도 들어 온다
이 것들이 들어오게 됨으로 엑셀의 개체들을 다룰수 있게 된다

우선 COMAddIn이 무엇인지를 알기 위하여
쌤플로 실시간 환율비교표를 만들어 보자
환율을 제공하는 웹써비스가 많은 것중에서 하나를 골라
접근하여 정보를 엑셀에 갖여다가 뿌려주는 간단한 COMAddin의 활용을
보기 위한 정도의 것이다

아래 Setup화일을 다운 받아서 실행시키시기 바란다

설치화일 다운로드

일반 셋업화일 설치와 같이 설치 한 후
엑셀을 열고 VBA편집기로 가서 도구/참조 대화상자를 열고 아래의 라이브러리를
UNO_VB_NET_COMAddIn_002
참조시킨후 그림과 같이 프로시져를 하나 작성한후



실행하면 시트가 하나 만들어지고 주요국가 환율비교표가
현재시간 상태의 것이 만들어진다
코드는 VBA상에는 위의 3줄만 있고 중요한 일을 하는 내용은
어셈브리화일에 안보이게 저장이 되어 있으니 보안의 최적이다
버전에 관계없이 프로그램에 관계없이 모든 참조상자에 위의
라이브러리가 나타나게 될 것이다
그런데 한가지 이상한 것이 있다
메소드나 속성명의 목록이 나타나지 않는다..
해당개체가 어떤 메소드와 속성등을 갖고 있는지 목록이 기분좋게
나타나지 않는다..
이것은 현재 일부러 이렇게 해 놓은 상태다
속성이나 메소드의 목록이 나타나게 하려면 조금 장치를 하여야
한다
는 것으로 아시고 위의 내용을 아래와 같이 만들어 보자

크래스라이브러리를 만들때 달랑하나 만들어진
크래스 모듈에 아래와 같이 작성한다

' 선언부

Imports System Imports System.Runtime.InteropServices Imports XL = Microsoft.Office.Interop.Excel

' Interface

Public Interface IUNO Property oBook As XL.Workbook Sub GetData() End Interface

' Class Public Class UNOCOMAddIn Implements IUNO Private _oBook As XL.Workbook Private _oDataSheet As XL.Worksheet Const SHEET_NAME As String = "현재환율계산" Const CONNECT_ERR As String = "Internet 확인후 다시 시도하세요" Const NO_BOOK_ERR As String = "통합문서 지정후 다시 시도하세요" Public Sub GetData() Implements IUNO.GetData Try If _oBook IsNot Nothing Then Try _oDataSheet = _oBook.Worksheets(SHEET_NAME) Catch ex As Exception _oDataSheet = _oBook.Worksheets.Add With _oDataSheet .Name = SHEET_NAME End With End Try Dim sCODE() As String = {"USD", "EUR", "KRW", "CNY", "JPY", "HKD", "AUD", "VND", "THB", "SGD"} Dim oApp As XL.Application = _oDataSheet.Application oApp.DisplayAlerts = False Try Dim iZ As Integer = 1 Dim rUnion As XL.Range = Nothing With _oDataSheet .Cells.Clear() .Range("A1").Resize(, 3).Value = {"FROM", "TO", "RATE"} For iX As Integer = 0 To UBound(sCODE) - 1 For iY As Integer = 0 To UBound(sCODE) - 1 If sCODE(iX) <> sCODE(iY) Then iZ += 1 With .Range("A" & iZ).Resize(, 3) .Cells(1).value = sCODE(iX) .Cells(2).value = sCODE(iY) .Cells(3).value = GetDataFromServer(sCODE(iX), sCODE(iY)) If rUnion Is Nothing Then rUnion = .Cells(1) Else rUnion = rUnion.Resize(rUnion.Rows.Count + 1) End If End With End If Next rUnion.Merge() rUnion.Font.Bold = True rUnion.HorizontalAlignment = XL.XlHAlign.xlHAlignCenter rUnion = Nothing Next With .UsedRange .Font.Name = "맑은 고딕" .Font.Size = 10 .Borders.ColorIndex = 1 End With End With Catch ex As Exception MsgBox(ex.Message) Finally oApp.DisplayAlerts = True End Try Else MsgBox(NO_BOOK_ERR) End If Catch ex As Exception End Try End Sub Public Property oBook As Microsoft.Office.Interop.Excel.Workbook Implements IUNO.oBook Get Return _oBook End Get Set(ByVal value As Microsoft.Office.Interop.Excel.Workbook) _oBook = value End Set End Property Private Function GetDataFromServer(ByVal sCODE As String, ByVal sCODE1 As String) As String Dim sReturn As String Try Dim xmlResult As String = "" Dim URL As String = "http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=" + _ sCODE + "&ToCurrency=" + sCODE1 + "" Dim oHTTPRequest As System.Net.HttpWebRequest = System.Net.WebRequest.Create(URL) Dim oHTTPResponse As System.Net.HttpWebResponse = oHTTPRequest.GetResponse Dim oStreamReader As New System.IO.StreamReader(oHTTPResponse.GetResponseStream) Dim oXML As New System.Xml.XmlDocument xmlResult = oStreamReader.ReadToEnd oXML.LoadXml(xmlResult) sReturn = oXML.GetElementsByTagName("double").Item(0).InnerText ' oXMLNode.Item(0).InnerText Catch ex As Exception sReturn = "" End Try Return sReturn End Function End Class

맨위의 Interface 브록을 없애고
Class상의 Implement 를 모두 없애고 만들어서 사용하면 어떻게 될까???
도구/참조 대화상자에 라이브러리가 나타나지 않는다
Interface라는 녀석은 그런 역할을 하는 COM에 있어서 아주 중요한 것이다

위와 같이 작성후..
두가지만 설정을 하자..그림과 같이



COM Visible과 Register COM을 체크해준다
이 상태에서 컴파일하고 저장한 후
(위의 코드에 대한 설명은 원본화일에 올려 놓도록 할 것이다)
이것을 배포하려면 셋업화일이 하나 있어야 한다
셋업을 위한 프로젝트를 하나 소루션창에 추가한다



셋업마법사프로젝트이니..대화상자를 순서대로
너무 간단하니..그냥 그림 잘 딜다 보면서 순서대로 하시면된다

그렇게 한후 크래스라이브러리 프로첵트 컴파일(build),
셋업프로젝트 컴파일(Build)하시고
소루션을 빌드하면 두개가 다 되지만 ..종종 소루션내에서
프로젝트별빋드가 누락되는 경우가 있으니 각각 빌드 하시는 것이
확인 사살되어서 좋다
빌드한후 화일내용을 보면



최종 setup(셋업프로젝트의 이름).msi화일을 배포설치하면 된다
위에서 여러분들이 다운 받은 것은 .msi화일 인것이다

그러면 설치된 폴더의 내용을 보면

다시 돌아가서 ..위의 설치화일로 설치를 하고 실행하고
도구/참조에서 참조시키고 아래와 같이 작성을 하였으나



개체의 속성,메소드등 자원목록이 나타나지 않는다
이것은 뭔가 문제가 있다
사용자가 자원이 뭐가 있는지 알수가 없다
위에서 이야기했다 시피 무언가가 빠졌다
VB.Net에는 System.Attribute라고 하는 개체가 있다
Attribute ...속성..Property와는 다른 속성이다
물건을 내보낼때 같은 물건이라도 표딱지(Tag)를 붙여서 발송
하여야 하는 경우가 많을 것이다
물건이 너무 많이 복잡하여 지다 보니까..
더덕,더덕 표딱지를 붙여서..이것은 받는즉시 열어야 한다거나
이것은 받는 즉시 냉장고에 넣어야 한다거나
3일내에 먹지 않으면 썩는다 라던가..그런 표시를 해주어야 할 것이다
이것과 같은 원리로
라이브러리의 개체를 내보낼때 자원을 보이게 하라던가..
어떻게 하라던가 하는 표시를 붙여 주어야 한다
그런 Tag들이 System.Attribute 에 들어 있다
이것을 크래스나 인터페이스의 시작부분에서 붙여주어야 한다

적절한 Attribute를 붙여 주면 아래의 그림과 같이 자원목록이 나타난다



목록이 나타나니까 이제 되었다...이제 구조적으로 안정되었으니..
이제 위에서 한 내용의 기능을 좀더 추가시켜 보도록 하자
이제 마음대로 기능을 여러분의 상상력만큼+VBA실력만큼 붙여 나갈수 있다
위에서는 몇개의 국가통화코드를 약식으로 주었지만
웹에서 국가통화코드를 몽땅 복사하여 엑셀시트에 옮긴후
(엑셀은 참으로 이래, 저래 없으면 안되는 유용한 도구다 그러니, 엑셀은 잘하고 볼일이다!!!)



이제 COM Addin 프로젝트내에 자원(Resources)을 하나 갖여 온셈이다
국가명과 해당 국가 통화코드를 줄줄이 텍스트로 보관하고 있는 자원이다
이것의 의미는 여러분들이 회사내의 어떤 특정 정보집단을 이런식으로
자원으로 보관하고 적절히 활용하면 된다는 이야기다

이런 자원은 소루션이 무거워지면 곤란하면 런타임으로 외부써버에서
갖여 올수도 있으나, 이렇게 작은 메타데이타형식의 것들은
프로젝트에 심어서 사용해도 되는 것이고, 그런 형식을 쌤플로
보여드리기 위함이다
자원화일의 정보를 윈도우폼에 그림과 같이 띄운다



선택한후 버튼을 크릭하면 선택된 내용을 시트에 위의 화일에서
하혔던 방법대로 뿌려주게 한다, 아래의 그림과 같이..



하나 더 챙겨야 할 것이..
아래와 같이 프로젝트의 Class는 모두 공개된다
하나는 COM Addin에 공개하려는 의도의 크래스라이브러리 개체와
다른 하나의 개체는 이것이 뭔데????나타나지??
WindowForm이 하나 추가 된 것이고..
WindowForm도 하나의 Class 인 것이니
당연히 노출되게 된(Public으로 된것이라서)



이것을 방지 하는 방법은
만약 이것을 Private로 하면 내부적인 Class간의 소통이 안된다
내부적으로는 소통이 되고 외부에는 노출안되게 하는 키워드는
Friend라는 키워드이다
내부적으로는 Class끼기 친하게 지내고 외부에는 공개방지 한다
그래서 위의 그림의 두번째 것과 같이 되는 것이다
윈도우폼의 크래스모듈을 아래와 같이 바꿔준다


'Public Class UNO_ExchangeRate
Friend Class UNO_ExchangeRate  
	....
	....
End Class


그런데 환율값은 어디서 갖여 오는가..
WebService라고 하는 것이 있다
이것은 다양한 곳에서 제공되는 웹상에서 오고 가는 XML형식의 화일이다
여러분의 웹페이지에 아래와 같이 주소를 치면

http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=KRW&tocurrency=USD

한국과 미국의 환율값을 xml형식으로 웹페이지에 보여주게 된다
이곳에 접근하고 이렇게 아래와 같이 얻어 내는 XML화일을 사용하는 것이다

<?xml version="1.0" encoding="UTF-8"?> <double xmlns="http://www.webserviceX.NET/">1081.54</double>

그러니..위의 써버는 우리의 것이 아니니 해당써버에서 에러가 나면
당연히 값을 갖여 오지 못한다
아무튼 환율값이 안나타나면 위의 웹써비스의 써버에서 에러가 난것으로
(대개가 접속수가 폭주할때..)
보시면 된다
목적은 COMAddIn을 만드는 방법에 관한 것이니까..!!

두번째 설치 화일 다운로드

그러니 위의 설치화일로 실행하면서 환율이 안나타나면
써버상의 에러로 보시면 된다

아래의 모듈에 코드에 대한 설명을 달아 놓았으니
각자 좋은 COM AddIn을 만드는데 성공하시고 많은 기능을 확장하여
보시기 바란다

***[LOG-IN]***