Excel - VBA

Ribbon Menu에 토글버튼 사용하기

EGTools 2023. 1. 6. 12:30

리본메뉴에서 아래처럼 [날짜 선택] On/Off 되는 토글 버튼을 사용하는 방법입니다.

 

선택이 되어 On 상태이면 바탕색이 짙은 회색으로 변하고, 

선택이 해제되어 Off 상태이면 바탕색이 사라집니다. 

 

리본메뉴 XML에서는 이렇게 정의합니다.

 <toggleButton id="btnDTPicker" label="날짜 선택" imageMso="ConditionalFormattingHighlightDateOccuring" 
 size="large" onAction="rbnDTPicker" getPressed="rbnDTPikerPressed" />

토글버튼을 클릭했을 때 할일은 OnAction을 통해서 호출하고,

토글버튼의 상태를 업데이트 하는 것은 getPressed를 통해서 진행합니다.

 

 

CallBack 함수는 이렇게 작성합니다.

Public DTEnabled As Boolean     '// Date Picker용

'// Ribbon Menu에서 "날짜입력" toggle button "onAction" 처리
Sub rbnDTPicker(control As IRibbonControl, pressed As Boolean)
    If control.ID = "btnDTPicker" Then DTEnabled = pressed
    UpdateDPMenu "Cell"                  '// 일반  셀에서 사용되는 메뉴정리
    UpdateDPMenu "List Range Popup" '// Table 셀에서 사용되는 메뉴정리
End Sub

'// Ribbon Menu에서 "날짜입력" toggle button "getPressed" 처리
Sub rbnDTPikerPressed(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "btnDTPicker" Then returnedVal = DTEnabled
    UpdateDPMenu "Cell"                   '// 일반  셀에서 사용되는 메뉴정리
    UpdateDPMenu "List Range Popup" '// Table 셀에서 사용되는 메뉴정리
End Sub

OnAction에서 호출하는 rbnDTPicker로 전달되는 pressed 상태를 내부 변수로 전달합니다.

리본 메뉴가 보이지 않다가 다시 보여줄 때 버튼의 상태는 getPressed를 통해서 내부 변수 값을 참고하여 설정됩니다.

 

위 내용중 UpdateDPMenu는 마우스 오른쪽 버튼의 메뉴를 관리하는 프로시저입니다.

오른쪽 마우스 버튼을 일반셀에서 사용할 때 나오는 메뉴의 이름은 "Cell"이고,

표의 내부에서 오른쪽 마우스 버튼을 사용할 때 나오는 메뉴는 "List Range Popup"입니다.

Sub UpdateDPMenu(CommndBarName As String)
    Dim ctl As Object
    
    If DTEnabled Then
        '// 이미 추가되었는지 확인
        For Each ctl In Application.CommandBars(CommndBarName).Controls
            If ctl.Tag = "EGDatePicker" Then Exit Sub
        Next
    
        With Application.CommandBars(CommndBarName).Controls.Add(Type:=msoControlButton, before:=1, temporary:=True)
            .Tag = "EGDatePicker"
            .Caption = "날짜 선택"
            .FaceId = 12217
            .BeginGroup = True
            .OnAction = "ShowDatePicker"
        End With
    Else
        For Each ctl In Application.CommandBars(CommndBarName).Controls
            If ctl.Tag = "EGDatePicker" Then ctl.Delete
        Next
    End If
End Sub

 

이렇게 하면 토글버튼을 클릭하면 On 상태가 되고, 내부 변수가 True로 반영되고, 이를 통해 마우스 오른쪽 버턴의 메뉴를 추가하게 되고, Off 상태라면 메뉴를 제거하게 됩니다.