PROGRAMMING WORKSHOP

VSTO_14 | 재미있는 LINQ_2

LINQ를 갖고 이런 저런 작은 데이타를 처리하는 것을 했었다
실제로 워크시트에 Northwind.mdb에서 얻오온 데이타 시트를 한장 삽입하고
데이타분석작업을 해보도록 하자
처음 VSTO시작할때 준비했던 테니스동호회소루션은 데이타가
너무 단순하여 별로 재미가 없을것 같으니 이데이타 시트로 해보도록 하자



그림과 같이 버튼을 4개를 Runtime으로 생성시키고
DatePicker콘트롤 두개를 만들고
데이타시트를 한장 심어 넣고
그리고 데이타시트의 내용 담아 놓을 Class모듈을 하나 만들고
시작한다

간단하게 시작하고 재미있으면 더 확장하여 나가도록 하자

워크북이 로딩할때
초기화 작업부터 해보자
데이타상의 마지막날짜와 최초날짜를 찾아서 넣어주는 것이
DatePicker의 MaxDate와 MinDate설정을 하는데 도움이 된다
그래야 쓸데없이 사용자가 DatePicker에서 있지도 않은 날짜의
범위를 잡는 것을 방지 할수 있으니까..

VB.Net에서는 데이타타입이 까다롭다..
그래서 좋은 것이다
만약
데이타시트상의 날짜열을
Application.Max(날짜열범위) 를 하였다면
결과값은 어떤 타입일까???
Date타입일까..아니면 다른 타입일까???
Double타입이다!!
Double타입을 Date타입으로 바꾸려면
CType(Double, Date)
하면 에러가 난다..
"Double 타입을 Date타입으로 변환할수 없습니다"
이런 에러가 VBA를 하다가 VB.Net으로 발전을 하려고 할때
많이 겪는 좌절이다..
뭐야..!@# 워가 이렇게 까다로와!!!
그러나 본래가 처음에 까다로운 것이 뒤가 깨끗하고 좋은 것이다

DatePicker콘트롤을 하나는 이름을 startDate로 하고 다른 하나는
endDate로 하여 아래와 같이 초기화 시킨다

    Dim rDateCol As Excel.Range = Globals.Sheet1.Cells(1).currentregion.columns(1)
    Dim datMax As Date = Date.FromOADate(Globals.ThisWorkbook.Application.Max(rDateCol))
    Dim datMin As Date = Date.FromOADate(Globals.ThisWorkbook.Application.Min(rDateCol))
    With oUserControl.startDate
        .Left = 20
        .Top = 200
        .Width = 150
        .MaxDate = datMax
        .MinDate = datMin
    End With
    With oUserControl.endDate
        .Left = 20
        .Top = 230
        .Width = 150
        .MaxDate = datMax
        .MinDate = datMin
    End With
    

Com오브젝트와 관계를 유지하면서 Com쪽 데이타를 .Net에서 원하는 타입으로
바꿔준다는
Date크래스의 FromOADate..
From OLE Automation To Date 의 약자의 메소드다
아무튼 요따위 것들이 있으니까..에러가 나거나 버벅거리면
죄다 이유가 있는 것들이니..차분이 생각하고 찾아서 변환시켜가면
VB.Net은 여러분의 VBA와 같은 것이 될 것이다

이렇게 하면 DatePicker에서 날짜를 선택할때 유효하지 않은 날짜는
나타나지 않게 되는 것이다

아래의 그림과 같이 UserControl에
DatePicker 콘르롤만 두개 대강 아무곳에 놓고
RunTime에 위치등을 잡아주는 것이 편리하고 프로그래밍하는 맛이 난다



아래와 같이 WorkBook이 로딩될때

버튼의 ForeColor,BackColor 값을 넣을때 아래와 같이
System.Drawing NameSpace에서 Color리스트를 볼수 있다
이곳에서 적당한 색상을 선택하면 다양한 색상을 표현할수 있을 것이다

서식을 위한 값들은 System.Drawing 네임스페이스속의 다양한 오브젝트들의
도움을 받으면 된다
System은 Default 네임스페이스 이니까 생략해도 된다

Button의 Tag속성을 이용하면 또한 편리하다..
나중에 어떤 버튼을 크릭하였는지 Tag값을 읽어서 처리하면 간단하니까.

코드소스를 모두 화일로 올리자니 화일이 크니
코드만 아래에 모두 옮겨 놓았으니 복사/붙여넣기를 하면서
살펴 보시기 바란다

몇가지 중요한 것을 살피면
.Net FrameWork에서는 Enum ..열거상수를 재미있게 처리해주어서 아주 편리하고
코딩속도를 높여준다
아래와 같이 열거상수를 선언하면..이것도 역시 오브젝트로 처리된다

Public Enum WorkType
.....직원별 = 1
.....상품분류별 = 2
.....상품별 = 3
.....판매기간별 = 4
End Enum

어떤 버튼을 크릭하여 해당 버튼의 Tag값에 따라서
시트명 직원별,상품분류별,상품별,판매기간별 중에서 하나를 활성화하는데
아래와 같이 간단하게 처리되는 것이다
System하의 Enum오브젝트

Worksheets(System.Enum.GetNames(GetType(WorkType))(oBtn.Tag - 1)).activate()
만약 System.Enum.Getnames(GetType(WorkType))
이 없다면 아래와 같이 VBA에서 하듯이 하여야 할 것이다
Worksheets(Choose(oBtn.Tag, "직원별실적", "상품분류별실적", "상품별실적")).activate()

마찬가지로 버튼에 마우스를 올려 놓으면 MouseEnter이벤트
마우스를 다른 곳으로 이동하면 MouseLeave이벤트
이때 MouseEnter할때 라벨콘트롤에 어떤 작업을 할 것인지 메시지를 띄우려고 한다면
Enum오브젝트가 없다면 아래와 같이 장황하게 널어 놓아야 한다

Select Case oBtn.Tag
......Case WorkType.직원별 : sWhat = "직원별 매출집계"
......Case WorkType.상품분류별 : sWhat = "상품분류별 매출집계"
......Case WorkType.상품별 : sWhat = "상품별 매출집계"
......Case WorkType.판매기간별 : sWhat = "판매기간별 집계"
End Select
oUserControl.Controls("Label1").Text = sWhat
그러나 Enum오브젝트를 활용하면 sWhat변수값을 얻기 위한 일이
아래와 같이 한줄이면 된다

oUserControl.Controls("Label1").Text = System.Enum.GetNames(GetType(WorkType))(oBtn.Tag - 1) & " 집계"

이제 완성된 화일을 다운 받아서 해보시면서 코드를 분석하여 보시기 바란다
초기화 시킬때 시간이 좀 걸리지만..
LINQ의 쌤플을 보여드리려고 하다 보니까..좀 오버디자인된 점도 있으니
감안하여 관찰하시기 바란다

설치하기

엑셀화일다운로드

2007 PIA.msi 화일설치[위의 두개를 차례대로 했는데 에러가 나면 이것 설치]

이 화일은 .Net FrameWork 4.0에서 부터는 .Net FrameWork자체에 포함이 되어
필요없지만 혹시 위의 [설치하기]와 [엑셀화일다운로드]후 실행에서
에러가 나면 다운 받아서 설치하면 된다

이번 화일의 핵심은 LINQ를 사용하여 엑셀시트의 내용을
분석하는 것을 해보는 데 있다
LINQ구문을 잘 보시면 좋겠다

전체코드보기...

***[LOG-IN]***