오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴
퀵VBA 강의

윈도우10 스타일 엑셀 유저폼 만들기

오빠두엑셀 by 오빠두엑셀
  • 학습시간 22분
  • 난이도 고급
  • 작성일 2020.12.30

미리 작성된 VBA 마스터 코드를 사용하여 윈도우10 스타일의 깔끔한 유저폼 만들기

이 강의에서는 엑셀 VBA 유저폼의 기본 버튼이 가진 윈도우98 스타일을 벗어나, 레이블과 텍스트상자 컨트롤을 활용해 윈도우10 스타일의 모던 버튼을 제작하는 방법을 다룹니다. 마우스 호버 효과를 자동으로 적용하는 VBA 마스터 코드와 두 컨트롤의 차이점, TAB키 이동 순서 설정까지 정리해 실무에서 곧바로 활용할 수 있는 깔끔한 유저폼을 완성할 수 있습니다.

윈도우10 스타일 엑셀 유저폼 만들기
DOWNLOADS

실습자료를 준비했어요

수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇

이번 강의에 사용된 VBA 마스터 코드

이번 강의에서 사용한 윈도우10 스타일 모던 유저폼 VBA 마스터 코드입니다. 아래 설명에 따라 명령문을 유저폼 안에 붙여넣은 뒤, 실제 사용 중인 버튼 이름으로 코드를 수정하면 윈도우10 스타일의 깔끔한 유저폼을 손쉽게 완성할 수 있습니다.

윈도우10 스타일 기본 명령문

아래 코드를 유저폼에 추가한 뒤, btnXXX, btnYYY 부분을 유저폼에서 사용 중인 실제 버튼 이름으로 변경합니다. 여러 개의 버튼을 함께 적용할 때는 버튼 이름을 쉼표(,)로 구분해서 입력합니다.

'아래 코드를 유저폼에 추가한 뒤, "btnXXX, btnYYY"를 버튼이름을 쉼표로 구분한 값으로 변경합니다.
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim ctl As Control
Dim btnList As String: btnList = "btnXXX, btnYYY" ' 버튼 이름을 쉼표로 구분하여 입력하세요.
Dim vLists As Variant: Dim vList As Variant
If InStr(1, btnList, ",") > 0 Then vLists = Split(btnList, ",") Else vLists = Array(btnList)
For Each ctl In Me.Controls
    For Each vList In vLists
        If InStr(1, ctl.Name, Trim(vList)) > 0 Then OutHover_Css ctl
    Next
Next
End Sub
 
'커서 이동시 버튼 색깔을 변경하는 보조명령문을 유저폼에 추가합니다.
Private Sub OnHover_Css(lbl As Control): With lbl:   .BackColor = RGB(211, 240, 224):    .BorderColor = RGB(134, 191, 160): End With: End Sub
Private Sub OutHover_Css(lbl As Control): With lbl:   .BackColor = &H8000000E:    .BorderColor = &H8000000A: End With: End Sub

윈도우10 스타일 버튼 명령문

아래 코드를 유저폼에 추가한 뒤, btnXXX 부분을 유저폼에서 사용 중인 실제 버튼 이름으로 변경합니다. 명령문은 버튼 한 개당 하나씩 작성하면 됩니다.

'유저폼에 추가한 버튼에 개수만큼 아래 명령문을 유저폼에 추가한 뒤, btnXXX를 버튼 이름으로 변경합니다.
Private Sub btnXXX_Exit(ByVal Cancel As MSForms.ReturnBoolean)
OutHover_Css Me.btnXXX
End Sub
 
Private Sub btnXXX_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
OnHover_Css Me.btnXXX
End Sub
 
Private Sub btnXXX_Enter()
OnHover_Css Me.btnXXX
End Sub

윈도우10 스타일 유저폼 - 레이블버튼 vs 텍스트상자 버튼

엑셀 VBA 유저폼은 윈도우98 디자인의 버튼만 기본 제공합니다. 따라서 윈도우10 디자인의 버튼을 만들기 위해서는 '레이블' 또는 '텍스트상자' 컨트롤을 응용해야 합니다.

두 방법 모두 윈도우10 스타일의 유저폼 버튼으로 동일하게 활용할 수 있으며, 각 버튼의 차이점은 아래 표와 같습니다.

항목 레이블 버튼 텍스트상자 버튼
TAB키 동작 이동 불가 TAB키로 이동 가능
마우스 커서 기본 마우스 커서 편집 커서 (속성에서 변경가능)
마우스 클릭 Label_Click () TextBox_MouseDown()
키보드 입력 없음 TextBox_KeyDown()
추가 설정 - 1. 잠금(Locked) 속성을 TRUE로 변경
2. 마우스 커서 속성을 fmMousePointerArrow (화살표)로 변경
공통 설정
  • 배경색(Back Color) : 흰색 (&H80000005&)
  • 테두리색(BorderStyle) : 활성테두리 (&H8000000A&)
  • 테두리 포함(Border Style) : fmBorderStyleSingle (테두리 포함)
  • 특수 효과(Special Effect) : fmSpecialEffectFlat (효과 없음)

윈도우10 스타일 유저폼 #1 - 레이블 버튼

첫 번째로 윈도우10 스타일 유저폼에 들어가는 레이블 버튼을 제작합니다.

  1. VBA 편집기를 실행합니다. (단축키 : ALT + F11) VBA 편집기가 열리면 [삽입] - [사용자 정의폼]을 클릭하여 새로운 유저폼을 추가합니다.사용자 정의 폼 삽입
  2. 도구상자에서 '레이블'을 선택한 뒤, 유저폼 위에 새로운 레이블을 추가합니다.
    [Tip] 도구상자가 보이지 않을 경우 [보기] - [도구상자]를 클릭하면 도구상자를 활성화할 수 있습니다.레이블 추가
  3. 레이블을 선택한 뒤 키보드 F4키를 누르면 속성창이 나타납니다. 이후 레이블의 각 속성을 아래와 같이 변경합니다.
    [Tip] 유저폼 배경을 흰색으로 변경하면 한층 더 깔끔한 유저폼을 완성할 수 있습니다.

    항목 설정
    (이름) btnLabel1
    BackColor &H8000000E& (텍스트반전)
    BorderColor &H8000000A& (활성테두리)
    BorderStyle 1-fmBorderStyleSingle
    Caption 레이블버튼
    Font 글꼴 : 맑은 고딕
    크기 : 12
    Height 20
    TextAlign 2-fmTextAlignCenter (가운데 정렬)

    유저폼 레이블 설정 변경

  4. 레이블을 더블클릭하여 유저폼 모듈로 이동한 뒤, 아래 명령문을 복사하여 붙여넣기 합니다.
    Private Sub btnLabel1_Click()
    MsgBox "버튼을 클릭하였습니다."
    End Sub
     
    '유저폼에 추가한 버튼에 개수만큼 아래 명령문을 유저폼에 추가한 뒤, btnLabel1를 버튼 이름으로 변경합니다.
    Private Sub btnLabel1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    OutHover_Css Me.btnLabel1
    End Sub
     
    Private Sub btnLabel1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    OnHover_Css Me.btnLabel1
    End Sub
     
    Private Sub btnLabel1_Enter()
    OnHover_Css Me.btnLabel1
    End Sub
     
    '아래 코드를 유저폼에 추가한 뒤, "btnXXX, btnYYY"를 버튼이름을 쉼표로 구분한 값으로 변경합니다.
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim ctl As Control
    Dim btnList As String: btnList = "btnLabel1" ' 버튼 이름을 쉼표로 구분하여 입력하세요.
    Dim vLists As Variant: Dim vList As Variant
    If InStr(1, btnList, ",") > 0 Then vLists = Split(btnList, ",") Else vLists = Array(btnList)
    For Each ctl In Me.Controls
        For Each vList In vLists
            If InStr(1, ctl.Name, Trim(vList)) > 0 Then OutHover_Css ctl
        Next
    Next
    End Sub
     
    '커서 이동시 버튼 색깔을 변경하는 보조명령문을 유저폼에 추가합니다.
    Private Sub OnHover_Css(lbl As Control): With lbl:   .BackColor = RGB(211, 240, 224):    .BorderColor = RGB(134, 191, 160): End With: End Sub
    Private Sub OutHover_Css(lbl As Control): With lbl:   .BackColor = &H8000000E:    .BorderColor = &H8000000A: End With: End Sub
  5. 키보드 F5키를 눌러 유저폼을 실행하면 윈도우10 스타일의 유저폼이 완성됩니다. 레이블 버튼을 클릭하면 '버튼을 클릭하였습니다.'라는 안내 메시지가 출력됩니다.엑셀 유저폼 레이블 버튼 완성 GIF

윈도우10 스타일 유저폼 #2 - 텍스트상자 버튼

레이블 버튼을 사용하면 텍스트상자보다 적은 단계의 설정만으로 윈도우10 스타일 버튼을 만들 수 있다는 장점이 있습니다. 다만 레이블 버튼은 키보드 TAB 키로 이동이 불가능하므로, 사용자가 반드시 마우스로 직접 클릭해야 한다는 제한이 있습니다.

따라서 키보드 TAB키로 버튼 사이를 이동하거나 엔터키로 버튼을 실행할 수 있도록 하려면 텍스트상자 버튼을 사용해야 합니다.

  1. VBA 편집기에서 [삽입] - [사용자 정의폼]을 클릭하여 새로운 유저폼을 추가합니다.사용자 정의 폼 삽입
  2. 도구상자에서 '텍스트상자'를 선택한 뒤, 유저폼 위에 새로운 텍스트상자를 추가합니다.엑셀 유저폼 텍스트박스 추가
  3. 텍스트상자를 선택한 뒤 키보드 F4키를 누르면 속성창이 나타납니다. 이후 텍스트상자의 각 속성을 아래와 같이 변경합니다.
    [Tip] 유저폼 배경을 흰색으로 변경하면 한층 더 깔끔한 유저폼을 완성할 수 있습니다.

    항목 설정
    (이름) btnText1
    BackColor &H8000000E& (텍스트반전)
    BorderColor &H8000000A& (활성테두리)
    BorderStyle 1-fmBorderStyleSingle
    Font 글꼴 : 맑은 고딕
    크기 : 12
    Height 20
    Locked True
    MousePointer 1 - fmMouserPointerArrow (일반 커서)
    SelectionMargin True
    SpecialEffect 0 - fmSpecialEffectFlat (효과 없음)
    TextAlign 2-fmTextAlignCenter (가운데 정렬)
    Value 텍스트상자 버튼

    엑셀 유저폼 텍스트박스 설정 변경

  4. 완성된 텍스트상자를 복사한 뒤 아래쪽에 붙여넣기 합니다. 이후 붙여넣은 텍스트상자의 이름을 변경합니다.
    항목 설정
    (이름) btnText2

    유저폼 텍스트박스 추가

  5. 텍스트상자를 더블클릭하여 유저폼 모듈로 이동한 뒤, 아래 명령문을 복사하여 붙여넣기 합니다.
    Private Sub btnText1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then MsgBox "버튼을 클릭하였습니다."
    End Sub
     
    Private Sub btnText1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    MsgBox "버튼을 클릭하였습니다."
    End Sub
     
    Private Sub btnText2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then MsgBox "버튼을 클릭하였습니다."
    End Sub
     
    Private Sub btnText2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    MsgBox "버튼을 클릭하였습니다."
    End Sub
     
    '유저폼에 추가한 버튼에 개수만큼 아래 명령문을 유저폼에 추가한 뒤, btnText2를 버튼 이름으로 변경합니다.
    Private Sub btnText2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    OutHover_Css Me.btnText2
    End Sub
     
    Private Sub btnText2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    OnHover_Css Me.btnText2
    End Sub
     
    Private Sub btnText2_Enter()
    OnHover_Css Me.btnText2
    End Sub
     
    '유저폼에 추가한 버튼에 개수만큼 아래 명령문을 유저폼에 추가한 뒤, btnText1를 버튼 이름으로 변경합니다.
    Private Sub btnText1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    OutHover_Css Me.btnText1
    End Sub
     
    Private Sub btnText1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    OnHover_Css Me.btnText1
    End Sub
     
    Private Sub btnText1_Enter()
    OnHover_Css Me.btnText1
    End Sub
     
    '아래 코드를 유저폼에 추가한 뒤, "btnXXX, btnYYY"를 버튼이름을 쉼표로 구분한 값으로 변경합니다.
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim ctl As Control
    Dim btnList As String: btnList = "btnText1,btnText2" ' 버튼 이름을 쉼표로 구분하여 입력하세요.
    Dim vLists As Variant: Dim vList As Variant
    If InStr(1, btnList, ",") > 0 Then vLists = Split(btnList, ",") Else vLists = Array(btnList)
    For Each ctl In Me.Controls
        For Each vList In vLists
            If InStr(1, ctl.Name, Trim(vList)) > 0 Then OutHover_Css ctl
        Next
    Next
    End Sub
     
    '커서 이동시 버튼 색깔을 변경하는 보조명령문을 유저폼에 추가합니다.
    Private Sub OnHover_Css(lbl As Control): With lbl:   .BackColor = RGB(211, 240, 224):    .BorderColor = RGB(134, 191, 160): End With: End Sub
    Private Sub OutHover_Css(lbl As Control): With lbl:   .BackColor = &H8000000E:    .BorderColor = &H8000000A: End With: End Sub
  6. 키보드 F5키를 눌러 유저폼을 실행하면 윈도우10 스타일의 유저폼이 완성됩니다.엑셀 유저폼 텍스트상자 버튼 완성 GIF

TAB키 이동을 위한 컨트롤 우선순위 정하기

유저폼을 한층 더 편리하게 사용하기 위해 TAB키의 이동 순서를 직접 지정할 수 있습니다.

  1. 유저폼을 우클릭한 뒤, [탭 순서]로 이동합니다.유저폼 탭 순서 변경
  2. 컨트롤의 탭키 이동 순서를 원하는 대로 변경한 뒤 [확인] 버튼을 눌러 마무리합니다.유저폼 탭 순서 저장
댓글 12
5 (8개 평가)
Myung
Myung 2020.12.31 09:15
진짜 킹사합니다
임이사
임이사 2021.01.03 11:37
감사합니다~
jcw****
jcw**** 2021.01.05 23:55
감사합니다
prunus
prunus 2021.01.08 14:19
보기 답답한 윈도우98 스타일 콤보박스도 깔끔하게 보이도록하고 싶은데.... 특리 버튼스타일이 너무 마음에 안듭니다. 윈도우10 스타일과 너무 이질적이라서 보기에 좋지 않습니다. 박스 부분은 윗글과 같이 몇가지 속성을 변경하면 되는데 버튼부분은 어찌해볼 도리가ㅠㅠ
mizuki00
mizuki00 2021.04.20 18:59
정말 보면볼수록 대단하신거 같아요 알고있는 부분을 공유해주시고 강의까지 해주시다니
콘
2022.08.14 22:49
레이블에서는 Exit 이벤트가 지원되지 않아서 UserForm_MouseMove 이벤트를 통해 흰색으로 바꾸는 게 맞는 건가요?
콘
2022.08.14 23:23
먼저 쓴 댓글을 삭제할 수 없어 다시 답니다
커서가 벗어날 때 연두색에서 흰색으로 변경되는 건 UserForm_mouseMove 이벤트 코드를 통해서 일어나는데 텍스트 상자나 레이블의 Exit 이벤트 관련 코드를 쓸 필요가 있는 건가요?
오빠두엑셀
오빠두엑셀 작성자 2022.08.16 16:02
안녕하세요^^
이미 유저폼 mousemove 로 레이블 exit 이벤트를 대체할 수 있으므로 따로 작성하지 않았습니다.
각 개체별로 exit 이벤트를 제어하려면 굉장히 많은 노고가 필요하므로 mousemove 이벤트를 사용하는것이 좋습니다.
콘
2022.08.16 21:40
Private Sub btnLabel1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
OutHover_Css Me.btnLabel1
End Sub

Private Sub btnText2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
OutHover_Css Me.btnText2
End Sub
이렇게 코드 쓰셨길래 질문했던 건데요.
없어도 된다는 말씀이시군요
감사합니다
오빠두엑셀
오빠두엑셀 작성자 2022.08.19 17:55
안녕하세요.
말씀하신 코드는 필요합니다!
다만 매 버튼마다 Exit 이벤트를 작성하기 어려울 경우 유저폼 MouseMove에 OutHover 명령문을 몰아서 작성해도 괜찮습니다.
콘
2022.08.20 22:23
어떤 부분에서 Exit 이벤트 코드가 필요한 걸까요?
Exit 이벤트 코드를 주석 처리하고 실행했을 때 큰 차이를 느끼기 어려웠거든요.
강민준🤗
강민준🤗 2024.08.08 20:10
좋은 강의 감사합니다🙇‍♂️