PROGRAMMING WORKSHOP

VB.Net | VBA에서 VSTO로 옮기면서 디버깅

VSTO가 매력적이라서 VBA의 내용을 모두 VSTO버전으로 바꾸는데
에러가 당연히 수도 없이 발생한다..
에러라고 해서 치명적인 것은 아니고 대부분이 참조에러가 되는 것이다
공연히 죄다 에러로 보이고 하여 첨에는 황당하다
그러나 차분이 살펴보면 별 것이 아니다

또한 VB.Net에서는 .Net 개체언어가 아닌 이전의 VB 6.0(VBA의 모체)에서
사용하던 것들을 모두 받아주니까..문법적으로도 별 문제가 없다
예를 들면 Random값을 만들어 내는 것도
.Net에서 지원하는 Random개체를 사용할수도 있지만..
그냥 이전의 Rnd함수(VBA에서 흔히 사용하는 것)도 여전히 사용할수 있으니
별문제가 없는 것이다

엑셀 VBA에서

Dim rTarget As Range
Set rTarget=Worksheets("MySheet").Range("A1").Value

라는 것이 있다면
에러가 나는 부분은
Dim rTarget As Range
에서 우선 에러가 난다..왜냐면 VSTO입장에서 엑셀은 외계인이다
엑셀에서 워드나 파워포인트를 참조하는 것과 마찬가지의 경우다
그러니 Range개체를 알수가 없다
Dim rTarget As Excel.Range 라고 해야 한다



실제는 Microsoft.Office.Interop.Excel 이지만 그림과 같이 프로젝트를
생성할때 개발환경에서 자동으로
단축 네임스페이스를 만들어 놓아서
Excel을 사용하면 된다

또한 Set이라는 키워드는 VB.Net에서는 없다
그냥 일반변수 선언하듯이 Set이 없어도 된다
또한 변수를 선언하면서 변수에 값을 주어도 된다
이것은 에러 대상이 아니다..선언하면서 주어도 되고 선언후 나중에
값을 주어도 되고..
중요한 것은 타입의 변수를 선언할때는 위와 같지만
실제의 개체를 참조하여 값을 갖어오고나 할때는 현재 소루션상의
프로젝트명으로 경로를 잡아야 한다
아래와 같이
Dim rTarget As Excel.Range=Globals.ThisAddIn.Application.Worksheets("MySheet").Range("A1")
그래서 위와 같이 길게 매번 작성하는 것 보다는
처음 프로젝트가 로딩될때 전역변수로 아래와 같이 초기화하여

Public oApp As Excel.Application=Globals.ThisAddIn.Application

으로 oApp에 엑셀의 Applicaiton개체를 잡아두고

Public oProjectBook As Excel.WorkBook=oApp.ActiveBook

이라고 한후..
oApp와 oProjectBook 변수를 이곳 저곳 필요한 곳에서 사용하는 것이 좋을 것이다
물론 모든 작업이 끝났을때는

oProjectBook=Nothing
oApp=Nothing

으로 죽여 버리는 습관을 꼭 갖고 있어야 할 것이고..
또한 아래의 그림과 같이 빌드를 시키면 모든 에러목록이 뜨게
되니까, 하나하나 찾아서 처리하면 된다



물론 디버깅시작하기 해도 잡지만..VBA에서와 같이 엑셀문서를
보면서 할수가 없으니..꼭 빌드를 해가면서 에러를 처리하고
Start Debugging을 하는 것이 좋다

또한 에러가 아닌 어떤 결과가 원하는지롤 보기 위한것은
물론 디버깅을 하여야 하는데..
아쉽게도 Visual Studio 2008에서는 여엉..엉킨다..
Visual Studio 2010에서는 많이 개선되어 쉽게 중단점으로 이동되어
차례대로 코드상에서 따져보기가 좋은데..
이것도 역시 VBA의 디버깅같이 결과를 통합문서의 인터페이스와
코드창을 왔다갔다하면서 볼수는 없다
세상은 그렇게 이런 저런 아쉬운 것 속에서 무엇을 만들어 가는 것이니..
2010으로 업글 시키시면 좋을 것이다