지난 블로그에서 체크박스를 생성하고 셀과 연결하는 VBA 코드를 작성해 보았습니다.
[EXCEL VBA] - 엑셀 VBA 체크박스 넣고, 셀 연결 자동으로 하기
오늘은 선택된 범위 내의 체크박스를 지우는 VBA 코드를 작성해 보겠습니다.
그리고 기존 체크박스를 만드는 코드를 조금 수정하고
체크 박스를 지우는 코드와 함께 간단한 자동화 프로그램을 만들겠습니다.
코드의 목적
이 코드는 선택된 범위의 체크박스를 삭제하는 기능을 합니다.
사용자가 워크시트에서 특정 영역을 선택하면,
해당 영역 안에 위치한 모든 체크박스를 삭제하고,
체크 박스가 위치했던 셀의 글자 색을 검은색으로 변경합니다.
체크 박스 지우기 전체 코드
Private Sub CommandButton2_Click()
Dim Rng As Range
Dim Chk As CheckBox
Set Rng = Application.Selection
For Each Chk In ActiveSheet.CheckBoxes
If Not Application.Intersect(Rng, Chk.TopLeftCell) Is Nothing Then
Chk.TopLeftCell.Font.Color = RGB(0, 0, 0)
Chk.Delete
End If
Next Chk
End Su
코 드 분 석
Dim Rng As Range
Dim Chk As CheckBox
Rng 변수는 선택된 범위를 담을 것이고
Chk 변수는 각각의 체크 박스를 가리키는 데 사용됩니다.
Set Rng = Application.Selection
사용자가 선택한 범위를 Rng 변수에 할당합니다.
For Each Chk In ActiveSheet.CheckBoxes
활성 시트의 모든 체크박스를 순회하면 Chk 변수에 하나씩 할당합니다.
If Not Application.Intersect(Rng, Chk.TopLeftCell) Is Nothing Then
선택된 범위와 체크박스의 위치를 비교하여 체크박스가 선택된 영역 안에 있는 지 확인합니다.
Intersect() 함수에 대해서는 아래 블로그를 참고하시기 바랍니다.
[EXCEL VBA] - 엑셀 VBA에서 두 개의 범위가 겹치는 공통 셀 찾기 : Intersect 함수
Chk.TopLeftCell.Font.Color = RGB(0, 0, 0)
Chk.Delete
만약 겹치는 부분이 있다면, 해당 부분의 글자 색을 검은색으로 만들고
해당 셀에 있는 체크박스를 지웁니다.
부족한 기능
몇 번 테스트 해본 결과 범위를 선택하고 삭제하는 역할은 잘 수행합니다.
확인한 문제는 셀 병합이 되어있을 때였습니다.
셀 병합이 되어있다면, 체크 박스를 만들 때 병합되지 않은 셀처럼 인식해서 체크박스를 생성하고
지울 때도 제대로 지워지지가 않습니다.
체크 박스 생성 및 삭제 코드 전체
Option Explicit
Private Sub CommandButton1_Click()
Dim Rng As Range
Dim Cell As Range
Dim response As VbMsgBoxResult
Set Rng = Application.Selection
response = MsgBox("선택된 영역의 범위는 " & Rng.Address & " 입니다." & vbCrLf & _
"계속하려면 '예', 취소하려면 '아니오'를 클릭하세요.", _
vbYesNo + vbInformation, "범위 확인")
If response = vbYes Then
For Each Cell In Rng.Cells
CreateCheckBox Cell
Next Cell
End If
End Sub
Private Sub CreateCheckBox(Cell As Range)
Dim Chk As CheckBox
Set Chk = ActiveSheet.CheckBoxes.Add(Cell.Left, Cell.Top, Cell.Width, Cell.Height)
With Chk
.LinkedCell = Cell.Address
.Text = ""
.Value = False
.Height = Cell.Height * 0.6
.Width = Cell.Width * 0.6
.Top = Cell.Top + (Cell.Height - .Height) / 2
.Left = Cell.Left + (Cell.Width - .Width) / 1.1
Cell.Font.Color = RGB(255, 255, 255)
End With
End Sub
Private Sub CommandButton2_Click()
Dim Rng As Range
Dim Chk As CheckBox
Dim response As VbMsgBoxResult
Set Rng = Application.Selection
response = MsgBox("선택된 영역의 범위는 " & Rng.Address & " 입니다." & vbCrLf & _
"계속하려면 '예', 취소하려면 '아니오'를 클릭하세요.", _
vbYesNo + vbInformation, "범위 확인")
If response = vbYes Then
For Each Chk In ActiveSheet.CheckBoxes
If Not Application.Intersect(Rng, Chk.TopLeftCell) Is Nothing Then
Chk.TopLeftCell.Font.Color = RGB(0, 0, 0)
Chk.Delete
End If
Next Chk
End If
End Sub
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.
'EXCEL VBA' 카테고리의 다른 글
[ 엑셀 VBA ] 엑셀 VBA의 오류 및 에러 처리 방법 (0) | 2024.09.04 |
---|---|
[ 엑셀 VBA ] VBA를 공부하기 위한 최고의 메뉴얼, 객체 브라우저(Object Browser) 사용하기 (3) | 2024.09.04 |
[ 엑셀 VBA ] VBA 유저폼 셀 조작 가능하게 하기 : 모달 VS 비모달 (0) | 2024.08.23 |
엑셀 VBA UNIQUE 함수와 유사한 기능을 하는 사용자 정의 함수 만들기 (0) | 2024.08.21 |
엑셀 VBA에서 Dictionary 사용하기 (0) | 2024.08.21 |