• 최초 작성일: 2000-11-03
  • 최종 수정일: 2026-09-30
  • 조회수: 8 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: Modeless 대화상자 만들기

들어가기 전에

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

이번 시간에는 Exceller와 나초보씨의 대화로 시작합니다.

Exceller: Modal 또는 Modeless란 말을 혹시 들어보셨는지요?
나초보: 혹시 Model, Modeless라고 써야할 것을 잘못 친, 미스타이핑 아닙니까?
Exceller: 절대 아닙니다. 무엇일까요?
나초보: less가 "~보다 적은, ~이 없는" 등의 뜻을 가진 부정형 접미사니까 Modal의
반대가 Modeless 겠군요.
Exceller: 앗! 그건 맞습니다. 대단 하시군요. 그럼 Modal이란 무엇일까요?
나초보: (우이~씨!) Modal을 어떻게 읽어야 하는 지도 모르는 사람한테… 빨랑
답이나 갈쳐줘요!!!

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

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

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


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

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

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

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

Modeless 대화상자 만들기

핵심 요약: Modeless 대화상자

Show vbModeless로 유저폼을 띄우고 Workbook 이벤트에서 폼의 Label을 갱신하면 셀을 옮길 때마다 정보가 실시간으로 바뀝니다.

  • 1단계: Label 8개와 종료 버튼이 있는 유저폼을 만듭니다.
  • 2단계: ThisWorkbook의 SheetActivate와 SheetSelectionChange에서 갱신 프로시저를 호출합니다.
  • 3단계: UserForm1.Show vbModeless로 폼을 표시합니다.

Step 1: Modal과 Modeless

알겠나이다!

우리가 흔히 접하게 되는 대화상자(Dialog Box. Dialog sheet 말고…)를 한번 떠올려 보세요. 예를 들어, "서식-조건부 서식" 메뉴를 선택했을 때 나타나는 대화상자를 생각해 보세요. 생각이 안나면 재빨리 살펴 보고 오시고…

아마도 대부분의 대화상자는 사용자가 어떤 다른 작업을 하려고 하면 현재 화면상에 떠있는 대화상자를 반드시 닫아야만 합니다. 이것을 Modal(모달)이라고 합니다. 그런데 어떤 대화상자는 화면상에 대화상자가 떠 있어도 다른 작업을 계속 진행할 수 있도록 되어 있는 것이 있는데 이것을 Modeless(모달리스)라고 부릅니다.

일단 말로 설명하면 이렇습니다. 절대로 말로 때우는 "Excel에 날개달기" 강좌가 아니니까 예제를 보아야 겠지요? 아래의 버튼을 누르신 다음, 이곳저곳 아무 셀이나 선택해 보세요. 표를 하나 만들어 두는 것이 좋겠군요(아무리 생각해 봐도 Exceller는 지극정성입니다. 이 담에 죽어서 꼬옥 좋은 데 가겠지요? ^___^).

아래와 같은 표를 하나 만들어 두고 실행해 보시기 바랍니다.

DistrictJANFEBMAR1 QTR
East1,000,000900,0001,300,0003,200,000
West1,500,0001,350,0001,950,0004,800,000
South900,000810,0001,170,0002,880,000
North880,000792,0001,144,0002,816,000
Germany1,000,000900,0001,300,0003,200,000
UK500,000450,000650,0001,600,000
Japan100,50090,450130,650321,600

어떻습니까? 대화상자가 화면에 떠 있는 상태임에도 불구하고 셀 포인터를 움직일 때마다 해당 셀의 여러 가지 정보들이 대화상자 내부에 마구마구 업데이트 되지요? 이번 시간에는 이러한 Modaless 대화상자를 만들어 보겠습니다. 재미있겠지요?

Step 2: 유저폼 만들기

(1) VB Editor 상태에서 UserForm을 하나 삽입하고 아래와 같이 필요한 컨트롤들을 삽입합니다.

레이블 8개와 종료 버튼을 배치한 유저폼
아이엑셀러

위의 빨간 동그라미 친 부분에도 Label이 있으니까 모두 8개의 레이블과 1개의 커맨드 버튼을 그려 넣습니다.

Private Sub cmdClose_Click()
    Unload Me
End Sub

Step 3: ThisWorkbook 이벤트 작성하기

(2) 이 Modaless 대화상자를 만들기 위해서는 여러 종류의 이벤트들 중에서 ThisWorkbook 오브젝트의 SheetActivate 이벤트와 SheetSelectionChange Event를 사용해야 합니다. 따라서 프로젝트 탐색기에서 ThisWorkbook 오브젝트를 더블클릭 하고(그림 참고), 아래와 같은 코드를 코드 모듈에 작성합니다.

프로젝트 탐색기에서 ThisWorkbook을 열어 이벤트 코드를 작성한 화면
아이엑셀러

코드 자체는 별로 설명드릴 것이 없습니다. 워크북 내의 시트가 활성화되거나 시트 중에서 SelectionChange 이벤트가 발생하였을 경우, ShowFormatByModeless라는 프로시저를 호출하는 것입니다.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Call ShowFormatByModeless
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Call ShowFormatByModeless
End Sub

Step 4: 정보를 표시하는 프로시저 작성하기

(3) 이제 아래와 같은 ShowFormatByModeless 프로시저를 작성합니다. 이 부분도 마찬가지로 별로 어려운 것은 없을 것입니다.

Sub ShowFormatByModeless()
    With UserForm1
        .lblCellAddressContent.Caption = ActiveCell.Address(False, False)
        If ActiveCell.HasFormula Then
            .lblFormulaContent.Caption = ActiveCell.Formula
        Else
            .lblFormulaContent.Caption = "공식이 입력된 셀이 아닙니다"
        End If
        .lblFormatContent.Caption = ActiveCell.NumberFormat
        .lblFontName.Caption = ActiveCell.Font.Name & " / " & ActiveCell.Font.Size
    End With
End Sub

Step 5: 유저폼을 불러오는 프로시저 작성하기

(4) 마지막으로, 이 유저폼을 불어올 프로시저를 작성하고 이것을 버튼에 연결하면 끝이 납니다.

Sub ShowForm()
    Dim Msg As String

    Msg = "죄송합니다" & vbCr
    Msg = Msg & "이 기능은 Excel 2000 버전부터 지원합니다"
    If Val(Application.Version) < 9 Then
        MsgBox Msg, vbCritical, "에러 발생//Exceller"
        Exit Sub
        '//Excel 2000 이하 버전일 경우에는 실행이 되지 않을 것이므로 Excel Version을 체크해서
        '//그 이하 버전이면 에러 메시지를 띄우고 프로시저를 빠져 나갑니다.

    Else
        UserForm1.Show vbModeless
        '//바로 요 부분입니다. 지금까지는 UserForm을 불러올 때, 그냥 UserForm.Show 이러한
        '//형태로 사용했습니다만, Modeless 형태로 호출하기 위해서는 Show 메서드 뒤에다가
        '//vbModeless라는 구문을 추가해 주면 됩니다.
        '//이 문장을 UserForm. Show 0 이렇게 적어도 됩니다.

    End If
End Sub

이 강좌는 Excel 2000에서 처음 지원된 기능을 다루며, 코드의 버전 확인(Val(Application.Version) < 9)은 그 당시 환경을 위한 것입니다. 현재 사용하는 버전에서는 이 확인이 필요하지 않으며, 모덜리스 유저폼은 그대로 사용할 수 있습니다.

마무리

많이들 응용해 보시기 바랍니다. Have a Nice Weekend!!!

다음 시간에…

정리 — Modeless 대화상자 핵심

구분 사용한 코드 역할
Modeless 표시 UserForm1.Show vbModeless 폼을 띄운 채 작업 계속
셀 이동 감지 Workbook_SheetSelectionChange 선택이 바뀔 때 발생
시트 전환 감지 Workbook_SheetActivate 시트가 활성화될 때 발생
수식 확인 ActiveCell.HasFormula 수식 유무 판단
서식 표시 ActiveCell.NumberFormat 표시 형식 가져오기

자주 묻는 질문 (FAQ)

Q1. Modal과 Modeless는 무엇이 다른가요?

Modal 대화상자는 닫아야 다른 작업을 할 수 있고, Modeless 대화상자는 떠 있는 상태에서도 다른 작업을 계속할 수 있습니다.

Q2. 유저폼을 Modeless로 띄우려면 어떻게 하나요?

Show 메서드 뒤에 vbModeless(값 0)를 지정하면 됩니다.

Q3. 셀을 옮길 때마다 폼을 갱신하려면 어떤 이벤트를 쓰나요?

ThisWorkbook의 SheetSelectionChange와 SheetActivate 이벤트를 사용합니다.

마치며

Modeless 유저폼과 워크북 이벤트를 함께 쓰면 실시간으로 정보를 보여 주는 도구창을 만들 수 있습니다.