EXCEL VBA

[ 엑셀 VBA ] 체크 박스 삭제하기 : VBA 체크 박스 생성 및 삭제 자동화

카루루1007 2024. 8. 23. 13:09
728x90
반응형

지난 블로그에서 체크박스를 생성하고 셀과 연결하는 VBA 코드를 작성해 보았습니다.

[EXCEL VBA] - 엑셀 VBA 체크박스 넣고, 셀 연결 자동으로 하기

 

오늘은 선택된 범위 내의 체크박스를 지우는 VBA 코드를 작성해 보겠습니다.

그리고 기존 체크박스를 만드는 코드를 조금 수정하고

체크 박스를 지우는 코드와 함께 간단한 자동화 프로그램을 만들겠습니다.

 

728x90

 코드의 목적

 

이 코드는 선택된 범위의 체크박스를 삭제하는 기능을 합니다.

사용자가 워크시트에서 특정 영역을 선택하면,

해당 영역 안에 위치한 모든 체크박스를 삭제하고,

체크 박스가 위치했던 셀의 글자 색을  검은색으로 변경합니다.

 

 체크 박스 지우기 전체 코드

 

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

 

체크박스 지우기 만들기.xlsm
0.02MB

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

 

728x90
반응형