• 최초 작성일: 2000-06-13
  • 최종 수정일: 2026-09-30
  • 조회수: 12 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 처음 만들어보는 UserFormⅡ

들어가기 전에

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

인간이 한 평생동안 안댔자 과연 무엇을 얼마나 알겠습니까? 괜히 뭔가 대단한 것을 자기만 알고 있는 것으로 착각하다가 가는 것 뿐이겠지요. 인류 역사상 가장 창의적인 천재라고 일컬어지는 레오나르도 디카프리오… 가 아닌 레오나르도 다빈치도 이렇게 탄식을 했다지요.

'아! 내가 생각한 것들은 모두 조상들에 의해 다 발명이 되었으니…
내가 100년만 일찍 세상에 태어났더라면…'

VB(A)가 뭐 그렇게 어렵고 대단한 것이라고 못하겠습니까? 남이 하는 것이라면 나도 할 수 있다는 자신감을 가지고 열심히들 하시기 바랍니다. 하다가 막히는 부분이 있으시면 메일 주시고…

얼마나 좋습니까? 이렇게 친절히 자~알 설명해 주고 그것도 모자라 질문하면 즉시로 답변해 주는 Exceller 같은 인간도 있고… 마음만 먹는다면 Excel과 VB를 못할래야 못할 수가 없는 환경이지요. ^^

지난 강좌에 이어서… 유저폼을 완성시켜 보도록 하겠습니다.

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

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

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


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

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

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

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

처음 만들어보는 UserFormⅡ

핵심 요약: UserForm 이벤트 핸들러

컨트롤을 더블클릭하면 컨트롤이름_Click 형태의 이벤트 핸들러가 만들어지며, 여기에 코드를 작성해 폼에 동작을 부여합니다.

  • 이벤트: 클릭, 키 입력 등 사용자 동작 하나하나입니다.
  • 취소 버튼: Unload UserForm1으로 폼을 닫습니다.
  • OK 버튼: CountA로 빈 행을 찾아 이름과 성별을 기록하고 폼을 초기화합니다.

Step 3: 이벤트 핸들러 프로시저 작성하기

지난 시간에 유저폼을 작성한 다음 이것을 화면에 나타내는 작업까지 했었습니다. 이번 강좌에서는 이 유저폼에 지능을 부여하는 작업, 즉 이벤트 핸들러 프로시저를 작성하여 컨트롤에 붙이는 방법에 대해 설명을 드리겠습니다.

(1) VB Editor 실행하기

"도구-매크로-Visual Basic Editor" 메뉴 또는 Alt + F11 키를 눌러 VB Editor를 실행시킵니다.

(2) Cancel 버튼 더블클릭하기

(2) 지난 시간에 만들었던 유저폼이 화면상에 나타났는지 확인한 다음(나타나 있으면) Cancel 버튼을 더블클릭 합니다(유저폼이 아닌 다른 것이 나타나 있다면 "프로젝트 탐색기 창"에서 유저폼을 더블 클릭하시면 됩니다).

(3) 이벤트 핸들러 프로시저 확인하기

(3) 그러면 새로운 모듈 시트(이것을 코드 시트라고 부릅니다)가 하나 나타나면서 btnCancel_Click이라는 (빈) 프로시저가 하나 나타날 것입니다.

Private Sub btnCancel_Click()

End Sub

여기서 "이벤트"라는 아주 중요한 개념이 하나 나왔습니다. 우리말로 직역을 하면, "사건, 행사"가 되나요? ^^ 이벤트라고 하니까 뭔가 거창한 것처럼 여겨지는데... 우리가 워크시트(또는 유저폼) 상에서 어떤 키를 눌렀다든가 마우스를 클릭했다든가 하는 하나하나의 동작이 바로 이벤트라고 생각하시면 되겠습니다. 유저폼 내의 컨트롤(유저폼 그 자체도 마찬가지!)은 사용자나 Excel에 의해 특정한 이벤트가 발생 됩니다. 예를 들어 버튼을 클릭하면 CommandButton_Click 이벤트가 발생 됩니다. 그리고 어떤 동작은 복수 개의 이벤트(Multiple Event)를 발생시킵니다. 예를 들어, 위쪽 화살표를 클릭하는 동작은 (1) SpinUp 이벤트와 (2) Change 이벤트를 동시에(엄밀하게 말하면 순차적으로) 발생시킵니다.

또 한가지 예로, 유저폼이 Show 메서드에 의해 로딩이 되면(Excel에 의해 자동으로) Initialize 이벤트와 Activate 이벤트가 발생이 됩니다(좀 복잡하지요?).

따라서 위의 경우, btnCancel_Click 이라는 것은 btnCancel이라는 버튼을 클릭했을 때 자동으로 생기는 클릭이벤트라고 할 수가 있는 것이지요. 그렇다면 btnCancel이라는 해괴한(?) 문자는 어디서 나온 것이냐?'고 반문하는 분이 계신가요?

지난 시간에 유저폼에 여러 가지 종류의 컨트롤을 추가하고 속성값을 변경해 줄 때 취소(Cancel) 버튼의 Name 속성을 btnCancel로 바꾸어 주었지요? 그래서 이 버튼을 클릭하니까 자동적으로 btnCancel_Click이라는 클릭 이벤트가 하나 자동으로 생겨난 것입니다. 이해가 되십니까?

이제 이 클릭 이벤트에 이런 코드를 입력합니다.

Private Sub btnCancel_Click()
    Unload UserForm1
End Sub

이것은 [취소] 버튼을 클릭했을 때, 유저폼을 닫는 것입니다.

(4) 유저폼으로 돌아가기

(4) 위와 같이 코드 입력 작업이 완료되었으면 Shift + F7키를 누릅니다. 그러면 좀전의 유저폼이 다시 나타날 것입니다.

(5) OK 버튼 코드 입력하기

(5) 이번에는 OK 버튼을 더블 클릭합니다. 이번에는 btnOK_Click 이라는 (빈) 이벤트 핸들러 프로시저가 나타나는데 여기에는 아래의 코드를 그대로 입력합니다(코드가 너무 복잡하도고 생각하시는 분은 복사를 하셔도 됩니다).

Private Sub btnOK_Click()
    Dim intRow As Long
    '//입력된 행 수를 카운트 할 변수 지정합니다.

    Sheets("Sheet2").Select
    intRow = Application.CountA(Range("a:a")) + 1
    '//이름이 입력된 A열 중에서 값이 공란인 것이 몇번째 열인지를 찾아서 그 값에 +1을 한 다음,
    '//intRow 변수에 대입합니다.
    Cells(intRow, 1) = txtName.Text
    '//A열의 빈란으로 가서 txtName 컨트롤의 Text 즉 텍스트 상자의 값을 대입시킵니다.

    If optMale Then
        Cells(intRow, 2) = "남성"
    ElseIf optFemale Then
        Cells(intRow, 2) = "여성"
    Else
        Cells(intRow, 2) = "미상"
    End If
    '//optMale이 체크되었으면 "남성"을, optFemale 버튼이 체크되었으면 "여성"을,
    '//이것도 저것도 아니면 "미상"이라는 문자열을 공란이 발견된 행에서 오른쪽으로 한 간
    '//옆으로 이동해서 대입합니다.

    txtName.Text = ""
    optUnknown = True
    txtName.SetFocus
    '//해당 셀에 대입하는 작업이 끝났으면 txtName 컨트롤의 값을 공란으로,
    '//optUnknown 컨트롤에는 체크를, 그리고 txtName 컨트롤로 포인터를 옮겨놓은 후
    '//프로시저를 종료합니다.
End Sub

참고: 이벤트 핸들러의 이름은 컨트롤이름_이벤트명 형식입니다. 컨트롤의 Name 속성을 나중에 바꾸면 기존 코드와 연결이 끊어져 이벤트가 동작하지 않으므로, 이름을 바꾸셨다면 프로시저 이름도 함께 바꿔 주셔야 합니다. 또한 위 예제는 이름 입력 여부를 검사하지 않으므로, 실무에서는 If txtName.Text = "" Then으로 빈 입력을 걸러내는 코드를 추가하시는 것이 좋습니다.

마무리

이렇게 해서 간단한 유저폼을 하나 만들어 보았는데 어떠신지… 아마 '생각보다 간단하군!' 하고 생각하시는 분도 있을 것이고, 또 어떤 분은 '이거 뭐가뭔지 하나도 모르겠다!' 하고 생각하시는 분도 있을 것입니다.

"Excel에 날개달기" VB(A) 강좌, 특히 코드 부분은 제가 머리카락을 뜯어가며 어떻게 하면 좀더 쉽게 자알 설명했다고 소문이 날까?' 생각에 생각을 거듭하여 생각해 낸 산물입니다.

그냥 소설책 읽듯이 그냥 눈으로만 한번 보고 휙~~ 버리지 마시기 바랍니다. 한번 봐서 이해가 안 가시면 시간이 좀 지난 다음에 두번, 세번 계속 들여다 보세요. 그러면 어느 순간에 가서는 이해가 되실 것입니다. 어렵기 때문에 도전해서 성취할 가치가 있는 것이지요.

다음 시간에…

정리 — 이벤트 핸들러 핵심 정리

구분 코드 역할
폼 닫기 Unload UserForm1 취소 버튼 동작
빈 행 찾기 Application.CountA(Range("a:a")) + 1 다음 입력 행 계산
값 기록 Cells(intRow, 1) = txtName.Text 이름 입력
초기화 txtName.SetFocus 입력 후 커서 이동

자주 묻는 질문 (FAQ)

Q1. 이벤트란 무엇인가요?

워크시트나 유저폼에서 키를 누르거나 마우스를 클릭하는 등의 동작 하나하나를 말합니다.

Q2. 이벤트 핸들러 프로시저 이름은 어떻게 정해지나요?

컨트롤의 Name 속성과 이벤트 이름을 밑줄로 연결한 형태(예: btnCancel_Click)로 자동 생성됩니다.

Q3. 유저폼과 코드 창은 어떻게 오가나요?

코드 창에서 Shift + F7을 누르면 유저폼이 다시 나타납니다.

마치며

한 번 봐서 이해가 안 가시면 시간이 지난 뒤 두 번, 세 번 계속 들여다 보세요. 어렵기 때문에 도전해서 성취할 가치가 있습니다.