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
샘플 파일 다운로드해서 테스트해보세요.
참고로 365에서 삽입한 확인 체크박스입니다.
'XLS+VBA' 카테고리의 다른 글
구글 Gemini API 활용, 일괄로 문장 바꿔 쓰기(Rephrasing) (0) | 2025.01.01 |
---|---|
365 엑셀에서 셀안의 그림(PictureInCell) 기능 (0) | 2024.12.23 |
단어의 빈도수 통계내기 (2) | 2024.12.06 |
WinHttp 한글 인코딩이 깨질 때 처리 방법(예시: 당근 사이트) (0) | 2024.11.18 |
의료기기 검색 크롤링 (2) | 2024.10.03 |
구글 검색 API > 검색 결과 첫번째 링크 가져오기 (0) | 2024.07.03 |
엑셀연동] 자동 방배정 및 명단 출력 2 (0) | 2024.05.23 |
엑셀연동] 방배정 명단 출력 1 (0) | 2024.05.23 |
최근댓글