PROGRAMMING WORKSHOP

COMAddIns | VSTO

진행하면서 이전 화일의 내용을 추가만 하는 것이 아니라
계속 수정도 하고 있으니, 잘 관찰하셔야 한다

소루션을 만들다 보면 컨트롤이 계속 추가 된다



사용자에게 어떤 컨트롤은 무엇에 사용되는지 간단하게
설명하는 메시지가 나타나게 하는 것이 좋다
이런 것을 한 곳에서 프로그래밍적으로 처리하도록 하는 습관이 좋다
이벤트프로시져에서는 작업을 콘트롤하는 구문이나
실제작업은 다른 프로시져를 호출하는 것만 있게 하는 것이 좋다
그래야 별도의 프로시져를 다른 이벤트에서도 활용할수도 있고
코드관리가 쉬워진다



ToopTip을 만드는 내용은 컨트롤이 추가되면서 이곳에서
관리가 되면 편리할 것이다

Sub setToolTips()
	Dim oTips As New System.Windows.Forms.ToolTip
	oTips.ToolTipTitle = "EXCEL_VSTO"
	oTips.SetToolTip(Me.btnCreateTableForm, "기본정보를 입력할 테이블을 만듭니다")
	oTips.SetToolTip(Me.btnFillSampleDatas, "쌤플데이타를 채웁니다")
End Sub

빨강색이 ToopTip을 만들어주는 대상이 되는 콘트롤 명이다
VB.Net에서 배열을 표현할때 한 줄로 하는 것 보다는
아래와 같이 줄바꿈으로 처리하면 가독성이 좋아진다
이때, VB.Net에서는 배열내의 배열요소는 줄바꿈문자(_)를 사용하지
않아도 된다는 것이 VBA와 달리 편리하다

Dim sFields As String() = {GANTT_FLD_WBS,
			   GANTT_FLD_ID,
			   GANTT_FLD_TASK_NM,
			   GANTT_FLD_START_DATE,
			   GANTT_FLD_END_DATE,
			   GANTT_FLD_DUR,
			   GANTT_FLD_AMOUNT,
			   GANTT_FLD_INCHARGE,
			   GANTT_FLD_OTHER}

엑셀의 상수명은 본래 VBA에서도 아래와 같이 입력해도 된다
그러나 엑셀은 그냥 상수명만 넣어도 자체 상수이니까 알아 먹는다
하지만 VB.Net에서는 엑셀의 개체명이나 상수명은 정상적인 경로(아래 회색부분)를
적어 주지 않으면 알아먹지 못한다는 것이
VBA에서 VB.Net을 하려고 할때 처음에 쪼금 당황하는 부분이다
하지만 조금하면 감이 잡힌다

With rTable
  .BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlHairline)
  .Borders(Excel.XlBordersIndex.xlInsideVertical).Weight = Excel.XlBorderWeight.xlHairline
  .Borders(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlDouble
  .HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
End With

두번째 버튼(쌤플데이타)를 크릭하면 다음 내용을 분석하고
최종적으로 oGantt 크래스모듈의 oGantt.fillSampeDatasIntoTable() 를
호출하여 테이블에 쌤플데이타를 채워넣는다

 Private Sub btnFillSampleDatas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFillSampleDatas.Click
	If oGantt Is Nothing Then  _
	
	' oGantt가 생성되어 있지 않다면, 테이블 양식이 아직 안만들어진 상태
	' 왼쪽버튼을 크릭하여 양식을 만든후 실행하라는 메시지후 중단
	MsgBox("테이블를 만든후 시도하세요", , PROJ_NAME) : Exit Sub
	
	' 실행중 원인불명의 에러가 날수도 있으니
	' 항상 중요한 작업을 진행할때는 Try~Catch문사용습관
	Try
	
	' 시트에 정보를 주욱 입력하여 나갈때는
	' Application개체의 EnableEvents = False 로 하여 이벤트중단습관이 좋다
		oApp.EnableEvents = False
	
	'양식테이블을 활성화하고..
		oGantt.shtBasicData.Activate()
	Catch ex As Exception
	
	'에러가 나면 Catch브록에서 메시지 띄우고 아웃
	'이때 EnableEvents = True 로 해주고 아웃하여야하고
		oApp.EnableEvents = True
		MsgBox("[테이블만들기]버튼을 크릭하여 작업목록시트를 준비하시고 하세요", _
		, PROJ_NAME) : Exit Sub
	End Try
	
	' 시트확인하였으니 다음 Try브록에 하고자 하는 본작업을 
	' 호출실행한다 
	Try
		oApp.EnableEvents = False
		oGantt.fillSampeDatasIntoTable()
	Catch ex As Exception
	
	' Finally브록은 Try문에서 에러가 나면 무엇이 나던 꼭 실행하라!!라는 구문 
	Finally
		oApp.EnableEvents = True
	End Try
End Sub

위와 같이 버튼등의 이벤트프로시져에서는 직접작업은 배제하고
작업을 위한 조건분석과 준비작업정도를 수행하고
본래의 작업은 별도의 프로시져나 별도의 개체의 메소드에게 시키는 습관이 좋다
쌤플데이타를 만들기 위하여
프로그래밍적으로 하여도 좋지만, 실무적으로 어떤 유형의 프로젝트를
수행후 같은 유형의 프로젝트가 발생할때 이전에 사용하였던
프로젝트의 정보테이블을 다시 불러서 편집하여 사용하는 것이
바람직 할 것이다
그런 상황을 감안하여 , 쌤플데이타를 텍스트화일로 써버에 폴더를
하나 만들어서 여러 유형을 저장하여 사용하도록 하였다
참고로..
아래 쌤플데이타를 크릭하면 텍스트화일로 저장된 내용을 볼수 있다

쌤플데이타 /"http://uno21.com/admin/unoweekly/scheduledatas/gantt_webdesign.txt"

위의 내용을 엑셀 통합문서에서 열고 싶다면

Sub GetTextFileOnServer() Workbooks.OpenText "http://uno21.com/admin/unoweekly/scheduledatas/gantt_webdesign.txt" End sub

웹페이지의 내용은 읽기전용으로 열린다
아래의 VB.Net VSTO쌤플 프로젝트에서는 써버상에 쌤플데이타정보를 놓지 않고
자원정보에 놓고 진행하도록 한다
VB.Net이 VBA와 다른 점은 자원정보의 활용을 이야기할수 있다
위의 링크에서 오른쪽마우스로 크릭하여 다른 이름으로 저장하여
텍스트화일을 받은후..
VB.Net프로젝트의 프로젝트속성창의 Resources탭에서 그림과 같이
다운 받은 텍스트화일을 삽입하면 프로젝트내의 정보가 된다



이렇게 하면 자체프로젝트의 재산이 되지만
많은 정보를 담는다면 외부에서 끌어 들이는 것이 효율적이다
여기에서는 강좌용으로 내부자산화일로 사용을 하도록 한다
텍스트정보를 갖여 오려면 만약 웹써버에서 갖여올때는

Dim oWebClient As New Net.WebClient Dim sFile As String sFile = oWebClient.DownloadString("http://uno21.com/admin/unoweekly/scheduledatas/gantt_webdesign.txt")

와 같이 Net.WebClient개체로 간단하게 갖여 올수도 있지만
자체 Resources에서 텍스트화일을 갖여 오려면

sFile = My.Resources.gantt_webdesign

와 같이 역시 간단하게 sFile이라는 문자열변수에 갖여 올수 있다



clsGantt 크래스모듈에 쌤플데이타채우기 메소드를 아래와 같이 합니다

Sub fillSampeDatasIntoTable()
Dim shtBasic As Excel.Worksheet
Try
	shtBasic = Me.shtBasicData
Catch ex As Exception
	MsgBox("기본시트를 만든후 크릭하세요!", , PROJ_NAME)
	Exit Sub
End Try
Dim sFile As String = ""

Dim oWebClient As New Net.WebClient
Try
	'sFile = oWebClient.DownloadString("http://uno21.com/admin/unoweekly/scheduledatas/gantt_webdesign.txt")
	
	' 데이타를 웹써버에서 갖여 오지 않고 프로젝트 Resources에 넣고 
	' 문자열 정보를 얻어와 작업한다
	
	sFile = My.Resources.gantt_webdesign
Catch ex As Exception
	MsgBox("인터넷이 연결되지 않았거나..속도가 느려서 중단합니다")
	Exit Sub
End Try
' 얻어온 문자열을 줄바꿈문자(vbCrLf)로 배열로 나누어서(Split함수)
' ToList 속성으로 VB.Net의 List(Of T) 개체로 만든다
Dim oTaskList As List(Of String) = Split(sFile, vbCrLf).ToList
Dim iNext As Integer = 0
Dim datStart As Date = Nothing
Dim sRow As String()
With shtBasic.Range(GANTT_BASIC_TBL_START_CELL)

	' oTaskList 집합체(List(of T))를 순환하면서 한줄씩 읽어 들인다
	For Each oX As String In oTaskList
		If oX <> "" Then
			iNext += 1
			
			' 행단위로 배열을 만든다, Split함수로..
			sRow = Split(oX, "|")
			
			' 배열요소값을 각각의 셀에 옮긴다
			.Offset(iNext).Value = sRow(0)
			.Offset(iNext, 1).Value = sRow(1)
			.Offset(iNext, 2).Value = sRow(2)
			
			' 셀에 숫자를 문자형식으로 넣으면 에러표시가 나타난다, 이것을 안보이게..
			' 실은 당장은 에러표시가 안보이지만 나중에 다시 또 나타난다
			' 숫자인데 왜 문자로 표시하느냐고 엑셀이 지나치게 민감하게 반응한다
			For iError As Integer = 1 To 9
				.Offset(iNext).Errors(iError).Ignore = True
				.Offset(iNext, 1).Errors(iError).Ignore = True
			Next
			
			' 문자열정보로 된 숫자를 처리하므로 정상적인 숫자로
			' 변환시키는 것이 좋다 ..
			If sRow(3) <> "" Then .Offset(iNext, 3).Value = DateValue(sRow(3))
			If sRow(4) <> "" Then .Offset(iNext, 4).Value = DateValue(sRow(4))
			If sRow(5) <> "" Then .Offset(iNext, 5).Value = CLng(sRow(5))
			If sRow(6) <> "" Then .Offset(iNext, 6).Value = CDbl(sRow(6))
			.Offset(iNext, 7).Value = sRow(7)
			.Offset(iNext, 8).Value = sRow(8)
			Dim sDate As String = .Offset(iNext, 3).Value
			If sDate <> "" Then
				If datStart = Nothing Then
					datStart = DateValue(sDate)
				Else
					If datStart > DateValue(sDate) Then
						datStart = DateValue(sDate)
					End If
				End If
			End If
		End If
	Next
	Me.TableNewRange = .Offset(iNext + 1).Resize(, Me.iFldCount)
	Me.TableNewRange.Select()
End With
End Sub

숫자가 텍스트화일에 저장이 되면
엑셀로 옮길때 텍스트형식으로 받아 들여서 계산이 여의치 않게
되는 경우가 많다
이럴때는 정상적인 유효한 숫자타입으로 바꾸어 주는 것이 위의
작업에서 중요한 것이였다
웹페이지등에서 정보를 얻어올때도 이런 경우가 많다
항상 문자열정보를 정상적인 숫자정보로 변환시키는 것에 관심을 갖으셔야 한다
VB.Net에서 List(Of T)는 T가 다양한 타입의 정보를 의미한다
VBA 에서 Collection 개체로 생각하시면 되지만 , 좀더 많은 속성과
메소드를 제공하여 주어서 무척 편리한 것이니, VB.Net에서 가장 먼저
친해져야 할 집합체개체이다

차근 차근 Uno_weekly AddIn 화일의 기능을 하나씩 만들어 가보자
여기까지, 테이블양식, 테이블에 쌤플정보채우기 까지 했다
아래화일을 설치할때 , 이전 버전 모두 지우시고, 하시고!!!

***[LOG-IN]***