완성 예
이번 시간에는 CheckBox와 EditBox 컨트롤을 탭에 추가해 보겠습니다. 오늘 만들어 볼 <완성 예>를 먼저 보도록 하죠.
어떤가요? 지금까지 VBA 강좌를 열심히 따라온 분이라면 누구나 만들 수 있는 평이한 수준의 예제이지 않나요?... 라고 하면 요즘같은 분위기에 자칫 물대포를 맞을 수 있으므로 만수무강을 위해 발언을 철회합니다(취소!!~~). 각 메뉴에 대해 간단히 소개해 드리면...
- Show Gridlines: 눈금선을 표시하거나 숨깁니다(토글키).
- Show Page Breaks: 페이지 나누기를 설정하거나 취소합니다(토글키).
- Toggle Reference Styles: 셀 참조 형식을 변경합니다.
- Change Sheetname to: 시트 이름을 변경합니다.
만드는 순서는 지금까지의 과정과 비슷합니다. 1) 엑셀 파일을 만들고, 2) XML로 리본X 코드를 만든 다음, 3) 콜백 프로시저를 작성하는 것이지요.
빈 집 만들기
역시나 첫 번째 단계는 문패를 달 집을 마련하는 것입니다.
1. [파일] - [새로 만들기]를 클릭하여 새로운 파일을 하나 만듭니다.
2. [파일] - [복사본 저장](또는 다른 이름으로 저장) - [Excel 매크로 사용 통합 문서]를 선택한 다음 적당한 이름으로 저장하고 파일을 닫습니다.
3. Custom UI Editor를 실행하여 앞에서 작성한 매크로 사용 통합 문서를 불러옵니다. XML로 다음과 같은 리본X 코드를 작성합니다. 다른 것은 지난 시간의 것과 같고, 탭이 삽입되는 위치가 [홈] 탭 뒤라는 것만 다릅니다.
<customUI xmlns='http://schemas.microsoft.com/office/2006/01/customui'>
<ribbon>
<tabs>
<tab id="MyTab"
label="Exceller's Tab"
insertAfterMso="TabHome">
</tab>
</tabs>
</ribbon>
</customUI>
CODE
리본X 코드 작성하기
앞에서 만들었던 '매크로 사용 통합 문서'를 Custom UI Editor에서 불러온 다음 리본X 코드를 작성합니다. 아래 코드를 복사해서 붙여넣기 하시면 됩니다.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="MyTab"
label="Exceller's Tab"
insertAfterMso="TabHome">
<group id="grpCheckBox"
label="My CheckBox">
<checkBox idMso="ViewGridlinesToggleExcel"
label="Show Gridlines"/>
<checkBox id="chkPBreak"
label="Show Page Breaks"
onAction="TogglePageBreakDisplay"
getPressed="chkPBreak_GetPressed"
getEnabled="chkPBreak_GetEnabled"/>
<checkBox id="chkR1C1"
label="Toggle Reference Styles"
getPressed="chkR1C1_getPressed"
onAction="chkR1C1_click"/>
</group>
<group id="grpEditBox"
label="My EditBox">
<editBox id="edtBox1"
label="Change Sheetname to:"
sizeString="123456789012345"
onChange="edtBox1_Click" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
CODE
Custom UI Editor에서 보면 태그 tag가 색깔과 탭으로 구분되므로 위의 것보다는 조금 더 알아보기 쉽습니다.
콜백(CallBack) 프로시저 만들기
1. [Generate Callbacks] 아이콘을 클릭하면 6개의 콜백 프로시저가 생성됩니다. 범위를 지정한 다음 마우스 오른쪽 버튼을 클릭하고 [Copy] 메뉴를 선택합니다.
2. [Save] 버튼을 눌러스 현재 파일을 저장합니다. 이 때 동일한 파일이 엑셀에 열려 있다면 오류 메시지가 표시됩니다. 닫은 다음 [Save] 버튼을 클릭하세요
3. InsertSheet_click 프로시저를 작성합니다. 이것은 엑셀의 영역이고 코드 또한 길지 않으므로 직접 입력해 보세요. 우리에게 아주 친숙한 Select ~ Case 구문입니다.
4. 이제 엑셀로 되돌아와서 해당 파일을 엽니다. VB Editor에서 모듈을 하나 삽입하고, 앞에서 복사한 콜백 프로시저를 붙여넣습니다. 그런 다음 껍데기만 있던 콜백 프로시저에 코드를 하나씩 채워 넣습니다.
'Callback for Checkbox1 getEnabled
Sub chkPBreak_GetEnabled(control As IRibbonControl, ByRef returnedVal)
returnedVal = TypeName(ActiveSheet) = "Worksheet"
End Sub
'--------------------
'Callback for editBox1 onChange
Sub edtBox1_Click(control As IRibbonControl, text As String)
If ChangeSheetName(text) = False Then
MsgBox "유효하지 않은 이름입니다. 확인 후 다시 입력하세요!"
End If
End Sub
'--------------------
Private Function ChangeSheetName(strCallSheet As String)
On Error Resume Next
ActiveSheet.Name = strCallSheet
If Err.Number = 0 Then ChangeSheetName = True
End Function
'--------------------
'Callback for chkR1C1 getPressed
Sub chkR1C1_getPressed(control As IRibbonControl, ByRef returnedVal)
If Application.ReferenceStyle = xlR1C1 Then returnedVal = True
End Sub
'--------------------
'Callback for chkR1C1 onAction
Sub chkR1C1_click(control As IRibbonControl, pressed As Boolean)
Select Case pressed
Case True
Application.ReferenceStyle = xlR1C1
Case Else
Application.ReferenceStyle = xlA1
End Select
End Sub
'--------------------
Public Sub RenameSheet()
Dim strNewSheetName As String
strNewSheetName = InputBox("There was a problem. Please try again!")
If ChangeSheetName(strNewSheetName) = False Then
MsgBox "유효하지 않은 이름입니다. 확인 후 다시 입력하세요!"
End If
End Sub
'--------------------
'Callback for Checkbox1 onAction
Sub TogglePageBreakDisplay(control As IRibbonControl, pressed As Boolean)
On Error Resume Next
ActiveSheet.DisplayPageBreaks = pressed
End Sub
'--------------------
'Callback for Checkbox1 getPressed
Sub chkPBreak_GetPressed(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
returnedVal = ActiveSheet.DisplayPageBreaks
End Sub
CODE
프로시저 수는 좀 많습니다만 대부분 몇 줄 이내의 간단한 것이니까 별도 설명은 생략합니다.
다음 시간에 또...