• 최초 작성일: 2008-08-13
  • 최종 수정일: 2008-08-13
  • 조회수: 21,894 회
  • 작성자: 엑셀러 권현욱
  • 강의 제목: 리본X 컨트롤 (2) ㅡ CheckBox와 EditBox 컨트롤

엑셀러 권현욱

들어가기 전에

미국 카네기멜론대학 컴퓨터공학과 랜디 포시 교수. 그는 50세가 채 되지 않은 2006년 여름에 췌장암 선고를 받았습니다. 그는 죽기 전에 <마지막 강의>를 남겼으며, 10개의 악성 종양이 표시된 자신의 췌장 CT 사진을 마지막 강의 슬라이드에 소개하면서도 삶에 대한 강한 의욕을 보여주었습니다.

길어야 6개월 이라는 시한부 삶을 선고받고도 낙천적이고 열정적인 마지막 강의와 오프라윈프리 쇼를 통해 미국과 전세계 사람들의 심금을 울렸습니다. 췌장암은 선고받고 나서 5년 내 사망 확률이 95% 이상이라고 하는군요.

장벽이 거기 서 있는 것은 가로막기 위해서가 아니라 우리가 얼마나 간절히 원하는지 보여줄 기회를 주기 위해 거기 서 있는 것이다. 장벽에는 다 이유가 있다. 장벽은 절실하게 원하지 않는 사람을 걸러내려고 존재한다. 장벽은 우리가 얼마나 절실하게 원하는지 깨달을 수 있도록 기회를 제공하는 것이다.

ㅡ <마지막 강의>, 랜디 포시

불확실한 인간사에 확실한 것이 하나 있다면 그것은 바로 '모든 인간은 언젠가는 죽는다'는 것이겠지요. 앞으로의 모든 생일에 더 이상 내가 함께할 수 없을 거란 생각, 사랑하는 사람들을 남겨둔 채 혼자 떠나야 한다는 극한의 고통을 절망이 아닌 에너지로 승화시킨 랜디 포시 교수를 보며, 내게 남겨진 앞으로의 삶을 어떻게 보내야 하는가 생각해 보았습니다. 그러면서, 그에게 기적이 일어나기를 기원했습니다만...

2008년 7월 25일. 랜디 포시 암과의 투쟁을 끝내다...



완성 예

이번 시간에는 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

프로시저 수는 좀 많습니다만 대부분 몇 줄 이내의 간단한 것이니까 별도 설명은 생략합니다.

다음 시간에 또...