728x90
728x170
프로시저 작성 (액셀/스프레드시트)
개념
- 프로시저(Procedure) : 한 개 이상의 기능을 수행하기 위한 명령문의 집합
- 액셀에서의 프로시저
- VBA를 이용하여 액셀 작업을 자동화시킬 수 있는 도구로서 유용하게 활용됨.
- 프로시저의 종류
- Sub 프로시저 : 정해진 명령대로 작업을 수행하고, 결과를 반환하지 않는 프로시저
- Function 프로시저 : 결과를 반환하는 프로시저
- Property 프로시저 : 개체의 속성을 정의할 때 사용하는 프로시저
- 모드
- 실행 모드 : 삽입된 컨트롤을 실행할 수 있는 모드
- 디자인 모드 : 컨트롤에 기능을 부여하기 위해 코드를 연결하거나 컨트롤의 모양을 변경할 수 있는 모드
- 코드의 실행
- [F5]를 누르거나 '표준' 도구 모음의 실행 아이콘(▶)을 누르면 현재 입력한 코드의 실행 결과를 확인할 수 있음.
참고
- 컴퓨터활용능력 1급 시험에서는 각 5점씩 총 3문제가 출제됨.
- 매회 출제되는 3문제 모두가 기출문제와 다르게 출제된 적은 한 번도 없음.
- 최소한 5점 이상은 맞힌다는 생각으로 공부해야 함.
- VBE에서는 개체명을 입력하고 마침표(.)를 누르면 해당 개체에서 사용할 수 있는 메서드 및 속성이 표시되고, 첫 글자만 누르면 해당 메서드나 속성으로 이동함.
- 해당 메서드나 속성이 선택되었을 때 [Ctrl] + [Enter]를 누르면, 선택된 메서드나 개체가 프로시저에 입력되고 같은 줄에서 계속 자료를 입력할 수 있음.
- 컨트롤의 이름은 사용자가 임의로 만드는 것이지만, 실제 문제에 주어진 폼에는 이미 각 컨트롤에 이름이 정의되어 있음.
- 'txt판매일자.Value = Date'
- 'txt판매일자 = Date'와 같이 '.Value'를 생략해도 됨.
- 하지만 반드시 Value를 붙여야 하는 경우가 있음.
- 'txt판매일자'의 값을 날짜 데이터로, 'txt수량'과 'txt단가'의 값을 숫자로 워크시트에 입력하려면 반드시 'txt판매일자.Value', 'txt수량.Value', 'txt단가.Value'와 같이 'Value' 속성을 붙여야 함.
- 'Value' 속성을 생략하면 데이터가 텍스트로 입력됨.
- 'txt판매일자'의 값을 날짜 데이터로, 'txt수량'과 'txt단가'의 값을 숫자로 워크시트에 입력하려면 반드시 'txt판매일자.Value', 'txt수량.Value', 'txt단가.Value'와 같이 'Value' 속성을 붙여야 함.
- Range는 워크시트의 셀이나 셀 범위를 선택하는 속성으로, 셀 주소에 대괄호([])를 붙일 경우 생략이 가능함.
- 예) 다음은 같은 표현임.
- range("b3").CurrentRegion.Rows.Count
- [b3].CurrentRegion.Rows.Count
- 예) 다음은 같은 표현임.
VB 사용 예
워크시트의 단추를 클릭하면 폼이 열리도록 설정하기
- 코드 예
- 워크시트의 '판매입력' 단추를 클릭하면 폼이 열리도록 설정하기
Private Sub 판매입력_Click()
판매자료입력.Show
End Sub
폼이 실행되면 자동으로 기능 실행하기
- 코드 예
- 폼 실행 시, 자동으로 TextBox, ListBox, ComboBox에 항목 넣기(초기화 하기)
Private Sub UserForm_Initialize()
txt판매일자.Value = Date '판매일자 폼에 현재 날짜 표시하기
lst제품목록.RowSource = "I4:I13" '제품목록 리스트에 항목 넣기 (워크시트 참고)
cmb결재형태.AddItem "현금" '결재형태 콤보박스에 항목 넣기
cmb결재형태.AddItem "카드" '결재형태 콤보박스에 항목 넣기
cmb결재형태.AddItem "어음" '결재형태 콤보박스에 항목 넣기
'cmb결재형태.List = Array("현금", "카드", "어음")을 입력해도 동일한 결과가 출력됨.
'만약 콤보 상자가 결재코드와 결재형태를 나타내는 2개의 열로 구성된다면,
'다음과 ColumnCount 속성을 2로 지정해야 두 열이 표시됨.
'cmb결재형태.ColumnCount = 2
End Sub
폼의 자료를 워크시트에 입력하기
- 코드 예
Private Sub cmd등록_Click()
If txt제품명.Value = "" Then
MsgBox "제품명을 입력하시오."
ElseIf txt수량.Value = "" Then
MsgBox "수량을 입력하시오."
ElseIf txt단가.Value = "" Then
MsgBox "단가를 입력하시오."
ElseIf cmb결재형태.Value = "" Then
MsgBox "결재형태를 입력하시오."
Else
기준행위치 = [b3].Row 'Row : 셀의 행
기준범위행수 = [b3].CurrentRegion.Rows.Count 'CurrentRegion : 지정된 셀과 연결된 범위, Rows : 범위에 있는 데이터의 행들, Count : 개수
입력행 = 기준행위치 + 기준범위행수
Cells(입력행, 2) = txt판매일자.Value
Cells(입력행, 3) = txt제품명.Value
Cells(입력행, 4) = txt수량.Value
Cells(입력행, 5) = txt단가.Value
Cells(입력행, 6) = Format(txt수량.Value * txt단가.Value, "currency") 'Format() : 숫자에 서식을 지정하는 함수, "currency" 통화기호를 붙임.
Cells(입력행, 7) = cmb결재형태.Value
txt제품명.Value = "" '새로운 데이터를 입력받기 전에 컨트롤들에 현재 입력된 값을 지움.
txt수량.Value = ""
txt단가.Value = ""
cmb결재형태.Value = ""
End If
End Sub
워크시트의 자료를 폼에 표시하기
- 코드 예
- 시트의 표에 입력된 제일 마지막의 '판매날짜', '제품명', '수량', '단가', '결재구분'을 폼에 표시하기
Private Sub cmd조회_Click()
기준행위치 = [b3].Row
기준범위행수 = [b3].CurrentRegion.Rows.Count - 1 '-1은 기준행(3행)을 제외하고, 순수하게 데이터 범위에 대한 행 수를 구하기 위해 사용됨.
입력행 = 기준행위치 + 기준범위행수
txt판매일자.Value = Cells(입력행, 2)
txt제품명.Value = Cells(입력행, 3)
txt수량.Value = Cells(입력행, 4)
txt단가.Value = Cells(입력행, 5)
cmb결재형태.Value = Cells(입력행, 7)
End Sub
폼 종료하기
- 코드 예
Private Sub cmd종료_Click()
Unload Me
'현재 작업중인 폼을 화면과 메모리에서 제거함.
'Me : 현재 작업중인 폼 (다른 폼을 지정하려면 폼의 이름을 정확하게 기록해야 함.)
'"Unload 판매자료입력" 이라고 입력해도 같은 결과가 나옴.
End Sub
셀의 위치나 데이터가 변경(Change)되면 해당 셀의 특징을 변경시키기 (이벤트)
- 코드 예
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Activate '해당 셀로 셀 포인터를 이동시키기
Target.Font.Name = "바탕체" '폰트를 "바탕체"로 변경
Target.Font.Size = "14" '폰트 크기를 14로 변경
End Sub
워크시트의 Activate 이벤트에 기능 설정하기
- 코드 예
Private Sub Worksheet_Activate()
[b1] = "컴활합격"
End Sub
체크박스 기능 구현하기
- 코드 예
- '성별'의 체크박스(chk성별)를 체크하면 '남학생', 체크를 해제하면 '여학생'이 '성별(cmd성별)'에 표시되도록 하기
Private Sub chk성별_Click()
If chk성별.Value = True Then '체크박스가 체크될 경우
cmd성별.Caption = "남학생"
Else '체크박스가 체크되지 않을 경우
cmd성별.Caption = "여학생"
End If
End Sub
스핀 단추 기능 구현하기
- 코드 예
- '국어(spin국어)'의 스핀 단추를 누르면 5씩 증감된 숫자가 '국어(txt국어)'에 표시되도록 하기
Private Sub spin국어_Change()
txt국어.Value = spin국어.Value * 5 '"spin국어" 컨트롤의 값에 5를 곱해 'txt국어' 컨트롤에 표시
End Sub
콤보 박스에 항목 넣기
- 코드 예 (방법1)
- '결재형태(cmd결재형태)' 에 "현금", "카드", "어음" 항목 넣기
- AddItem 이용
Private Sub UserForm_Initialize()
cmb결재형태.AddItem "현금"
cmb결재형태.AddItem "카드"
cmb결재형태.AddItem "어음"
End Sub
- 코드 예 (방법2)
- '결재형태(cmd결재형태)' 에 "현금", "카드", "어음" 항목 넣기
- List, Array 이용
Private Sub UserForm_Initialize()
cmb결재형태.List = Array("현금", "카드", "어음")
End Sub
- 코드 예 (방법3)
- '결재형태(cmd결재형태)' 에 "현금", "카드", "어음" 항목 넣기
- With, AddItem 이용
Private Sub UserForm_Initialize()
With cmb결재형태
.AddItem "현금"
.AddItem "카드"
.AddItem "어음"
End With
End Sub
리스트에 항목 넣기
- 코드 예
- '제품목록(lst제품목록)' 에 워크시트의 항목(I4:I13) 넣기
Private Sub UserForm_Initialize()
lst제품목록.RowSource = "I4:I13"
End Sub
컨트롤로 포커스 설정하기
- 코드 예
- 폼이 실행되면 '판매일자(txt판매일자)' 컨트롤로 포커스가 옮겨가도록 하기
Private Sub UserForm_Initialize()
txt판매일자.SetFocus
End Sub
메시지 상자 출력하기
- 코드 예
- '작업종료(Cmd종료)' 버튼을 누르면 현재 날짜와 시간을 표시하는 메시지 박스를 표시하고, 폼을 종료시키기
- MsgBox (메시지 내용) (박스 유형) (메시지 박스 제목)
Private Sub Cmd종료_Click()
MsgBox Now, vbOKOnly, "작업을 종료합니다." 'vbOKOnly : <확인> 단추만 표시
Unload Me
End Sub
기출 문제 예시
Q. <성적입력폼>에 데이터를 입력하고 '등록(cmd등록)' 단추를 클릭하면 폼에 입력된 '이름(txt이름)', '성별(cmd성별)', '국어(txt국어)', '수학(txt수학)'과 '평균', '평가' 가 계산되어 '기출01' 시트의 표에 입력되도록 프로시저를 작성하시오.
- '이름' 앞에 입력되는 순서를 나타내는 번호를 입력하시오.
- '평균'은 입력받은 '국어', '영어', '수학' 값의 평균이고, 소수 2자리까지 표시하시오.
- '평가'는 '평균'과 [평가표]를 참조하되, Select ~ Case 명령문을 이용하여 산출하시오.
- 폼의 '등록(cmd등록)' 단추를 클릭하면 폼의 '이름(txt이름)', '국어(txt국어)', '영어(txt영어)', '수학(txt수학)'에는 새로운 값이 입력될 수 있도록 설정하시오.
※ 데이터를 추가하거나 삭제하여도 항상 마지막 데이터 다음에 입력되어야 함.
- 코드
Private Sub cmd등록_Click()
기준행위치 = [b3].Row
기준범위행수 = [b3].CurrentRegion.Rows.Count
입력행 = 기준행위치 + 기준범위행수
Cells(입력행, 2) = 입력행 - 3 & txt이름.Value
Cells(입력행, 3) = txt국어.Value
Cells(입력행, 4) = txt영어.Value
Cells(입력행, 5) = txt수학.Value
Cells(입력행, 6) = Format((Val(txt국어) + Val(txt영어) + Val(txt수학)) / 3, "0.00")
'소수 2자리까지 표시
'Val() : 숫자 형식의 문자를 숫자로 변환하는 함수
Select Case Cells(입력행, 6)
Case Is < 60
Cells(입력행, 7) = "가"
Case Is < 70
Cells(입력행, 7) = "양"
Case Is < 80
Cells(입력행, 7) = "미"
Case Is < 90
Cells(입력행, 7) = "우"
Case Else
Cells(입력행, 7) = "수"
End Select
Cells(입력행, 8) = cmd성별.Caption
txt이름.Value = ""
txt국어.Value = ""
txt영어.Value = ""
txt수학.Value = ""
End Sub
Q. <고객관리> 폼의 '고객명(txt고객명)'에 조회할 '고객명'을 입력하고 '고객조회(cmd고객조회)' 단추를 클릭하면 워크시트의 [표1]에서 해당 데이터를 찾아 각각의 컨트롤에 표시하고 해당 고객의 정보가 없는 경우에는 "조건에 일치하는 자료가 없습니다."라는 메시지 박스가 표시되도록 프로시저를 작성하시오.
- For Each ~ Next문을 이용하시오.
- 코드
Private Sub cmd고객조회_Click()
스위치 = 0
참조행 = 3
For Each aa In Range("D4:D7")
참조행 = 참조행 + 1
If aa.Value = txt고객명.Value Then
txt고객등급.Value = Cells(참조행, 5)
txt매출금액.Value = Cells(참조행, 6)
txt결제방식.Value = Cells(참조행, 7)
스위치 = 1
Exit For
End If
Next
If 스위치 = 0 Then
MsgBox "조건에 일치하는 자료가 없습니다."
End If
End Sub
Q. '보험종류(Cmb종류)'와 '가입지점(Cmb지점)'을 선택한 후 '성명(Txt성명)' 을 입력하고 '신청확인(Cmb확인)' 단추를 클릭하면 폼에 입력된 데이터가 [표1]에 입력되어 있는 마지막 행 다음에 연속하여 추가입력 되도록 작성하시오.
- 폼에서 선택된 보험종류에 해당하는 '월납부액', '납부총액', '이자총액'을 [참조표]에서 찾아 [표1]에 표시하시오. (LastIndex 속성 이용)
※ 데이터를 추가하거나 삭제하여도 항상 마지막 데이터 다음에 입력되어야 함.
- 코드
Private Sub Cmd확인_Click()
기준행위치 = [A1].Row '[a1] 셀에 있는 행이 데이터 표의 맨 첫 째 줄로 인식됨. 엑셀에서는 내용에 관계없이 빈 행이 나올 때까지를 하나의 연결된 표로 봄.
기준범위행수 = [A1].CurrentRegion.Rows.Count
입력행 = 기준행위치 + 기준범위행수
참조행 = Cmb종류.ListIndex + 7
'ListIndex : 콤보 상자 컨트롤의 목록 부분에서 선택한 항목의 인덱스 번호를 반환하거나 설정하는 속성
'0부터 시작하므로, 콤보 상자에서 첫 번째 값을 선택하면 0, 두 번째 값을 선택하면 1이 반환됨.
Cells(입력행, 1) = Cmb종류.Value
Cells(입력행, 2) = Cmb지점.Value
Cells(입력행, 3) = Txt성명.Value
Cells(입력행, 4) = Cells(참조행, 9) '참조행의 9열 값 표시
Cells(입력행, 5) = Cells(참조행, 10) '참조행의 10열 값 표시
Cells(입력행, 6) = Cells(참조행, 11) '참조행의 11열 값 표시
End Sub
Q. <온라인수강신청> 폼의 '입력(Cmd입력)' 단추를 클릭하면 폼에 입력된 데이터를 시트의 안에 추가하되, List, Listindex를 사용하여 프로시저를 작성하시오.
- 목록 상자(lst과목)에서 과목을 선택했을 때에만 폼의 데이터를 워크시트에 입력되도록 설정하시오.
- 목록 상자(lst과목)에서 과목을 선택하지 않았으면 'ID(txtID)' 컨트롤에 '선택안함'을 표시한 후, 목록 상자(lst과목)의 첫 번째 항목을 선택하시오.
- 'ID(txtID)' 컨트롤에 소문자를 입력해도 워크시트에는 대문자로 입력되도록 설정하시오. (Ucase 이용)
- '할인수강료'는 '수강료-(수강료*0.1)'로 계산하여 입력하시오.
- 폼의 '입력' 단추를 클릭하면 새로운 값이 입력될 수 있도록 폼의 'ID(txtID)', '날짜(txt날짜)', '이름(txt이름)'에 입력된 데이터는 삭제하고, 목록 상자(lst과목)는 아무것도 선택되지 않은 상태로 설정하시오.
- 코드
Private Sub cmd입력_Click()
If IsNull(lst과목.Value) Then
lst과목.ListIndex = 0
txtID = "선택안함"
Else
기준행 = [a3].Row
행수 = [a3].CurrentRegion.Rows.Count
입력행 = 기준행 + 행수
참조행 = lst과목.ListIndex
Cells(입력행, 1) = UCase(txtID.Value) 'ID (대문자로 변환)
Cells(입력행, 2) = txt이름.Value '이름
Cells(입력행, 3) = lst과목.List(참조행, 0) '과목코드
Cells(입력행, 4) = lst과목.List(참조행, 1) '과목명
Cells(입력행, 5) = lst과목.List(참조행, 2) '담당강사
Cells(입력행, 6) = lst과목.List(참조행, 3) - (lst과목.List(참조행, 3) * 0.1) '할인수강료
txtID.Value = ""
txt이름.Value = ""
txt날짜.Value = ""
lst과목.Value = ""
End If
End Sub
728x90
그리드형(광고전용)
'Certificate > CSSD' 카테고리의 다른 글
[컴퓨터활용능력 1급 실기] 관계 설정 (액세스) (0) | 2021.11.17 |
---|---|
[컴퓨터활용능력 1급 실기] 테이블 작성 (액세스) (0) | 2021.11.17 |
[컴퓨터활용능력 1급 실기] 액세스 기초 다지기 (액세스) (0) | 2021.11.17 |
[컴퓨터활용능력 1급 실기] 작업별 구성 요소 및 배점 (액세스) (0) | 2021.11.16 |
[컴퓨터활용능력 1급 실기] 매크로 (액셀/스프레드시트) (0) | 2021.11.16 |
[컴퓨터활용능력 1급 실기] 차트 (액셀/스프레드시트) (0) | 2021.11.15 |
[컴퓨터활용능력 1급 실기] 목표값 찾기 (액셀/스프레드시트) (0) | 2021.11.15 |
[컴퓨터활용능력 1급 실기] 데이터 통합 (액셀/스프레드시트) (0) | 2021.11.14 |