PROGRAMMING WORKSHOP

VSTO

2007버전에 대한 이야기를 계속하려다가..
2007버전부터는 VSTO와 엮어야 재미있을 것 같아서
VSTO페이지를 하기로 하였다
200버전에서 부터나오는 리본메뉴는 VSTO등을 의식한 새로운 메뉴시스템이라고
해도 과언이 아니다...그래서 VSTO를 시작하도록 한다

VSTO가 무엇인가??
VSTO를 하여야 하나??
그들은 비스토 라고 발음 한다
엑셀 VBA에 능숙하다..그럼 다음 단계는 무엇인가??
VSTO가 다음 단계라고 생각하면 좋겠다
그래서 VSTO를 시작하려고 한다
VSTO는 Vistual Studio Tools For Office 의 약자다
엑셀을 하는 사람으로서의 측면보다는
Visual Studio로 소루션들을 개발하는 사람들의 측면에서 볼때
다양한 통합소루션들을 만들다 보니..엑셀의 뛰어난 기능(오피스의 다른 프로그램포함)을
다시 만든다고 하는 것은 바보같은 짓이다
그래서 엑셀의 기능과 Visual Studio도구를 통한 .Net FrameWork 의 파워풀한 기능과
짬뽕을 시킨다면 얼마나 좋을까??
이상적이지 않은가..
그래서 태어난것이다
그럼 엑셀과 오피스의 다른 프로그램을 다루던 사람들의 측면에서는
VSTO를 하려면 Visual Studio..와 친해져야 하는 셈이다
Visual Studio쪽에서 엑셀을 다룰 것인가..??
엑셀측면에서 Visual Studio를 다룰 것인가??
결국은 하나의 소루션이 탄생하는데 어느 측면에서 보나 마찬가지다
그럼 Visual Studio는 도대체 뭔가??
이것은 언어도 아니고 그냥 통합 소루션개발도구 인 것이다
이곳에서는 Visual Basic언어도 사용할수 있고 C#언어도 사용할수 있고..
J#언어도 사용할수 있고..언어의 장벽이 없는 것이다
문제는 MS의 가장 큰 엔진인 .Net FrameWork 에서 제공하는 파워를 적절히
활용하는 것이다

.Net FrameWork는 당초 웹을 겨냥하고 Asp.Net..Ado.Net등과 같이
웹을 위한 기능들을 제공하는 라이브러리로 출발 하였으나
현재는 MS의 메인 엔진이 된 셈이다
앞으로는 모든 윈도우의 개발엔진은 이 .Net FrameWork의 엔진이라고 해도 된다
이 엔진이 제공해주는 기능을 엑셀 VBA에 능숙한 사람들이
무언가 부족하였던 것을 이것에서 제공받으면 파워풀한 소루션들을
만들어 나갈수 있을 것이다

하나의 마케팅전략중에 하나 일수도 있을 것이다
VBA프로그래밍을 이미 충분히 맛을 들여 놓은
전세계 수백만 VBA개발자들을 겨냥하여..
이렇게 더 좋은 기능이 지원되는데 통합개발도구인 이리루 (Visual Studio)와서
같이 놀자!!
그러려면 Visual Studio를 준비하셔야지!!!
그래서 많은 VBA개발자들이 콧웃음을 쳤지만..
세월은 가고 자원풍부한 MS는 시치미 뚝떼고 계속 발전시켜나가고..
당연히 가게 되어 있는 것이고..
우리도 이제는 같이 가야 할 단계가 아닌가 싶다

도대체 뭔 기능을 지원 받는다는 것이야???라는 의문이 있을 것이다



엑셀에서 엑셀이 갖고 있는 오브젝트에 접근하여 오브젝트를 활용하듯이
.Net FrameWork의 오브젝트들(라이브러리)을 참조하고 활용하면 되는 것이다
예를 들어서 엑셀에서 Button을 만들기 위한다면
ActiveSheet.Buttons.Add
라고 오브젝트순서래도 입력하여 수행하듯이
.Net FrameWork에서는 아래의 그림과 같이 접근하여 만드는 것이다



오피스의 모든 프로그램의 최상위오브젝트는 Application이지만
.Net FrameWork의 최상위오브젝트라이브러리는 System이다
원리는 마찬가지 인것이고..
너무나도 많은 끌어다가 사용할수 있는 부속품들이 널려있는 셈이다
엑셀의 오브젝트들을 보물창고라고 하듯이
.Net FrameWork는 보물창고를 넘어서 만물상이다
현대의 프로그래밍을 위한 부속품들은 모두 들어있다
물론 MS를 기반으로 하는 것들이다

만약 엑셀VBA가 몸에 익어서 이제 지루하다 싶으신분들에게는
정신이 버쩍 드는 좋은 것들이 널려있다

VSTO로 개발을 하면 가장 눈에 뜨이는 특징은 무엇인가?
첫째 ...엑셀화일을 아무리 까보아도 코드가 안보인다
DLL화일로 별도로 생성이 되어있는 것이니..보안이 특별히 유지 되어야 하는
상품에서는 각별히 요구되는 사항일것이다
둘째...2007버전이후의 리본에 메뉴를 처리하기가 까다롭지만..
VSTO에서는 이것을 엑셀의 UserForm다루듯이 실실 콘트롤만 옮기고 코딩하면 된다
세째...NetFrameWork의 풍부한 자원을 엑셀의 자원 같이 활용한다

위의 3개만 해도 충분히 매력적인 것일 것이다

문제는 Visual Studio라는 도구를 컴퓨터에 깔아야 한다는 점이다
현재 2008이고 곧 2010이 나온다

불행히도 공짜로 배포하는 Visual Studio Express같은 것에서는
VSTO를 지원하지 않는다

몇주동안 uno-weekly에서 질문에 답을 해주었던
테니스동호회 께임 관리도구를 VSTO로 하나 만들어 놓고[위의 그림]
이것을 갖고 하나..하나 설명해 가나 보도록 하자

아마도 왜 우노가 쓸데없이 엑셀에서 Class모듈을 사용하라!!!
그래야 다음에 확장에 들어가면 보람을 느낀다고 했던 점을 절실히
느낄 것이다
간단한 것을 짜더라도 격식을 맞추어 짜는 습관이 좋다!!
라고 하는 것은 모든 것이 개체지향적접근이니..
사용자정의 개체를 만들어서 사용하던 습관을 갖였다면 좀더 쉽게
접근하게 된다

이코너는 VBA에서 VB.Net으로 졈프하는 코너다

당초 주간강좌의 제목은 [엑셀로 VB를 배웁시다]였다..
그러니 VB로 졈프가 충분히 가능하고 당연한 것이다

참으로 편리하고 파워풀함을 기대해 보자

한번에 먹기에는 벅차니까..차근 차근..나가도록 하자

VSTO에서 사용하는 언어는 VBA가 아니다
VB를 사용하게 된다
혹은 .Net FrameWork를 기반으로 하기때문에 VB.Net이라고 호칭한다
VBA나 VB나 같은 종자이지만 많은 것이 VBA보다는 파워풀하다
예를 들어서 에러를 체크하는 기능이 VBA에서는

On Error Resume Next
On Error Goto X
등등과 같은 방법을 사용하였었다
그러나 VB에서는 몇가지가 다르고 같은 요령이다

Try
....어떤 구문을 넣고 에러가 나면 Catch쪽으로 자동으로 흘러간다
Catch ex As Exception
....ex라는 변수가 에러 내용을 갖고 있는 것이다
...MsgBox ex.message
...와 같이 해 주면 에러의 관리가 훨씬 부드러워진다
End Try

또한 오브젝트를 변수에 옮길때(Assign)
Set이라는 키워드를 사용하지 않는다
예를 들면

Dim rX As Range
Set rX=Range("A1")

이라고 Set을 오브젝트타입변수를 사용할때 하여야 했었다
그러나 VB에서는

Dim rX As Range
rX=Range("A1")

과 같이 그냥 일반변수를 Assign하듯이 하면 되니까..좋다
또 숫자를 증가시키거나 감소시킬때
Dim iX As Integer
iX=iX+1
이라고 하기도 하지만 VB.Net에서는
Dim iX As Integer
iX+=1
혹은 감소시킬때는
iX-=1
이라고 간략하게 표현한다..쟈바스크립트나 C나 C#등의 것과 같은 방식으로 한다

그리고 VB.Net은 훨씬 엄격하다
VBA같이 대강 봐주는 것없다
Dim iX
라고 선언하면 에러를 낸다
VBA에서는 Dim iX 라고 하면 알아서 Variant타입으로 해석해주지만
VB.Net은 더럽게 따진다
반드시 변수의 타입을 명시해주어야 한다
Dim iX As Integer
과 같이 타입을 정해주지 않으면 안된다
또한 변수를 선언해도 초기화를 시켜주지 않아도 별로 반가워하지 않는다



그림과 같이 unused local variable...사용자않은 지역변수 라는 표시가 뜬다
그래서 아래와 같이 해주는 것이 상식이다
Dim iX As Integer=0
혹은
Dim iX As Integer
iX=0
과 같이 초기화를 습관적으로 하여야 한다
이런것이 귀찮을지는 몰라도 습관이 들면 참으로 편리함을 알게된다

조금씩 작성해 나가도록 하자..오늘은 여기까지..

함수의 경우도

Funtion X() As Integer
....어떻게 어떻게 계산하여
...X=어떤 값
End Function

이 VBA 문법이지만 VB.Net에서는

Function X() As Integer
....어떻게 어떻게 계산하여
....Return 어떤 값
End Function

물론 VB.Net에서도 위의 것이 되기는 된다
왜냐하면 VB.Net도 VB에서 부터 출발하여 발전된 것이기때문에
예전 문법(예전 문법은 VBA와 모두 같았었다)을 수용해 주는 것이다
발전되는 흐름은 C나 Java등의 문법의 좋은 점을 계속 수용하는 방향으로
가는 것이다

Visual Studio가 너무 광범위하니 이것 저것 다 이야기할수는 없는 것이고
우리가 하고 싶은 엑셀을 Visual Studio에서 어떻게 개발하는지의 핵심을 보도록 하자

아래의 그림은 영문버전 Visual Studio이지만 메뉴는 같은 것이니까..
가름 하시면서 보시면 될 것이다



그림과 같이 오피스의 모든 것을 Visual Studio내의 하나의 소루션으로 만들어
나갈수 있는 것이다
엑셀 2007버전의 통합문서단위의 프로젝트를 만들기로 한다
Add-In버전으로 만들 경우에는 엑셀의 모든 통합문서에 영향을 미치는 소루션을 만드는 것이고(추가기능화일) 통합문서단위로 할때는
여러분들이 하나의 통합문서에 VBA로 하나의 통합문서를 자동화하는 것과
마찬가지의 것이 된다

다음의 대화상자는



새로운 통합문서로 하겠는가??
아니면 사용하고 있는 통합문서로 하겠는가??를 선택한다
이 말인 즉은..
기존의 VBA로 무언가 만들어 놓은 통합문서를 VSTO로 좀더 추가적
기능을 보태고 싶을때 기존통합문서를 선택하면 되는 것이고
또 이것은...VBA에서 VSTO로 작성한 코드도 호출할수 있고
VSTO에서 VBA코드를 호출할수도 있다는 소리다

즉 VSTO에서 생성되는 DLL화일의 바이너리 코드와 VBA코드가 상호
호출이 가능하다는 소리가 되는 것이다



그림과 같이 통합문서 하나가 생성된다
이곳에 자동화기능을 만들어 가면 된다..
다음 페이지에서 보자

 

***[LOG-IN]***