365 버전에는 엑셀 셀에 체크박스 즉, 확인란을 넣는 기능이 있습니다.

 

구버전에서는 이런 기능이 없어서 VBA로 삽입하는 방법입니다.

 

1. Active-X 체크박스 컨트롤

 

첨부파일을 열고 원하는 셀들을 선택하고  AddXCheckBox를 실행하면 아래처럼 삽입해줍니다.

체크박스가 너무 작고 디자인이 너무 단조로운 단점이 있습니다.

장점은 True와 False 값을 갖고 있어서 VBA등에서 값을 이용할 수 있습니다.

디자인모드일 때는 도형이 선택만 되므로 디자인 모드를 풀어줘야 합니다.

 

 

액티브-X체크박스 코드입니다.

더보기
선택된 셀들에 Active-X 체크 네모 삽입
Sub AddXCheckBox()
    
    Dim sht As Worksheet, shp As Shape, rng As Range
    Dim h!, w!, l!, t!, m!
    
    Set sht = ActiveSheet
    m = 3 '여백
    For Each rng In ActiveWindow.Selection
        h = rng.Height - 2 * m
        w = h
        l = rng.Left + rng.Width / 2 - w / 2 '+ m
        t = rng.Top + m '+ 1
        
        Set shp = sht.Shapes.AddOLEObject(ClassType:="Forms.CheckBox.1", Left:=l, Top:=t, Width:=w, Height:=h)
        shp.Name = "XCheckBox_" & rng.Address(False, False)
        shp.OLEFormat.Object.Object.Caption = ""
        shp.OLEFormat.Object.Object.SpecialEffect = 0
        shp.OLEFormat.Object.Object.GroupName = rng.Address(False, False)
    Next rng
    
End Sub
Sub RemoveXCheckBox()
     
    Dim sht As Worksheet, rng As Range
    
    On Error Resume Next
    Set sht = ActiveSheet
    For Each rng In ActiveWindow.Selection
        sht.Shapes("XCheckBox_" & rng.Address(False, False)).Delete
     Next rng
End Sub

액티브-X체크박스가 있는 셀들을 선택하고 Alt+F8 > RemoveXCheckBox를 실행하면 액티브-X체크박스를 삭제합니다.

 

2. 도형을 이용한 체크박스  

 

첨부파일을 열고 Sheet2에서 원하는 셀을 선택하고 AddCheckBox를 실행하면

도형으로 둥근 네모 모양의 체크박스를 삽입해 줍니다.

클릭하면 체크박스는 색깔을 채우고 체크모양 도형(L자 도형)이 나타납니다.

이 과정은 실제로 가로로 넓은 L자 도형을 그리고 도형을 일정 각도 회전하는 방식으로 둥근 네모 안에 직접 그려줍니다.

셀의 크기(높이)를 기준으로 만들기 때문에 셀 높이가 높으면 체크박스 크기가 커집니다.

 

 

체크박스가 있는 셀들을 선택한 상태에서 Alt+F8 > RemoveCheckBox를 실행하면 삭제해 줍니다.

 

Alt+F8 > AlignCheckBox를 실행하면, 체크 도형이 삽입된 이후에 행의 크기를 키운 경우 체크박스가 셀의 중앙에서 벗어나게 되는데 이 때 다시 셀의 가운데에 체크도형이 오도록 모든 체크박스를 중앙으로 정렬해 줍니다.

 

체크박스가 추가되면 Alt+F10 선택창에 네모 도형이 생기고 체크를 하면 체크도형(L자 도형)이 추가되고 RemoveCheckBox로 삭제하면 체크 둥근네모와 체크 도형들이 삭제됩니다. 이 도형들을 마우스 우클릭으로 클릭해서 삭제해도 되고 디자인 모드에서 드래그로 선택해서 삭제해도 됩니다.

 

 

체크도형의 색깔을 다른 색깔로 바꾸려면 초반 소스의 색깔 코드를 바꿔줄 수 있습니다.

rgbDarkGreen, rgbDarkOrange, rgbDarkMagenta, rgbDarkRed 등이 가능합니다.

도형색깔 이름은 링크를 참고하세요.

Const FColor = rgbWhite
Const BColor = rgbDarkOrange
Const CColor = rgbWhite

 

둥근 네모(msoShapeRoundedRectangle)와 체크 도형(msoShapeCorner:162) 대신 원하는 스타일의 도형을 만들 수 있습니다. 도형이름은 링크 참고하세요. 

행이 낮은 상태에서 체크박스를 생성한 경우 행의 높이가 커졌을 때 AlignCheckBox를 실행하면 행의 가운데로 정렬해 줍니다.

 

Module1의 코드입니다.

더보기
Option Explicit

Const FColor = rgbWhite
Const BColor = rgbDarkGreen
Const CColor = rgbWhite

'선택된 셀들에 체크 네모 삽입
Sub AddCheckBox()
    
    Dim sht As Worksheet, shp As Shape, rng As Range
    Dim h!, w!, l!, t!, m!
    
    Set sht = ActiveSheet
    m = 4 '여백
    For Each rng In ActiveWindow.Selection
        h = rng.Height - 2 * m
        w = h
        l = rng.Left + rng.Width / 2 - w / 2 '+ m
        t = rng.Top + m '+ 1
        Set shp = sht.Shapes.AddShape(msoShapeRoundedRectangle, l, t, w, h)
        shp.Name = "CheckBox_" & rng.Address(False, False)
        shp.Fill.Visible = msoTrue
        shp.Fill.ForeColor.RGB = FColor
        'shp.Fill.Transparency = 0.01
        shp.Line.Weight = 1.6
        shp.Line.ForeColor.RGB = BColor
        shp.Adjustments(1) = 0.2
        
        shp.OnAction = "ClickCheck"
    Next rng
    
End Sub

' 체크 표시 삽입
Sub ClickCheck()
    Dim cshp As Shape, sht As Worksheet, shp As Shape, rng As Range
    Dim h!, w!, l!, t!, m!, a!
    Dim Checked As Boolean
    
    Application.ScreenUpdating = False
    Set sht = ActiveSheet
    Set cshp = sht.Shapes(Application.Caller)
    Set rng = cshp.TopLeftCell
    For Each shp In sht.Shapes
        If shp.Name = "Check_" & rng.Address(False, False) Then
            Checked = True
            sht.Shapes("CheckBox_" & rng.Address(False, False)).Fill.ForeColor.RGB = FColor
            shp.Delete
            Exit For
        End If
    Next shp
    If Checked Then Exit Sub
    
    'sht.Shapes("CheckBox_" & rng.Address(False, False)).Fill.Visible = msoTrue
    sht.Shapes("CheckBox_" & rng.Address(False, False)).Fill.ForeColor.RGB = BColor
    m = 0   '여백
    w = (cshp.Width - 2 * m) * 2 / 3
    h = w * 2 / 3
    l = cshp.Left + cshp.Width / 2 - w / 2 + m
    t = cshp.Top + cshp.Height / 2 - h / 2 + m
    Set shp = sht.Shapes.AddShape(162, l, t, w, h)
    shp.Name = "Check_" & rng.Address(False, False)
    shp.Adjustments(1) = 0.3
    shp.Adjustments(2) = 0.3
    shp.Fill.Visible = msoTrue
    shp.Fill.ForeColor.RGB = CColor
    shp.Line.Visible = msoFalse
    shp.Rotation = 314
    'shp.ZOrder msoSendToBack
    
    shp.OnAction = "ClickCheck"
    Beep
    Application.ScreenUpdating = True
End Sub

Sub AlignCheckBox()
    Dim sht As Worksheet, shp As Shape, cshp As Shape, rng As Range
    Dim h!, w!, l!, t!, m!
    
    Set sht = ActiveSheet
    For Each shp In sht.Shapes
        If shp.Name Like "CheckBox_*" Then
            Set rng = shp.TopLeftCell
            shp.Left = rng.Left + rng.Width / 2 - shp.Width / 2
            shp.Top = rng.Top + rng.Height / 2 - shp.Height / 2
        ElseIf shp.Name Like "Check_*" Then
            Set rng = shp.TopLeftCell
            Set cshp = sht.Shapes("CheckBox_" & rng.Address(False, False))
            m = 0   '여백
            shp.Left = cshp.Left + cshp.Width / 2 - shp.Width / 2 + m
            shp.Top = cshp.Top + cshp.Height / 2 - shp.Height / 2 + m
        End If
    Next shp
End Sub

Sub RemoveCheckBox()
     
    Dim sht As Worksheet, shp As Shape, rng As Range
    
    On Error Resume Next
    Set sht = ActiveSheet
    For Each rng In ActiveWindow.Selection
        sht.Shapes("CheckBox_" & rng.Address(False, False)).Delete
        sht.Shapes("Check_" & rng.Address(False, False)).Delete
    Next rng
End Sub

 

3. 이모지 문자를 이용한 체크박스 

윈도우키 + 마침표를 누르면 화려한 스타일의 특수문자 이모지를 삽입할 수 있습니다.

이 때 유니코드 문자가 삽입되는데 이것을 이용해서 체크표시를 하는 방식입니다.

365버전의 확인 박스도 이 것을 이용하는 것으로 짐작됩니다.

 

그런데 이모지 문자는 윈도우, 맥, 안드로이드, IOS 등에서 각기 다른 모양이기 때문에 시스템에 따라서 버전에 따라서 이모지 문자가 달라질 수 있습니다. 

Sheet1 , Sheet3, Sheet4의 문자가 서로 다릅니다. 체크모양의 이모지 문자는 링크에서 찾아보세요.

 

아래는 Sheet1 의 11036, 9989 이모지문자입니다. 

 

Sheet3의 이모지 문자

 

Sheet4의 경우 좀 색다른 문자코드를 이용해보았습니다.

 

 

이 경우 코드를 각 시트에 삽입해야 합니다.

그리고 문자 폰트와 문자코드를 수정해줍니다.

특히 이모지 문자는 긴 문자코드를 사용해서 두 문자코드를 이어붙여서 나타내야할 수도 있습니다.

또한 문자의 모양은 윈도우버전이나 사용하는 시스템에 따라 달라질 수 있습니다.

글자라서 크기를 폰트크기 조절을 이용해서 마음대로 조정하고 복사/삭제가 용이합니다.

 

 

 

Sheet4 의 코드입니다.

더보기
Option Explicit

Private Const OnFont = "Segoe UI"   ' Symbol"      '"Roboto"
Private Const OnSize = 18
Private Const OnColor = rgbGreen
Private Const OffFont = "Segoe UI"     'Emoji" '"Roboto"
Private Const OffSize = 22
Private Const OffColor = rgbGreen

Private Function OnStr() As String
    'OnStr = ChrW(9989)             'hollow checked box
    'OnStr = ChrW(9745)             'ugly narrow hollow checked box
    'OnStr = ChrW(9745) & ChrW(-497)     'filled checked box
    OnStr = ChrW(-10179) & ChrW(-8703)      'happy smile
End Function

Private Function OffStr() As String
    'OffStr = ChrW(11036)            'blank rounded box
    'OffStr = ChrW(-10179) & ChrW(-8909)    'filled small box
    'OffStr = ChrW(-10179) & ChrW(-8936)          'radio button(circle)
    'OffStr = ChrW(9898)           ' circle
    OffStr = ChrW(8856)           ' stop circle
End Function
 
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

    Dim rng As Range
    
    Set rng = Range(Target.SubAddress)
    If rng.Address <> Target.Range.Address Then Exit Sub

    If InStr(rng, OnStr) > 0 Then
        rng.Value = OffStr
        rng.Font.Name = OffFont
        rng.Font.Size = OffSize
    ElseIf InStr(rng, OffStr) > 0 Then
        rng.Value = OnStr
        rng.Font.Name = OnFont
        rng.Font.Size = OnSize
    End If
    rng.Font.Underline = False

End Sub

'// https://stackoverflow.com/a/78831992/6354194
Private Sub GetEmojiWideASCII()

     Dim ThisChar As Long
     Debug.Print ActiveCell.Font.Name, ActiveCell.Font.FontStyle
     
     For ThisChar = 1 To Len(CStr(ActiveCell.Value))
     
          Debug.Print AscW(Mid(CStr(ActiveCell.Value), ThisChar)),
     
     Next ThisChar

End Sub

Sub AddTextCheckBox4()
    
    Dim sht As Worksheet, rng As Range
    
    Set sht = ActiveSheet
    For Each rng In ActiveWindow.Selection
        rng = OffStr
        rng.HorizontalAlignment = xlHAlignCenter
        rng.Hyperlinks.Add rng, "", rng.Address(False, False)
        rng.Font.Underline = False
        rng.Font.Size = OffSize
        rng.Font.Color = OffColor
        rng.Font.Name = OffFont
    Next rng
    
End Sub

 

샘플 파일 다운로드해서 테스트해보세요.

 

CheckBoxes3.xlsm
0.04MB

 

참고로 365에서 삽입한 확인 체크박스입니다.

checkBox365.xlsx
0.01MB