엑셀뿐 아니라 많은 프로그램에서 우클릭을 통해 메뉴를 띄우고 기능을 사용할 수 있습니다. 엑셀에서는 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
- 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
메뉴 삭제하기
특정 메뉴를 삭제하고 싶은 일이 생길 수도 있겠죠? 그렇다면 위에서 메뉴를 생성할 때 사용한 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
'프로젝트 및 실습 > VBA' 카테고리의 다른 글
[VBA] 엑셀을 열지 않고 Userform을 실행하는 방법 (0) | 2023.04.13 |
---|---|
[VBA] TreeView(2): File Structure에서 Folder, File 실행 (0) | 2022.09.22 |
[VBA] TreeView(1): File Structure 출력 (2) | 2022.09.19 |
[VBA] Choose Function (0) | 2022.08.23 |
[VBA] 문자열 자르기(Left, Right, Mid) (0) | 2022.08.23 |