• 최초 작성일: 2002-02-28
  • 최종 수정일: 2026-09-30
  • 조회수: 20 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: OnKey 메서드에 대하여 2

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

현재 Exceller의 강좌는 두 곳을 통해 제공되고 있습니다. http://www.iExceller.com 과 http://my.netian.com/~exceller 앞으로는 http://www.iExceller.com 사이트를 통해서만 강좌 파일을 올려야 할 것 같습니다. 네띠앙 측에서 서비스 기준을 변경하여 일정 용량을 초과하는 홈페이지에 대해서는 유료로 전환한다는 통보를 해 왔습니다.

따라서 미러 사이트와의 통합이 필요한 시점이라 생각되어 두 사이트를 합치게 되었으므로 네띠앙 서버를 통해 접속을 해오시던 분들은 이용에 착오 없으시기를 바랍니다. 홈 정문 우측에 있는 '시작페이지로' 또는 '즐겨찾기에 추가' 아이콘을 클릭하시면 자동으로 여러분의 북마크가 Update 됩니다.

"저는 프로그래밍 체질이 아닌가 봐요! 도무지 프로그래밍이 늘지가 않아요!! 하는 분이 가끔 계십니다.

프로그래밍 체질이라… 그런 체질이 과연 있는 지 알 수 없으나 한 가지 분명한 사실은 자신이 하고 있는 업무에 대해 잘 알고 있고 매사에 따지기를 좋아하는 사람들이 그렇지 않은 사람들보다 프로그래밍을 잘 하는 것은 사실인 듯 합니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

OnKey 메서드에 대하여 2

핵심 요약: 엔터키 이동 순서 제어

시트 활성화 시 OnKey로 엔터키를 프로시저에 연결하고 Intersect로 현재 셀이 어느 영역인지 판단해 다음 셀로 이동시킵니다.

  • 1단계: Worksheet_Activate에서 OnKey로 엔터키를 GoWhatYouWant에 연결합니다.
  • 2단계: Intersect로 Total, Bad, Percent 영역 중 어디에 있는지 판별합니다.
  • 3단계: 시트/창을 벗어날 때 OnKey 설정을 해제합니다.

Step 1: 엔터키를 내 마음대로

이번 시간에는 지난 강좌에서 소개해 드린 OnKey 메서드를 응용해 보도록 하지요. 아래 버튼을 누르시면 Stage 시트로 이동합니다. 이 때 엔터키를 계속 눌러 보세요. 이 때 엔터키는 숫자판에 있는 것 말고 큰 엔터키를 누르셔야 제대로 작동하는 것을 보실 수 있습니다.

지난 주말에 엑사모(엑셀을 사랑하는 사람들의 모임) 번팅 자리에 참석해서 이야기를 나누다가 갑자기 생각이 나서 이런 것을 한번 만들어 보았습니다.

Stage 시트에는 일차별 총생산수량, 불량수량, 불량율이 표로 정리되어 있습니다. 여기에서 사용하는 이름은 Total(총생산수량 B2:B32), Bad(불량수량 C2:C31), Percent(불량율 D2:D31), Start(B2)입니다.

일차총생산수량불량수량불량율
1일차………
2일차………
⋮⋮⋮⋮
30일차………

Step 2: Worksheet_Activate와 SetUpOnKey

먼저 Stage 시트의 Activate 이벤트, 즉 워크시트가 활성화 되었을 때 실행될 코드를 작성합니다.

Private Sub Worksheet_Activate()
    [Start].Select
    SetUpOnKey
    '''SetUpOnKey라는 외부 프로시저를 호출합니다. 이 프로시저는 일반 모듈에 들어 있습니다.

    MsgBox "엔터키를 눌러가며 셀 포인터가 어떻게 이동하는지 유심히 살펴보세요!"
End Sub

SetUpOnKey라는 외부 프로시저를 호출합니다. 이 프로시저는 일반 모듈에 들어 있습니다.

Sub SetUpOnKey()
    Application.OnKey "~", "GoWhatYouWant"
    '''지난 시간에 설명드린 OnKey 메서드를 사용하였지요?
    '''엔터키를 누를 때마다 GoWhatYouWant 프로시저를 실행하도록 합니다.

End Sub

지난 시간에 설명드린 OnKey 메서드를 사용하였지요? 엔터키를 누를 때마다 GoWhatYouWant 프로시저를 실행하도록 합니다.

Step 3: GoWhatYouWant 프로시저

GoWhatYouWant 프로시저의 내용은 아래와 같습니다. 이 프로시저가 오늘 강좌의 핵심 부분입니다.

Sub GoWhatYouWant()
    Dim rngTarget As Range

    Set rngTarget = Intersect([Total], Selection)
    '''낯선 것이 하나 등장하였군요. Intersect 메서드는 "둘 이상의 범위에서 사각형 모양의 겹치는
    '''부분을 구해 줍니다. Stage 시트에서 Total 이라는 Range 오브젝트는 "총생산수량" 부분입니다.

    If Not rngTarget Is Nothing Then
        '''Not rngTarget이 Nothing 이라는 것은 서로 교차되는 영역이 없다는 것, 즉 선택된 셀이
        '''Total 이라는 영역 내에 있지 않다는 의미가 됩니다.

        If Selection.Row = 32 Then
            Selection.Offset(-30, 0).Select
        Else
            Selection.Offset(0, 1).Select
            '''선택된 영역이 32행이면 1일차 행으로 이동시키고 그렇지 않으면 오른쪽으로 한 칸
            '''이동시킨 다음 프로시저를 종료합니다.

        End If
        Exit Sub
    End If

    Set rngTarget = Intersect([Bad], Selection)
    '''이번에는 선택된 영역이 Bad 즉 "불량수량" 영역 내에 있는 지 확인하여 셀 포인터의 방향을
    '''결정합니다. Bad 영역 내에 있을 경우 오른쪽 으로 한 간 옮긴 다음 프로시저를 빠져 나갑니다.

    If Not rngTarget Is Nothing Then
        Selection.Offset(0, 1).Select
        Exit Sub
    End If

    Set rngTarget = Intersect([Percent], Selection)
    '''마찬가지로 Intersect 메서드를 사용하여 현재 선택된 영역이 Percent 즉 "불량율" 영역 내에
    '''있을 경우, 아래로 한 간, 왼쪽으로 두 간 이동시킵니다.

    If Not rngTarget Is Nothing Then
        Selection.Offset(1, -2).Select
        Exit Sub
    End If
End Sub

낯선 것이 하나 등장하였군요. Intersect 메서드는 둘 이상의 범위에서 사각형 모양의 겹치는 부분을 구해 줍니다. Stage 시트에서 Total 이라는 Range 오브젝트는 "총생산수량" 부분이며, Bad는 "불량수량", Percent는 "불량율" 영역입니다. 셀 포인터가 어느 영역 안에 있는지에 따라 이동 방향을 결정하는 것이 이 프로시저의 핵심입니다.

Step 4: 다른 시트에서의 에러 방지

그냥 이대로만 두면 다른 시트나 파일에서 엔터키를 눌렀을 경우 에러 메시지가 나타납니다. 따라서 워크시트나 워크북 오브젝트의 이벤트 핸들러 프로시저를 이용하여 수정해 줍니다. 이 역할을 수행하기 위해

  • Workbook 오브젝트의 WindowDeactivate 이벤트
  • Worksheet 오브젝트의 Deactivate 이벤트

등을 이용하여 또 어떤 작업을 해 주었습니다. 어떤 코드가 사용되었는지 직접 확인해 보시기 바랍니다.

참고: 위 이벤트에서는 아래와 같이 엔터키에 연결해 둔 OnKey 설정을 해제하면 됩니다.

' Stage 시트 모듈
Private Sub Worksheet_Deactivate()
    Application.OnKey "~"
End Sub

' ThisWorkbook 모듈
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
    Application.OnKey "~"
End Sub

오늘은 여기까지…

정리 — OnKey 응용 핵심

구분 사용한 코드 역할
키 연결 Application.OnKey "~", "GoWhatYouWant" 엔터키에 프로시저 연결
영역 판별 Intersect([Total], Selection) 선택 셀의 소속 영역 확인
오른쪽 이동 Selection.Offset(0, 1).Select Total, Bad 영역에서 이동
다음 행 이동 Selection.Offset(1, -2).Select Percent에서 다음 행의 Total로
해제 Deactivate 이벤트에서 OnKey "~" 다른 시트에서 오류 방지

자주 묻는 질문 (FAQ)

Q1. 왜 엔터키를 숫자판 것 말고 큰 엔터키로 눌러야 하나요?

OnKey에서 "~"는 일반 Enter 키를, {ENTER}는 숫자 키패드의 Enter 키를 의미하기 때문입니다.

Q2. Intersect 메서드는 무엇을 반환하나요?

둘 이상의 범위에서 겹치는 부분을 반환하며 겹치는 부분이 없으면 Nothing입니다.

Q3. 다른 시트에서 엔터키를 눌러도 프로시저가 실행되나요?

그대로 두면 오류가 나므로 Worksheet_Deactivate와 Workbook_WindowDeactivate 이벤트에서 OnKey 설정을 해제해야 합니다.

마치며

프로그래밍 체질이 따로 있는 것이 아니라 자기 업무를 잘 알고 매사를 따져 보는 습관이 코드를 더 잘 짜게 만듭니다.