3강에서는 ADO를 이용하여 엑셀 데이터베이스에 연결하고 Data를 엑셀Sheet로 가져와 보았다.
이번 강에서는 Data를 엑셀Sheet가 아닌 아래 그림과 같이 Form으로 가져와서 수정하고 저장하는 기능을 구현해 보기로 한다.
아래와 같이 따라 해보자.
1. Form만들기
VBA모드에서 Form을 추가하고 아래 그림과 같이 listbox, textbox, command button을 추가한다.
2. 조회버튼 코드 추가
"조회"버튼을 더블클릭하여 다음 코드를 추가한다. 조회버튼을 클릭하면 다음의 코드가 실행된다는 의미이다.
Private Sub cmdUserListInq_Click() Dim userArray() As User Dim recordCount As Integer Dim listData() As String Dim i As Integer '//사용자가 입력한 조건을 selectUsers function에 넘겨주고 결과를 Array로 받는다. userArray = selectUsers(argDeptName:=Me.argTxtDeptName.Value, argUserName:=Me.argTxtUserName.Value) '//조회된 자료가 없으면 Ubound를 이용해서 userArray의 갯수를 check하면 에러가 나므로, 에러 무시하도록 On Error Resume Next를 사용한다. '//Ubound이후에 에러가 나면 처리해야 하므로 Ubound밑에서 바로 On Error GoTo 0를 사용한다. On Error Resume Next recordCount = UBound(userArray) On Error GoTo 0 If recordCount = 0 Then MsgBox "입력한 조건에 해당하는 Data가 없습니다" Exit Sub End If '//리스트에 넣을 배열을 조회된 레코드 갯수만큼의 크기로 초기화한다. ReDim listData(1 To recordCount, 1 To 4) '//조회된 레코드를 배열에 채운다. For i = 1 To recordCount listData(i, 1) = userArray(i).deptName listData(i, 2) = userArray(i).userName listData(i, 3) = userArray(i).id listData(i, 4) = userArray(i).salary Next i '//배열을 리스트에 넣으면 리스트가 조회된다. With frmUser.lstUser .List = listData End With End Sub
3. 저장버튼 코드 추가
"저장"버튼을 더블클릭하여 다음 코드를 추가한다.
Private Sub cmdSave_Click() Dim argUser As User Dim result As JobResult '//입력값 Validation 로직 추가 필요(값이 비었는지, 숫자필드에 문자가 들어오는지 등...) '//저장할 값을 구조체에 넣는다. argUser.deptName = Me.txtDeptName.Value argUser.userName = Me.txtUserName argUser.id = CLng(Me.txtId.Value) argUser.salary = CDbl(Me.txtSalary.Value) '//저장 후 결과값을 받는다. result = updateUser(argUser:=argUser) '//저장후 변경된 내용을 list에 반영하는 로직 추가 필요 '//저장후 결과코드로 정상처리 여부를 판단한다. If result.code = 0 Then MsgBox "저장이 완료되었습니다." Else MsgBox "작업중 에러가 발생했습니다. 아래의 메시지를 확인바랍니다." & vbNewLine & vbNewLine & result.message End If End Sub
4. listbox 코드 추가
Form의 listbox 더블클릭하여 다음 코드를 추가한다. listbox를 클릭하면 아래 코드가 실행된다는 의미이다.
Private Sub lstUser_Click() Me.txtDeptName = Me.lstUser.Column(0) Me.txtUserName = Me.lstUser.Column(1) Me.txtId = Me.lstUser.Column(2) Me.txtSalary = Me.lstUser.Column(3) End Sub
5. 모듈에 코드 추가
아래 소스코드를 Module에 붙여 넣는다.
첫번째 소스는 필요한 구조체를 선언하는 부분이고,
'사용자정보를 구조체로 선언한다. Type User deptName As String userName As String id As Long salary As Double End Type '//작업결과를 받기 위해 구조체를 선언한다. Type JobResult code As Long message As String End Type
두번째는 위의 소스코드에서 Data를 가져오는 부분이다.
Public Function selectUsers(ByVal argDeptName As String, ByVal argUserName As String) As User() Dim rs As New ADODB.Recordset Dim strSQL As String Dim strConn As String Dim i As Integer Dim j As String Dim userArray() As User '//조회조건을 설정할 문자열 변수 Dim strDeptName As String Dim strUserName As String '// 조회조건 설정 - 입력된 값이 있을 때만 SQL문의 조건절을 만든다. If argDeptName = "" Then strDeptName = "" Else strDeptName = " AND [부서] LIKE '%" & Replace(argDeptName, "'", "''") & "%'" End If If argUserName = "" Then strUserName = "" Else strUserName = " AND [이름] LIKE '%" & Replace(argUserName, "'", "''") & "%'" End If strSQL = "SELECT [부서],[이름],[사번],[급여]" & _ " FROM [사원정보$] " & _ " WHERE [이름] > '' " & strDeptName & strUserName 'Excel을 Database로 사용 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & ActiveWorkbook.Name & ";" & "Extended Properties=Excel 12.0;" rs.Open strSQL, strConn, adOpenStatic, adLockReadOnly, adCmdText If Not rs.EOF Then '//자료가 존재하면 loop를 돌면서 userArray에 결과를 넣는다. ReDim userArray(CLng(rs.recordCount)) i = 1 Do Until (rs.EOF = True) userArray(i).deptName = rs("부서").Value userArray(i).userName = rs("이름").Value userArray(i).id = rs("사번").Value userArray(i).salary = IIf(IsNull(rs("급여").Value), 0, rs("급여").Value) rs.MoveNext i = i + 1 Loop End If rs.Close Set rs = Nothing selectUsers = userArray End Function
6. Data저장기능 구현
Data를 저장하는 Function이다. 저장버튼을 누르면 이 Function이 실행되어 Data가 저장(Update)된다.
Function updateUser(argUser As User) As JobResult Dim db As New ADODB.Connection Dim strSQL As String Dim strConn As String Dim result As JobResult Dim updateCount As Long On Error GoTo ErrHandler '//DB연결 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & ActiveWorkbook.Name & ";" & "Extended Properties=Excel 12.0;" db.Open strConn strSQL = "UPDATE [사원정보$] " & _ " SET [부서] = '" & argUser.deptName & "'," & _ " [이름] = '" & argUser.userName & "'," & _ " [급여] = " & argUser.salary & _ " WHERE [사번] = " & argUser.id db.Execute CommandText:=strSQL, recordsaffected:=updateCount If updateCount = 0 Then result.code = -1 result.message = "입력한 사번에 해당하는 Data가 없어서 업데이트 되지 않았습니다." Else result.code = 0 End If db.Close Set db = Nothing updateUser = result Exit Function '//에러처리 ErrHandler: If (Err.Number <> 0) Then result.code = Err.Number result.message = Err.Description updateUser = result End If End Function
7. 조회버튼에 모듈코드 연결
마지막으로 아래 코드를 Module에 붙여 넣고 Excel sheet위에 추가한 "조회"버튼에 이 모듈코드가 실행되도록 연결한다.
Public Sub callFrmUser() frmUser.Show End Sub
위의 내용만으로 완전한 기능을 구현할 수 없다. Form에 추가된 textbox등은 이름이 위의 코드와 일치해야하고, 또 위에 언급되지 않은 부분이 있을 수 있으므로 자세한 내용은 첨부를 다운로드 받아서 확인해 보자.
첨부(실습용 파일) : 4강_VBA를_이용하여DB조회_저장.xlsm
[ 엑셀에서 Database사용하기 강좌 목록 ]
- 18강 - VBA로 MS SQL Server에 연결하여 Data처리하기(Stored Procedure로 조회)
- 17강 - VBA로 PostgreSQL에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)
- 16강 - VBA로 MariaDB에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)
- 15강 - VBA로 MySQL에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)
- 14강 - VBA로 Oracle DB Server에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)
- 13강 - VBA로 MS SQL Server에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)
- 12강 – VBA로 Access DB에 연결하여 Data처리하기(ADO를 이용하여 Data삭제)
- 11강 – VBA로 Access DB에 연결하여 Data처리하기(ADO를 이용하여 Data추가)
- 10강 – VBA로 Access DB에 연결하여 Data처리하기(ADO를 이용하여 Data조회 및 저장)
- 9강 – VBA로 Access DB에 연결하여 Data처리하기(ADO를 이용하여 연결, 조회)
- 8강 - VBA로 엑셀에서 Database 연결 및 처리를 위한 ADO이해
- 7강 – VBA로 엑셀에서 Database 연결, Data처리 기본개념
- 6강 – VBA로 엑셀Sheet에 연결하기(Data삭제-ADO이용안함)
- 5강 – VBA로 엑셀Sheet에 연결하기(ADO를 이용하여 Data추가)
- 4강 - VBA로 엑셀Sheet에 연결하기(ADO를 이용하여 조회 및 저장)
- 3강 - VBA로 엑셀Sheet에 연결하기(ADO를 이용하여 연결, 조회)
- 2강 - Microsoft Query를 이용하여 Database에 연결하기
- 1강 - 들어가기 - Database는 무엇인가, 왜 엑셀에서 Database를 다루는가?
박스 마다 이름을 바꿔야하는건가
좋은정보 감사합니다. 한가지 질문드립니다.
조회되는 창에서 문제가 없었는데 저장에서 업데이트구문의 구문오류 메세지가 계속 뜹니다.
혹시 cdate 에 해당하는 구문이 따로 있는것인지 궁금합니다.
답변주시면 감사드리겠습니다.
안녕하세요. 답변이 많이 늦었습니다.
정확히 원인은 알 수 없으나 윈도우 업데이트가 최신으로 되어 있지 않아서 그럴 수 있습니다. 윈도우 업데이트를 최신으로 하고 재 부팅 후 다시 시도해 보시기 바랍니다. 그래도 안되면 파일을 admin@xlworks.net으로 보내주시면 확인하고 답변드리겠습니다.
감사합니다.
최근에 보고 공부를 하고 있는 직장인입니다만,
조회하는 버튼에 들어있는 코딩 중에서
Replace부분이 있는데 어떤의미인가요..? SQL은 처음이라 찾아보고 고민해도 모르겠네요 ㅠ
그리고
Where 절에서 이름='' 이건 무슨의미인지요ㅠ
알려주시면 감사하겠습니다.
replace는 sql 조건값에 따옴표가 들어오면 오류가 나기 때문에(sql에서 따옴표는 문자열 표시할 때 사용), escape할 용도로 따옴표를 하나 더 붙이기 위해 사용한 문자열 대체함수입니다.
*escape는 다음 링크 참조
https://m.blog.naver.com/jskorl/220544334899
where절에서 이름 = '' 은
"이름"필드가 비어 있다는 뜻입니다.
SQL은 Structured Query Language의 약자로 일종의 데이터베이스 프로그램 언어입니다. 인터넷 검색하시거나 책을 구매하셔서 따로 학습하시길 권장드립니다.