PROGRAMMING WORKSHOP

.Net FrameWork|Google.GData.Calendar_1

스마트폰, 아이폰등에 들어있는 일정관리App등을 통하여
입력하는 정보는 대개가 지정한 포털싸이트의 써버에
저장이 되기도 하고 또는 Google싸이트에 자동저장된다
이렇게 남의 써버에 저장된 정보를
여러분의 컴퓨터상에서 엑셀로 불러 들여 오고 싶은 것이
일반적일 것이다

이런 포탈싸이트..검색싸이트는 또한 개발자들을 위한
API(application programming interface)를 제공하지 못하면
살아 남지 못한다
VSTO를 사용하면 .Net FrameWork의 자원을 활용하게 되고
그런 포탈싸이트에서 .Net FrameWork와 협력할수 있는 라이브러리를
제공하게 되어 있는 것이다
Yahoo나 Google등의 개발자 코너에 들어가면 다양한
그들의 웹정보를 데스크탑 소루션개발자들을 위한 라이브러리를
제공하는 것이다
아래의 그림과 같이 http://code.google.com/apis/calendar/로 가서



Calendar Data API를 크릭하여 이동하여 .Net에서
구글에서 제공하는 라이브러리의 메뉴얼이 있다
이것을 보고 작업을 하면 되는데
물론 이곳에서 라이브러리(.Net Client Library)를
하나 다운 받아서 설치하여야 한다
설치하여야할 화일명은 http://code.google.com/p/google-gdata/downloads/list페이지의
[Google Data API Setup (1.7.0.1).msi]
설치하면 VisualStudio로 작성된쌤플도 있고
(아쉽게도 C#으로 작성되어있으나..별것 아니다..
프로그래밍언어는 하나를 알면 요령은 마찬가지다)
더불어서 필요한 .Net FrameWork용 라이브러리들이 설치된다
이것을 불러서 VSTO에서 작업을 하면 되고
제공된 오브젝트의속성이나 메소드를 보려면
위의 그림의 개발자 코너의 예문들을 잘 보시고 활용하면 된다
포털의 생명은 이런 것을 보다 쉽게 만들어서 제공하는 것이 생명이니..
최대한 간략하게 만들려고 노력한다

그렇게 하고
엑셀 Add-in소루션을 만들던지..아니면 엑셀 단일 통합문서소루션을
만들던 마찬가지 요령이다

설치하면 개발하고자하는 프로젝트를 열고 이곳에서
해당 라이브러리를 끌어 들이도록 한다..


이러면 구글에서 제공된(열심히 자원을 투자하여개발한)오브젝트들을
.Net FrameWork의 자원같이..
엑셀의 자원같이 사용하게 되는 것이다

스마트폰이나..아이폰의 App을 개발할때도 역시 마찬가지다
만약 시간관리프로그램같은 것을 모바일용으로 개발한다고 하더라도
위와 같은 요령으로 제공되는 API를 사용하게 되는 것이니
이 페이지에서의 것을 엑셀에서 구현하면
(물론 제공되는 API가 모바일용 혹은 데스크탑용등으로)
구분이 될수도 있을 것이나..)
스마트폰이나 아이폰의 App개발도 반은 하는 셈이다

그럼..그냥 엑셀에서 VBA모듈시트의 참조를 하면
위의 구글 자원을 참조할수 없나요??!@#
라는 질문이 있을 법하다..
위의 DLL은 COM용 DLL이 아니고 .Net용 DLL이라서
참조가 되지 않는 것이다

그래서 Visual Studio의 VSTO를 활용하려고 하는 것이다

이제 WorkBook 소루션을 하나 만든다
Add-in화일은 엑셀이 열릴때마다 실행되어 화일을
복잡하게 만들경우가 많다
상황에 따라서 Add-in으로 할 것인지 아니면 단독 문서용으로
할것인지 잘 선택하는 것이 좋을 것이다
여기에서는 그냥 통합문서단위의 소루션으로 만들자
아래의 그림과 같이 UserControl을 하나 추가 시키고
UserControl상에 카렌다 콘트롤하나 놓고
정보를 입력할 텍스트박스몇개와
구글계정용 패스워드와 아이디용 텍스트박스를 준비한다



UserControl의 모듈시트를 열고
선언부에 아래와 같이 NameSpace를 불러들인다

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports Google.GData.Client
Imports Google.GData.Extensions
Imports Google.GData.Calendar

Imports oXL = Microsoft.Office.Interop.Excel

구글에서 제공하는 라이브러리를 사용하겠다는 소리다

또한 oXL= Microsoft.Office.Interop.Excel를 해주지 않으면
엑셀의 상수등을 사용할때도 일일이 족보를 줄줄이 적어주어야 한다
예를 들면
Range("A1")의 테두리선을 치고 싶을때
엑셀에서 하면
Range("A1").BorderAroud xlHairline
와 같이 하면 되지만
VSTO에서는 엑셀자체가 외계인이다..
그러니..xlSolid같은 상수를 전혀이해하지 못한다
그래서 이렇게 표현해주어야 한다
Range("A1").BorderAround(Microsoft.Office.Interop.Excel.XlBorderWeight.xlHairline)
일일이 매번 엑셀의 자원을 사용할때마다 이런짓을 하던가..
아니면
선언부에 선언하면
Imports oXL = Microsoft.Office.Interop.Excel
앞으로 oXL을 사용하면 이것이 곧
Microsoft.Office.Interop.Excel
이라는 NameSpace를 나타내는 것이니 그렇게 알라는 명령이다

위와 같이 준비작업을 한후
아래의 그림과 같이 구글 카렌다의 정보를 갖여 오는
인터페이스를 만든다



사용하는 구글계정은 그림의 텍스트박스에 각각 입력하여야
구글의 해당계정의 정보를 갖여오는 것은 상식적으로
아실 것이고
한번 입력한 구글계정은 워크시트의 한곳에
저장해 두어..
매번입력하는 피곤함이 없도록 한다
한번 입력하면 해당 계정정보가 정해진 범위에 저장이 되고
다음번에 열때는 이 범위의 정보를 읽어서
텍스트박스에 나타나게 하고
또 특별히 다른 계정을 입력하고도 해당 계정의
것을 갖여 올수 있도록 하는 것이 편리할 것이다

구글에서 정보를 갖여 오면 ..
엑셀세상이니까..입맛에 맞게 정보를 뿌려줄 테이블을
예쁘게 만들어 낼수 있을 것이다..

워크샵에서 초기에 만들었던 [일정관리]를 이것과
결합시킨다면 아주 좋은 소루션이 될 것이다



옵션을 두개를 두어서 두가지 형태의 테이블양식을
준비하여도 좋고 ..좀더 많이 만들어 볼수도 있을 것이다
엑셀고수들이 엑셀내부에서의 엑셀을 다루는 것은
다른 개발자들이 감히 쫓아오기 힘들 것이다

그러니..엑셀로 프로그래밍을 배운 사람은 훨씬이런 소루션에
파워가 있을 것이다
여기에서는 제일 간단하게 아래와 같이 해보자


그림과 같이 웹상의 정보를 엑셀시트에
항상 유지하고 있을수 있는 것이다

이 내용을 좀더 충실히 이해하고 구현해보시고 싶으면
첫번째하여야할 일이 Google계정을 하나 만들고 그곳의
자신의 일정관리를 위한 카렌다에 정보를 몇개 입력하시는것이
우선 할일이다..

이제 위에서 UserControl을 통하여 구성한 콘트롤중
구글에서 정보를 갖여올 버튼을 크릭하면
어떤 일이 진행되는지를 보자

우선 한달치씩 갖여 오는 것으로 한다
나중에는 검색어를 통하여 해당검색어의 내용은 모두 갖여 오거나
다양한 형태의 정보를 갖여오는것..
이것을 일반적으로 Query라고 한다
SQL에서 얻어 들었던 Query.. 쿼리가 그런 의미다
버튼을 크릭하면

Private Sub btnFetchDatas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFetchDatas.Click
  setSheet()
  refreshFeed()
End Sub

두개의 프로시져를 호출한다
setSheet
는 정보를 뿌려줄 시트를 하나 만들고
이름을 지어주고 손님맞을준비(구글정보를 받아들일)를
하게 한다
이것은 그냥 엑셀작업이라고 생각하시면 된다
엑셀프로그래밍 잘하면 그냥 먹구 들어가는 부분이다
다른 언어만을 한 사람은 이짓을 하려면 애먹는다
이런 것에 능숙한 여러분은 이미 많은 능력을 갖고 있는 것이다
그냥 자신의 능력을 확장하려고 하지 않고 있을 뿐이다
능력이 아직 모자르다면 이미 싸이트에 있는
uno-xl-programming이나 uno-weekly와 항상 감각을
같이 하고 있으면 된다

Sub setSheet()
    Try
        shtToUse = Globals.ThisWorkbook.Worksheets("GoogleCalendar")
        shtToUse.Cells.Clear()
    Catch ex As Exception
        shtToUse = Globals.ThisWorkbook.Worksheets.Add
        shtToUse.Name = "GoogleCalendar"
    End Try
    Globals.ThisWorkbook.Application.ActiveWindow.DisplayGridlines = False
    With shtToUse.Cells
        .Font.Name = "맑은 고딕"
        .Font.Size = 9
        With .Range("A1:B1")
            .Cells(1).Value = "일시"
        End With
        .Range("C1").Value = "제목"
        .Range("D1").Value = "내용"
        .Range("A1:D1").Interior.ColorIndex = 15
    End With
End Sub

VBA를 하다가 VisualBasic에 와서 가장 반가운 것은
Try~Catch~End Try문이다
이것이 없는 VBA에서는 에러에 대한 대책을 세우기 위하여
고생을 좀 하였지만
VB에서의 Try~Catch문은 에러 통제가 엄청간편해진다
위에서 보듯이
GoogleCalendar라는 이름의 워크시트를 shtToUse변수에 옮긴다
만약 지정한 워크시트가 없다면 에러가 나게 되어있다
만약 VBA서 하려면
On Error Resume Next
하고
Set shtToUse=지정한 이름의 워크시트..
하고 나서..
If Err.Number>0 Then
Set Worksheets.Add
End If
와 같은 번거로운 것을 히야 한다
Try~Catch문은 이미 Java나 JavaScript, C#등의 언어에서
사용하던 편리한 것이였던것을
VB에서도 채용하게 된것이다
말그대로...이 구문을 TRy 해바라...그리고
Catch문에서 에러가 났으면 ex라는 변수(실은 오브젝트)에 에러의 내용이 잡힌다
에러가 나면 Catch문 이하로 자동 코드실행이 이동되는 것이다
2007버전의 워크시트함수인 IFERROR함수 같이 간결하다고 생각하시면 될 것이다
그것만 다르고 다 익숙한 내용이다
또 하나..편리한 것은
오브젝트변수에 값을 넣을때 항상 Set문을 써야 했었지만
VB에서는 없다!!!
그냥 일반 변수하듯히 하면 된다

위와 같이 구글에서 정보를 받아다가 뿌려줄 워크시트와 범위를
준비하고..
정보를 갖여 오면 된다

현대의 프로그래밍은 ..프로그래머라면..
정보를 갖여 온하고 하기 보다는,
이렇게 표현해야 할 것이다
정보를 갖고 있는 오브젝트를 갖여 온다고 표현하는 것이
맞는 말이다
모든 IT의 테크닉을 다룬다고 하는 것은 정보를 관리하는 오브젝트를
다룬다고 하는 의미이다
오브젝트의 개념이 안잡히신다면
최근 시작한 [오브젝트지향적 영어]라는
쌩뚱맞은 컨셉을 통하여 VBA와 연계한 영문법을 이야기할
uno-weekly의 Front페이지를
주욱 보시면 도움이 될 것이다

아무튼 Google의 Calendar의 정보를 관리하는 오브젝트를 갖여오는
구문은 아래와 같다..
정말 간단하기 짝이 없다
단...!!!오브젝트라는 것의 컨셉이 잡혀야 한다

Dim service = New CalendarService("CalendarSampleApp")
여기에서 CalendarService는 맨처음에 선언한 선언부의 NameSpace소속이다
만약 NameSpace를 선언하지 않았다면 아래와 같이 작성하여야 할것이다
Dim service = New Google.GData.Calendar.CalendarService("CalendarSampleApp")
Google.GData.Calendar라고 하는 것은 오브젝트도 아니고
아무것도 아니다..
이것은 오브젝트를 관리하는 하나의 구역을 NameSpace라고 하는 것이다
NameSpace라고 하는 것은 예를 들어서
오브젝트를 생성하는 크래스가 myClass라고 하는 것이
두개가 있다면 어떤 크래스를 의미하는지 헷갈린다
그래서 앞에 주소를 하나(어떤 구역을 표현하는)만들어주면
아래와 같이 된다
ZoneOne.myClass
ZoneTwo.myCalss
와 같이 앞에 주소를 하나 만들어 주면 헷갈리지 않게 된다
세상에 다양한 오브젝트를 만들어주는 크래스명이 생기면
똑같은 이름이 수도 없이 생길것이다
그러니 헷갈리지 않게 각크래스를 관리하는 지역주소를
하나씩 만들어 놓고 크래스를 설계하게 되는 것이다
아무튼..
위와 같이 CalendarService는 Google.GData.Calendar라는
주소하의 크래스인 셈이다
그렇게 하여 크래스를 New 하게 되면 service라는 변수에
CalendarService라는 오브젝트를 생성하게 되는 것이고
이놈이 모든 정보를 갖고 있게 되는 것이다

구글의 정보를 갖여 오려면 계정확인을 해야 한다
이것을 해주는 메소드도 CalendarService의

service.setUserCredentials(userName, passWord )

setUserCredentials 라는 이름을 갖고 있다
이곳에 사용자이름과 패스워드를 문자열 변수로 전달하면
이런 계정으로 데이타를 갖여오겠다고 이야기하는 셈이다

사람들은 엑셀이 왜 좋은지를 잘 모른다
아무곳에서나 정보를 갖여 오면
정보를 뿌려줄 곳이 엑셀이 없다면 참 참담하다..
뭘 한참을 만들어야 할것이다..
또한 뚝딱거리고 만든다고 해도 표준화된 것이 아니고
사람마다 만드는 것이 다를것이다
엑셀이라는 세계적으로 표준화된 도구가 있다는 것은
참으로 다행스러운 일이 아닐수 없다
그래서 우노가 미친놈같이 엑셀이야기를 하는 것!!!
이런 것을 알기나 하려냐!@#@!


이제 정보를 갖여 오기 위하여
카렌다 컨트롤에서 해당월의 시작날자와 종료날자를 읽어서
변수에 담고
구글메뉴얼에 있는대로 해당 주소를 문자열변수에 담고

Dim datStart As Date = oCalendar.SelectionStart.Date
datStart = DateSerial(datStart.Year, datStart.Month, 1)
Dim datEnd As Date = DateAdd(DateInterval.Day, -1, DateAdd(DateInterval.Month, 1, datStart))

Dim calendarURI As String = "http://www.google.com/calendar/feeds/default/private/full"

 query.Uri = New Uri(calendarURI)
 query.StartTime = datStart
 query.EndTime = datEnd
Dim oDates As Date()

query변수(구글의 EventQuery오브젝트)의 URI속성에
Uri오브젝트를 전달하고
query변수의 StartTime과 EndTime속성에 값을 전달한다
그리고

Try
    Dim calFeed As EventFeed = service.Query(query)
    With shtToUse.Range("A1")
        .Select()
        With Globals.ThisWorkbook.Application.ActiveWindow
            .ScrollRow = 1
            .ScrollColumn = 1
            .SplitRow = 1
            .FreezePanes = True
        End With
        For Each oQ As EventEntry In calFeed.Entries
            iColor = IIf(iArray Mod 2 = 0, 6, 2)
            writeCells(.Offset(iX, 0).Resize(2), iColor, oQ.Times(0).StartTime.Date)
            writeCells(.Offset(iX, 1).Resize(2).Cells(1), iColor, TimeValue(Mid(oQ.Times(0).StartTime, 12)))
            writeCells(.Offset(iX, 1).Resize(2).Cells(2), iColor, TimeValue(Mid(oQ.Times(0).EndTime, 12)))
            writeCells(.Offset(iX, 2).Resize(2), iColor, oQ.Title.Text)
            writeCells(.Offset(iX, 3).Resize(2), iColor, oQ.Content.Content)

            ReDim Preserve oDates(iArray)
            oDates(iArray) = oQ.Times(0).StartTime.Date
            iX += 2
            iArray += 1
        Next
        With .CurrentRegion
            .Font.Name = "맑은 고딕"
            .Font.Size = 9
            .Columns.AutoFit()
            .Columns(3).columnwidth = 20
            .Columns(4).columnwidth = 50
            .Cells(1).resize(, 2).merge()
        End With
        If iX > 0 Then
            modMain.oCalendar.BoldedDates = oDates
        End If
    End With
Catch ex As Exception
    MsgBox("구글사용자계정을 확인하시고 다시하세요!")

End Try

위의 빨강색은 구글의 오브젝트와 관련속성이나 메소드이고
검정색은 엑셀이다
그러니 세상은 이렇게 조합을 하면서 살아 가는 것이다..
그렇지 않으면 살아 남기 힘들다..
쏘스를 공개한다고 하는 것은 이렇게
상호 시스템을 존중하고 시스템간의 정보를 주고 받도록
한다는 의미가 되는 것이다
공짜로 그냥 개념없는 사람들에게 쏘스를 퍼주는 것이 아니다!!

위에서 배열에 날자를 담은 것을
modMain.oCalendar.BoldedDates = oDates 와 같이 전달하는 것은
UserControl상의 MonthCalendar 콘트롤의 BoldedDates 속성에
배열을 전달한 것이다
대개의 것들이 이제는 단일정보를 받지 않는다..
배열이던가 아니면 정보를 오브젝트에 꽁꽁묶어서 전달한다..
위와 같이 날자로 구성된 배열을 카렌다의 BoldedDates속성에
전달하면..



그림과 같이 한꺼번에 카렌다컨트롤의 해당날짜가
굵은 표시로 나타난다..

다시 한번 정리하여 이야기 한다면
엑셀의 파워를 Visual Studio 라는 .Net FrameWork를 기반으로 하는
통합개발도구에서 다른 언어의 개발자들도 활용하게 하기 위하여 엑셀과
중간역활을 하는 VSTO라는 Add-on을 추가하게 된다
VSTO라는 것에 의하여 VB내에서 엑셀을 포함한 Office의 모든
프로그램을 다른 개발언어(VB,C#등)적 시각으로 활용하게 되는 것이다
그래서 위에서 코딩하는 것은 엑셀중심이라기 보다는
VB나 C#등의 중심의 개발이 되는 것이다
그래서 VB 쪽에서 볼때는 엑셀도 Google의 오브젝트와
마찬가지로 외계인인 셈이다

그래서 엑셀을 사용할때 구글과 마찬가지로 아래와 같은 긴..
경로를 통하여 접근하게 되는 셈인 것이다

Microsoft.Office.Interop.Excel

물론 이렇게 불러온 NameSpace하에서는 모두 엑셀과 VBA에서
사용한 내용에서 하나도 변함없이 사용하면된다
VBA와 엑셀로 이제 공부..다~~~했다 하시는 분들에게는
아주 좋은 도전거리들이 되는 셈이다
이미 VBA를 통하여 컴퓨터프로그래밍이나 VB에 대한 감각은 모두 갖추었고
엑셀을 통하여 오브젝트라는 감각 또한 모두 갖추었고..
.Net FrameWork의 수많은 오브젝트들을 기반으로
또 다른 편리한 오브젝트들로 확장하게 되는 셈이다

엑셀과 VBA만으로 엄청난 파워를 낼수 있는 것이니..
혹시라도 이 페이지를 읽으면서..어이구 ..이거 내가
접근할 목표물은 아니군!!!
지레 겁먹고..포기 하지 마시기 바란다
어디까지나 이 싸이트는 [엑셀과 VBA가 중심]이다
그냥 이것은 덤으로 추가되는 내용들이다
엑셀과 VBA를 목표로 잡고 계속 공략하시기 바란다
그냥 엑셀을 하면 다른 정보의 세계의 확장성이 뛰어나겠구나!!
만을 아시면 된다!!

세상에 모바일이 IT의 전부가 된 것 같이 떠든다..
모바일용 App개발자를 양성하겠다고 국가적 예산을 세우고
떠든다..
엑셀과 VBA로 프로그래밍의 감각을 키운다면
얼마던지 다른 Device, Interface에 접근하는 것은 간단해진다
프로그래밍이라는 것은 같은 컨셉이니까..
문제는 쌩짜로 모바일의 App개발자가 되겠다고 달려드는것은
무모한 짓들이다..
만약 그렇게 개떼몰리듯이 몰려들었다가..
몇개월후에 별볼일없다고 판정이 날때..
개떼같이 달려들었던 인력의 자원은 거적을 쓰게 되는 셈이다
그러나 엑셀과 VBA는 투자를 해도 하나도 소실되는 것이 없다
엑셀과 VBA는 세계 어는 곳에서나 활용하는 도구이니..
하나도 헛되이 사라지는 자원이 없다..
그냥 엑셀과 VBA는 일잘하는 도구 그 자체이니까!!
가끔 !@@!@#도 모르면서 탱자거리는 것을 보면서
그냥 바보..조다들!!!이라는 소리만 가끔 나온다!!^^


단지 VBA는 자신이 만들어서 사용하는
사용자정의 오브젝트(Class Module)을 활용하는 습관이
들 기회가 별로 없다는 것이 ..다른 현대의 프로그래밍컨셉에
접근하는데 장애물이다
그래서 우노는 쓸데없이 자꾸 Class Module을 사용하여
접근을 시켜드리려고 노력하는데 너무 어려워 한다

그래서 workshope의 [일정관리 소루션]같은 것은 일부러
Class Module을 활용하여 만들어 놓는 것이다
언젠가는 왜 자꾸 복잡하게 시리 Class Module을 사용하는지
의미를 접수할것이라고 생각하니까..
그래야 VB.Net이나 .Net FrameWork등등 위의 Google등에서
제공하는 크래스들을 별 어려움 없이 다룰수 있는 습관이
들게 된다!!

아래 엑셀화일에서
아주 간단하게 어떤 목적을 위하여
Class Module을 사용하여
사용자정의 오브젝트를 만드는 것과
일반적인 모듈시트에서 만드는 것을 살펴보시기 바란다

***[LOG-IN]***

위의 간단한 화일이
잘 이해가 가지 않을수도 있다
크래스모듈과 오브젝트를 현대의 프로그래밍에 사용하게 된것은
아주 정리 정돈을 잘하는 프로그래머들의 생각에서 나온 것일 것이다
코드를 작성하다 보면 아주 방만하여 져서 작성한 자신도
뭐가 뭔지 모른다..
그러다 보니..
코드를 좀 정리..정돈..찾아보기 쉽고 관리하기 쉽고 뭐 그런 방법이
없을까???라는 생각에서 출발 된 것이다
여러분이 작성하는 코드가 일주일후에 드려다 보니까..뭐가 뭔지모르겠다!!
라고 느낄때 크래스모듈을 사용해보는 시도를 시작할때이고
또 다양한 기능을 소화시키려다 보기까
이..기능 저기능에서 같은 것을 반복하여 코딩한다
아..이것을 한곳에 모아 놓고 관리 할수 없을까??라는 생각이 들때
크래스모듈을 선택하면 된다
회사에서 길동이가..저기 말이야...세금만 처리하는 뭐..없을까??
이 부서나 저부서에서 공통으로 사용하는 세금만 처리하는 로직만
모아 놓는 것이 없을까????
그럴때 크래스모듈을 선택하시기 바란다

아무튼 VB.Net, .Net FrameWork, 그리고 다른 라이브러리를
이야기 하다 보니 크래스모듈의 훈련이 절실하다고 다시 느끼게 된다

그렇게 느끼도록 하는 것이 UNO-ProgrammingWorkshop의 목적이다

스마트폰이나 아이폰에서 구글의 일정정보를 조회하는 것과
웹페이지와 엑셀에서 구현하는 것의 속도는
어느 것이 가장 빠를까??
당연히 모바일폰이 가장 빠르다..
이유는 모바일폰은 조회를 담당하는 오브젝트와 관련
비쥬얼처리 오브젝트들만 장착되어 있으면 된다..
하지만 엑셀은 엑셀자체의 다양한 오브젝트들이 항상같이
떠있다..
그러니 속도가 모바일의 속도를 기대하시면 안된다
역시 웹페이지도 마찬가지다..다른 다양한 기능을 포함하고
있기 때문에(다양한 오브젝트를 장착하고 있기때문에) 그런것!!

그러니 치고 빠지는 모바일의 기동성과
엑셀에서 검색하고 나름대로 엑셀의 기능을 활용하여
분석하고 정리하는 분석력을 같이 갖추면 될 것이다
각각의 기능을 이해하고 잘 활용하는 것이 또한 개체지향적
사고가 되는 것

누가 이것 좋다그러면 개떼 몰리듯이 우..한곳에 몰리고
그런 것은 균형과 조화가 깨진 집단지향적사고이다

철저하게 개체중심적,개체지향적일때
조화와 균형이 유지되는 것이다
철저하게 개체지향적이기때문에 컴퓨터프로그래밍의 오브젝트와
오브젝트간의 협업이 가능해지는 것이다

어영부영 사는 사람들에게는 미안한 이야기지만
이기주의적이 아닌 철저한 개체중심적일때
개인의 행복과 가치도 보장이 되는 것이다
이기적인 것과 개체중심,지향적인 것에 대하여 헷갈림이 불행의 시작이다

위에서는 정보를 불러서 보았고
엑셀에서 구글에 정보를 보내서 저장해보자
아래 그림의 버튼에 아래와 같이 작성한다


 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    Dim sTitle As String = Me.txtTitle.Text
    Dim sContent As String = Me.txtContent.Text
    Dim sUserName As String = Me.txtUserName.Text
    Dim sPassWord As String = Me.txtPassWord.Text
    
    If String.IsNullOrEmpty(sTitle) Or String.IsNullOrEmpty(sContent) _
        Or String.IsNullOrEmpty(sUserName) Or String.IsNullOrEmpty(sPassWord) Then
        MsgBox("제목과 내용과 계정을 입력하세요!!")
        Exit Sub
    End If
    
    Try
        Dim service = New CalendarService("CalendarSampleApp")
        service.setUserCredentials(sUserName, sPassWord)
        Dim entry As New EventEntry
        entry.Title.Text = sTitle
        entry.Content.Content = sContent
        Dim eventTime As New [When](DateTime.Now, DateTime.Now.AddHours(2))
        entry.Times.Add(eventTime)
        Dim postUri As New Uri("https://www.google.com/calendar/feeds/default/private/full")
        Dim insertedEntry As AtomEntry = service.Insert(postUri, entry)
        MsgBox("[" & sTitle & "] 제목의 정보가 저장되었습니다")
        Me.txtTitle.Text = ""
        Me.txtContent.Text = ""
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
 End Sub

저장을 하던 정보를 불러오던
구글의 CalendarService를 초기화하고
setUserCredentials에 패스워드와 아이디를 매개변수로 전달하여
계정확인하고
새로 작성할 정보를 단순히 데이타를 보내는 것이 아니고
이런 오브젝트에 담아서 보내세요!!!!라는 구글의 메뉴얼에 따라서
정보를 담아갖고 갈..EventEntry 오브젝트를 생성하고
이 EventEntry가 갖고 있는 정보를 담아갈 속성
Title 속성과
Content 속성에 각각 사용자가 텍스트박스에 입력한 값을 전달
그리고 언제 부터 언제까지 벌어진 일이냐는 정보를
When 오브젝트에 두개의 정보..이것은 초기화할때 그냥
매개변수로 전달하여도 된다..왜 그러냐구..그들이 그렇게
만들어서 공개한 오브젝트이니까.. 그렇게 사용하면 된다
이곳에 시작시간을
.Net FrameWork의 DateTime오브젝트의 Now속성값..즉
전달하는 이 순간의 시간에서..
언제까지냐 하면..
DateTime.Now.AddHours(2)
말 그대로 현재부터 2시간이후까지 라고 그냥 정해준것이다
이것을 물론 사용자 인터페이스를 통하여 시간을 언제까지
할 것인가를 변수로 받아서 이곳에 전달해도 되는 것이고
물론 VBA의 시간처리하는 함수들을 위의
DateTime오브젝트 대신 사용해도 된다..
이왕이면 VB.Net환경이니까..좀더 편리한 오브젝트를 찾아서
사용하는 것이 흥미롭겠지!!!
위에서 만든 시간에 대한 오브젝트를
또 위의 대표오브젝트..즉 몽땅 정보를 담고 출발할
오브젝트 EventEntry (Entry변수)의 Times 속성에
전달한다..즉 Times속성즉 오브젝트인셈이다
이것의 Add메소드로 추가하여 ...
오브젝트가 오브젝트를 담고 다니는 것은
엑셀에서 수도 없이 보았지 않은가??!!!
엑셀의 챠트오브젝트는 줄줄이 오브젝트를 델고 있지 않은가??
이제 어디로 보낼것인지..
New Uri(주소..이것도 그들이 정해준 주소..)
웹의 주소도 문자열로 보내면 좋을텐데..왠 또 오브젝트를 생성한다
왜냐면 그들이 이 오브젝트타입을 받겠다고 버티니까..
그렇게 전달해 주어야 한다
거의 표준화된 주고 받는 정보오브젝트라고 생각하시면 좋겠다
.Net FrameWork를 엑셀에서 왜 사용하냐??!!!는 가장 큰 질문의
답은 아마도 .Net FrameWork의 .Net, .Web등등의 네트워크환경을
마음대로 활용한다는 것이 가장 큰 답중의 하나일 것이다
물론 아주 많은 기술을 추가적으로 엑셀에 사용하지만
네트워크환경의 떡주무르듯이 하게 되는 것은
앞으로 Mobile환경의 핵심이고 그래서 하게 되는 것이다

이렇게 만든 주소정보를 담은 Uri오브젝트(postUri변수)를 아래의 마지막
구문에서 끝난다

Dim insertedEntry As AtomEntry = service.Insert(postUri, entry)

위의 구문은 그냥 아래와 같이 처리해도 된다

service.Insert(postUri,entry)

와 같이 하면 끝나는 것인데..
왜 위와 같이 또 AtomEntry라는 오브젝트를 선언하고 값을 받는가???
정보를 입력한후 결과에 대한 다양한 정보를 또
AtomEntry오브젝트가 받아내는 것이다..
우리는 그냥 정보를 입력하는 것이 일이 였으니까..
service.Insert까지 하면 업무수행완료된 것이다

너무 한 페이지에 너무 긴가???!!
모바일등의 단문의 글을 즐기는 것에 대한 반항(??^^)으로
우노는 아주 긴 문장을 쓰기로 했다..
어떤 면에서 한가지 주제를 이페이지, 저페이지 옮겨 보는 것도
불편하고 귀찮을 것 같다..
여러분들의 컴퓨터 메모리 성능을 믿으면서..
계속 가자!!!

아래의 그림과 같이 Try~Catch문의 편리함을 생각해 보자



전달할 것 다 전달했는데 에러가 나면 내쪽에서 잘못했는지..
구글쪽의 문제인지 알수가 없다
복합적으로 작성된 구문이니..
그림과 ex즉 Exception오브젝트..이것은 VBA의 Err오브젝트나
마찬가지다..
에러가 나면 이놈이 모두 정보를 수집해서 갖고 있다
가장 간단한 것은 Catch브록에서
MsgBox ex.Message
를 실행시켜면 된다
에러가 나면 이것이 실행되고 그렇지 않으면 그냥
Try브록내의 것을 실행하고
일부러 패스워드같은 것을 틀리게 입력하면 써버오류라고
나타나게 된다..
아무튼..써버오류!!이면 구글쪽 써버상의 처리과정에서
에러가 난셈 인것이다!!

그런데 매번 할때마다 구글아이디와 패스워드를
입력해야 하나??!!
무식한 짓이다
이제 또 우리의 힘!!!엑셀의 힘..을 사용하면 되는 것이다

아무래도 페이지를 바꿔서 해야겠다..
아래 화일은 VisualBasic 쏘스코드이다
화일 리스트는 아래와 같다

ThisWorkbook.vb
ThisWorkbook.designer.xml
ThisWorkbook.designer.vb
modMain.vb
UserControl1.vb
UserControl1.resx
UserControl1.designer.vb

소루션화일을 몽땅 올려 보았자..각자의 소루션에는
자신만의 소루션설정에 대한 키가 있어서 불필요한 일이다
위의 화일을 여러분의 VB소루션에 넣거나 같은 이름의 화일을
바꿔끼시는 것이 좋을 것이다

물론 Google의 라이브러리를 여러분의 PC에 세팅시키지 않았다면
위의 것을 삽입하고 해 보았자..에러가 당연히 나는 것은
아시겠고...참조하는 Dll화일이 없으니까!!!

페이지 바꾸어서 좀더 개선해 나가보자

***[LOG-IN]***