PROGRAMMING WORKSHOP

Access와 Excel의 연동_3|UserForm 인터페이스꾸미기,Class모듈의 활용

앞페이지에서 엑셀로 구성한 관계형테이블을 바탕으로
UserForm에 표현을 해보았다
이제 애완동물병원에서 진료를 한다고 가정하고 진료정보을 발생하게 하여
저장을 해보자
저장을 하면서 각 관계된 테이블에 어떻게 정보를 정리하는지 관찰 해보자
실은 이런 과정이 굉장히 번거로워보인다고 생각하게 될 것이다
그런생각을 많이 갖으면 갖을수록 억세스 DB의 관계형테이블이 얼마나 편한지 알게 되게 하기 위함이다



딱 3개의 정보만 필요한 것이다
이것을 진료테이블에만 저장하면 된다
고객은 이미 애완동물과 연관이 된 테이블에 있고
진료타입에 대한 정보도 별도의 테이블에 있고
애완동물에 대한 관련정보도 모두 보관되어 있고
그냥 새로 입력하는 3개의 정보가 모든 정보와 관계를 갖게 되는 것이다
그런데 이런 관계를 알아서 모두 관리하는 능력이 억세스 DB에는 있는 것이고
이런 관계를 찾아서 어떤 연결을 신경써야 하는 것이 엑셀에서 VBA로 작업을 할때 필요한 것이
번거롭기 때문에 억세스DB를 활용하고자 하는 욕구가 생기는 것

아무튼 억세스 DB는 잠시 뒤로 미루고, 엑셀로 어떻게 해서든지 해보는 것에 집중하자

테이블이 여러개가 있으면 관리하기가 번거로워진다
엑셀로도 좀 간단하게 풀어가는 방법이 없을까??
이럴때 Class모듈을 사용하면 편리하다
여러테이블이 있지만 하나의 테이블범위이다
형식은 모두 같다..
그런데 일일이 접근할때마다, 시트찾고, 범위찾고,새로입력할 행을 찾고
하는 것이 매 테이블마다 한다고 하는 것은 피곤한 일이다
이럴때 개체를 사용하게 되는 것이고
VBA엑셀에서 사용자정의 개체를 만들려면 Class모듈을 적절히 활용하면 된다
억세스DB와 더불어 Class모듈의 적절한 활용을 할수 있는 좋은 기회가 된다

모듈시트에서 크래스모듈을 하나 삽입하고
이름을 적절히 지어주고(여기에서는 clsTable이라고 하였다)
그리고 아래와 같이 우선 필요한 것을 작성하고...

Option Explicit
'' 전체테이블 세팅
''크래스의 초기화, VB.Net같이 쎄련된 크래스에서는 Constructor 라는 New (.....) 메소드에서 초기화가 편리하지만
''VBA에서는 별도로 프로시져를 하나 만들어서 사용한다
''초기화후....나머지는 이 하나의 값에서 모든 것을
''만들어내게 되어 단순해지고 편리하다
'' Property 프로시져라는 것을 사용하면 좋겠지만... 그냥 Function 프로시져로
'' 원하는 것을 쉽게 얻게 되니까..특별히, Property 프로시져같은것은 생략해도 상관없다
Private TableAll As Range

Sub setTable(sShtName As String)
On Error Resume Next
Set TableAll = Worksheets(sShtName).Range("A1").CurrentRegion
End Sub

'' 전체테이블
Function Table() As Range
Set Table = TableAll
End Function
'' 테이블중 테이타범위만..
Function TableData() As Range
On Error Resume Next
Set TableData = TableAll.Offset(1).Resize(TableAll.Rows.Count - 1)
End Function
'' 테이블중 열머리행만..
Function TableHeadRow() As Range
On Error Resume Next
Set TableHeadRow = TableAll.Rows(1)
End Function
'' 테이블에 새로 행을 추가하려고 할때 새로운 행범위
Function TableNewRow() As Range
On Error Resume Next
Set TableNewRow = TableAll.Rows(TableAll.Rows.Count).Offset(1)
End Function
'' 테이블에 새로행을 추가하려고 할때 새행을 포함한 전체테이블
Function TableWithNewRow()
On Error Resume Next
Set TableWithNewRow = TableAll.Resize(TableAll.Rows.Count + 1)
End Function
'' 테이블에 새로운 추가정보를 입력하기 위한 새로운 행범위
Function TableDataWithNewRow()
On Error Resume Next
Set TableDataWithNewRow = TableData.Resize(TableData.Rows.Count + 1)
End Function
'' 해당테이블의 시트명을 알려주기
Function TableSheetName() As String
On Error Resume Next
TableSheetName = TableAll.Worksheet.Name
End Function
'' 함수대신에 아래와 같이 속성을 사용해도 되지만, 위와 같이 Function으로 (메소드) 를 사용하자
Public Property Get myName() As String
'...
End Property
Public Property Let myName(Value As String)
'....
End Property
  

크래스모듈을 프로그래밍에서 사용한다고 하는 것은
프로그래밍을 하는 개념이 달라진다
크래스모듈은 하나의 커다란 변수라고 보아도 좋다
좀더 지능을 갖춘 변수타입인 것이다
모든 일은 준비작업--->본작업--->정리작업이라는 순서를 갖추어야 일이 잘 진행된다
그런데 VBA에서의 작업은 특별한 준비없이 그냥 줄줄이..생각나는대로 작성하여도 괞찮다
테이블범위에 접근???그거야 그냥 하면서 필요하면 만들어서 사용하면 되지...라는 생각을 갖고
작성해 나가는 것이 대부분이다..
그래서 그렇게 슬렁슬렁 하다 보면, 테이블의 접근의 갯수가 복잡하게 많아지면
뭔가 일관성있게 만들어서 사용하면 이렇게 복잡하지 않을텐데...라고 후회한다
그래서 크래스모듈을 사용하겠다고 하는 것은 준비를 단단히 하고
준비작업을 단단히 하고
프로그래밍을 해나겠다는 철학이 되는 셈이다

지난 화일의 내용의 범위접근하는 내용을 모두 크래스모듈에서 정의한 메소드를
활용하도록 수정하고..
모듈시트에 주석처리하고 비교하였으니 잘 관찰하시면서 뭐가 다른지 보시기를...
UserForm의 인터페이스도 수정할때와 신규저장할때의 모드를 다르게 구별하여
시각적으로 현재 무엇을 하는지 쉽게 인지 하게 하자



***[LOG-IN]***