프로젝트 및 실습/VBA

[VBA] 우클릭 Command Bar 메뉴 편집하기

jooona 2022. 11. 15. 19:09
반응형

엑셀뿐 아니라 많은 프로그램에서 우클릭을 통해 메뉴를 띄우고 기능을 사용할 수 있습니다. 엑셀에서는 VBA를 통해 우클릭 메뉴를 추가하고 삭제할 수 있습니다.

 

메뉴 추가하기


Sub AddMenu()

    Dim CmdBar As CommandBar
        
    Set CmdBar = Application.CommandBars("Cell")
    
    With CmdBar.Controls.Add
    .Tag = "My_Tag"  '추가할 메뉴의 태그
    .Caption = "추가된 메뉴"  '추가할 메뉴의 이름
    .FaceId = 137  '함께 표시할 아이콘
    .OnAction = "ExecuteFn"  '실행할 함수
    End With

End Sub

Sub ExecuteFn()
    
    MsgBox "실행되었습니다"
    
End Sub

 

위와 같이 코드를 작성하고 실행하면 다음 캡처와 같이 메뉴가 추가되며, 해당 메뉴를 클릭하면 코드에서 .OnAction 뒤에 작성한  함수가 실행됩니다.

 

 

가장 하단에 메뉴가 추가되는 것을 확인할 수 있습니다. 

 

참고

- 아이콘을 표시하기 위한 FaceID는 구글에 "MSO image Faceid"라고 검색하시면 찾아볼 수 있습니다. 제가 사용한 FaceID 링크는 아래와 같습니다.

https://www.dropbox.com/s/7q7y7uf3tuy02uu/FaceID%20Excel%202021.pdf?dl=0

 

FaceID Excel 2021.pdf

Dropbox를 통해 공유함

www.dropbox.com

 

- OnAction 뒤에 오는 함수는 반드시 Module안에 위치해야 합니다. 다른 모듈의 함수와 연결하려면 "Module2.ExecuteFn"과 같이 사용할 수 있습니다.

 

-  OnAction 뒤에 오는 함수에 Parameter를 전달하고 싶다면 구글에 "VBA OnAction with multi parameters"라고 검색하시면 쉽게 찾아보실 수 있습니다.  저는 처음에 Stack Overflow의 다음 글을 참고했습니다.

https://stackoverflow.com/questions/13079727/excel-vba-how-to-pass-multiple-variables-to-onaction

 

Excel, VBA: How to pass multiple variables to .OnAction

I am trying to pass multiple variables to a .OnAction call for a button. I have not been able to find answers that relate to multiple variables, and I can do it with just one variable. Here is wh...

stackoverflow.com

 

 

메뉴 삭제하기

특정 메뉴를 삭제하고 싶은 일이 생길 수도 있겠죠? 그렇다면 위에서 메뉴를 생성할 때 사용한 tag를 통해서 특정 메뉴를 삭제할 수 있습니다.

 


Sub DeleteFromMenu()
    Dim CmdBar As CommandBar
    Dim ctrl As CommandBarControl

    Set CmdBar = Application.CommandBars("Cell")
    
    For Each ctrl In CmdBar.Controls
        If ctrl.Tag = "My_Tag" Then
            ctrl.Delete
        End If
    Next ctrl
    
End Sub

 

또는, 다음의 코드를 통해 특정 순번의 메뉴를 삭제할 수도 있습니다.

 


Sub DeleteFromMenu2()

    Dim CmdBar As CommandBar

    Set CmdBar = Application.CommandBars("Cell")
    
    CmdBar.Controls(1).Delete

End Sub

 

CmdBar.Controls().Delete에서 괄호 안에 있는 번호를 통해 원하는 순서의 메뉴를 삭제할 수 있습니다. 저는 1번 메뉴를 삭제했기 때문에 우클릭을 해보면 "잘라내기"버튼이 사라진 것을 확인할 수 있습니다.

 

 

메뉴 리셋하기

메뉴를 추가 또는 삭제하다가 실수하는 경우, 필수적인 기능이 삭제되는 등 의도치 않게 귀찮은 상황이 발생할 수 있습니다.

 

다음의 코드를 통해 메뉴를 초기 상태로 리셋할 수 있습니다.

 

Sub ResetMenu()

    Dim CmdBar As CommandBar
    Set CmdBar = Application.CommandBars("Cell")

    CmdBar.Reset

End Sub

 

반응형