Exceller Home > VBA 강좌 > VBA 입문강좌

Exceller's VBA 입문강좌

- 최초 작성일 : 2008-08-13
- 최종 수정일 : 2008-08-13
- 강좌 읽음수 : 15,658회
- 자료 작성자 :


- 강좌 제목 : 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. 'Office 단추-새로 만들기'를 클릭하여 새로운 파일을 하나 만듭니다.

2. 'Office 단추-다른 이름으로 저장-Excel 매크로 사용 통합 문서'를 선택한 다음 적당한 이름으로 저장하고 파일을 닫습니다.

3. 'Office 2007 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>

리본X 코드 작성하기

앞서 만들어 두었던 '매크로 사용 통합 문서'를 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
>

좀 복잡해 보이는군요. UI Editor에서 직접 열어보면 색깔과 탭으로 구분되므로 위의 것보다는 조금더 이해하기 쉽습니다.

코드 입력이 끝났으면 'Validate' 아이콘을 클릭합니다. 제대로 입력이 되었다면 'Custom UI XML is well formed!'라는 대화상자가 나타납니다.

콜백(CallBack) 프로시저 만들기

1. 'Generate Callbacks' 아이콘을 클릭하면 6개의 콜백 프로시저가 생성됩니다.

2. 범위를 지정한 다음 마우스 오른쪽 버튼을 클릭하고 'Copy' 메뉴를 선택합니다.

3. 'Save' 버튼을 클릭하여 현재 파일을 저장합니다. 이 때 동일한 파일이 엑셀에 열려 있다면 오류 메시지가 표시됩니다. 닫은 다음 다시 Save 버튼을 클릭하세요!

4. 이제 엑셀로 되돌아와서 해당 파일을 엽니다. '개발 도구' 탭의 'Visual Basic' 컨트롤을 클릭하여 모듈 시트를 삽입하고, 앞에서 복사한 콜백 프로시저를 붙여 넣습니다.

'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

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

다음 시간에 또...


Previous

Next

Creative Commons License