Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

External Datas+UserForm - DAO_005

UserForm 콘트롤에 Access테이블정보채우기

  • SQL문의 WHERE 절
  • 콘트롤의 Value와 Text
  • UserForm
  • ComboBox
  • ListBox
  • Image콘트롤
  • LoadPicture()

이번 페이지에서는 사용자정의 폼의 콘트롤에
Access데이타베이스의 정보를 채워 넣어보자

DAO를 익히면서 UserForm(사용자정의대화상자)을 실제적으로 어떻게 활용할지
실용적 숙달의 목적도 이번 DAO코너에 있다는 점,잘 이해하시고
눈으로만 주욱 훑지 말고 직접 하나,하나 만들어 보시기 바란다

아래의 그림과 같이 콤보상자에 NorthWind.mdb의 Categories테이블의
CategoryName휠드의 정보를 찾아서 UserForm이 초기화될때
채워 넣고



콤보상자의 분류명을 선택하면
해당분류의 그림을 Image콘트롤에 넣어주고
DAO를 시켜서 Access테이블의 해당분류의 상품명을
찾아서 리스트박스에 채워 넣는 작업을 해보자
DAO의 파워풀함을 느끼게 될 것이고
해당 테이블의 Primary Key 가 왜 필요한지 느끼게 되도록
하는 것이 이페이지의 목적이기도 하다

사용자정의 대화상자가 초기화 될때 아래의 Initialize이벤트프로시져에서
상품분류명이 나타나는 콤보상자를 채워준다

Private Sub UserForm_Initialize()
Dim oRst As Recordset
Dim oDB As Database
Dim sSQL As String
'DAO로 데이타를 갖여오는 구문은 지극히간단하지만 '효과는 파워풀한것이다 Set oDB = OpenDatabase(ThisWorkbook.Path & "\northwind.mdb") sSQL = "SELECT categoryID,categoryName FROM Categories" Set oRst = oDB.OpenRecordset(sSQL) 'Recordset오브젝트..oRst변수에 담긴것은 메모리상에 '가상의 테이블이 만들어진것을 의미하는 것이다 '이 가상의 테이블에서 정보를 뽑아서 엑셀에 퍼담으면 되는것이다
Me.cboCategory.ColumnCount = 2 Me.cboCategory.ColumnWidths = "0;5" bStopEvent = True 'Recordset오브젝트를 순환하면서 '언제까지 순환하느냐 하면 'Recordset이 끝날때까지..순환한다는 조건표현식(Not oRst.EOF ) '이 만족할때까지.. '매번 순환할때마다 oRst(0)은 CategoryID 'oRst(1)은 CategoryName을 콤보상자에 담는것이다 Do While Not oRst.EOF Me.cboCategory.AddItem oRst(0) Me.cboCategory.List(Me.cboCategory.ListCount - 1, 1) = oRst(1) oRst.MoveNext Loop bStopEvent = False oRst.Close oDB.Close Set oRst = Nothing Set oDB = Nothing End Sub

SQL문이 중요하다
Categories테이블에서 categoryID와 categoryName 두개의 휠드값을
얻어오도록 하는 것이다
사용자정의 대화상자의 cboCateogry콤보상자에 categoryID와 categoryName
두개의 값이 담겨지게 되는것이다
그래서 cboCategory.ColumnCount=2 로 해 주었고
categoryID는 사용자의 눈에는 보일 필요 없으니까
cboCategory.ColumnWidths="0;5"로 하여 준 것이다
폭이 0이 되니 안보이게 되고 CategoryName만 보여지게 된다
그리고 cboCategory.Value는 첫번째열의 값(숨겨진열) CategoryID값을
말하는 것이고
cboCategory.Text는 눈에 보이는 두번째값 CategoryName값이
나타나게 된다


다음은 콤보상자의 값을 바꾸었을때 발생하는 Change이벤트프로시져에서
바꾸어진 값에 따라서 ListBox의 값을 갱신해주고
Image콘트롤에 해당 그림을 올려 주는 일을 한다
Image콘트롤의 그림은 위의 콤보상자의 cboCategory.Text값을
읽어서 처리하고 ListBox(목록상자)의 목록은
cboCateogry콤보상자의 숨겨진 열의 값 cboCategory.Value값을
사용한다는 점을 염두에 두시고..

Private Sub cboCategory_Change()
Dim sFileName As String
'picture

If bStopEvent Then Exit Sub
sFileName = Me.cboCategory.Text
sFileName = ThisWorkbook.Path & "\"  _
    & Replace(Trim(sFileName), " ", "") & ".jpg"

'Image콘트롤의 그림을 설정하기 위하여 LoadPicture함수를
'사용한다는 점 ..기억하시고!!
    
Me.imgCategory.Picture = LoadPicture(sFileName)
Me.imgCategory.AutoSize = True

'fill listBox
Dim oRst As Recordset
Dim oDB As Database
Dim sSQL As String
Set oDB = OpenDatabase(ThisWorkbook.Path & "\northwind.mdb")

'중요한것은 Product테이블에서 productName을 갖여 오는데
'어떤 ProductName을 갖여 오느냐???라는 조건을 주어야 한다
'이때 조건을 주는 SQL문의 조건절이 WHERE 문인것이다
'WHERE categoryID=cboCategory.Value
'즉 위의 콤보상자의 숨겨진 값 categoryID에 해당 하는 
'상품명을 찾아내는 것이다

sSQL = "SELECT productName FROM Products WHERE categoryID="  _
    & cboCategory.Value
Set oRst = oDB.OpenRecordset(sSQL)
Me.lstProduct.Clear
Do While Not oRst.EOF
    Me.lstProduct.AddItem oRst(0)
    oRst.MoveNext
Loop
oRst.Close
oDB.Close
Set oRst = Nothing
Set oDB = Nothing

End Sub

중요한것은 cboCategory콤보상자에 Primary Key값을 넣어둔
이유를 알면 된다..
상품목록을 찾기 위한 조건값으로 사용하기 위하였다는 점..
만약 lstProduct라는 목록상자의 값을 크릭하면 또 다른 작업을
하기 위하여서는 lstProduct도 역시 products테이블의
productID값을 보관하여 두는 것이 필요하게 될것이다
다음 페이지에서 다루어 보도록 하자

데이타베이스..관계형데이타테이블에서는 기본테이블에는
(혹은 마스터테이블이라고도 한다) 항상 기본키값이 있어야 하고
이것을 참조하는 테이블은 기본테이블과의 연결고리..Key값을
보관하는 휠드가 있어야 하고 이것을 Foreign Key라고
부른다

XLDAO_005.