'#엑셀'에 해당되는 글 1건
- 2018.04.10 엑셀 Addin 작성시 마우스 오른쪽 메뉴 생성 방법
엑셀 Addin 작성시 마우스 오른쪽 메뉴 생성 방법
MS쪽 사이트에 있는 코드를 그대로 가져와 설명만 붙여봄
Sub AddToCellMenu(),
Dim ContextMenu As CommandBar,
Dim MySubMenu As CommandBarControl,
,
' 중복 제거를 위해서 미리 메뉴를 삭제해 줌,
Call DeleteFromCellMenu,
,
' CommandBars("Cell")로 지정하면 ContextMenu를 접근할 수 있음,
Set ContextMenu = Application.CommandBars("Cell"),
,
,
' 내장되어 있는 메뉴를 추가(ID = 3 -> Save),
' 내장되어 있는 메뉴를 추가하기 위해선 아래의 한줄이면 끝,
' before는 순서,
ContextMenu.Controls.Add Type:=msoControlButton, ID:=3, before:=1,
,
,
' 1단짜리 메뉴 추가. 일반 툴바에 버튼 추가하는 것과 같은데 순서 지정하는 부분이 있음,
' OnAction에는 동작할 함수가, FaceId는 아이콘이, Caption의 경우 Text로 표시할 부분이, Tag에는 기타 정보가 들어감,
' 삭제시에 Tag정보를 바탕으로 버튼을 삭제할 수 있음,
With ContextMenu.Controls.Add(Type:=msoControlButton, before:=2),
.OnAction = "'" & ThisWorkbook.Name & "'!" & "ToggleCaseMacro",
.FaceId = 59,
.Caption = "대문자/소문자/적절한 문자로 전환",
.Tag = "My_Cell_Control_Tag",
End With,
,
' Add a custom submenu with three buttons.,
' 서브메뉴가 있는 경우 추가 방법,
' 일단 메뉴를 하나 만들고, 그 아래 버튼을 넣는 방식,
' 메뉴를 추가할때 Type을 보면 msoControlPopup임. 버튼일 경우는 Type이 msoControlButton임,
' 일단 버튼을 만든 이후에는 일반 메뉴와 똑같음,
Set MySubMenu = ContextMenu.Controls.Add(Type:=msoControlPopup, before:=3),
,
With MySubMenu,
.Caption = "문자메뉴",
.Tag = "My_Cell_Control_Tag",
,
With .Controls.Add(Type:=msoControlButton),
.OnAction = "'" & ThisWorkbook.Name & "'!" & "UpperMacro",
.FaceId = 100,
.Caption = "대문자",
End With,
With .Controls.Add(Type:=msoControlButton),
.OnAction = "'" & ThisWorkbook.Name & "'!" & "LowerMacro",
.FaceId = 91,
.Caption = "소문자",
End With,
With .Controls.Add(Type:=msoControlButton),
.OnAction = "'" & ThisWorkbook.Name & "'!" & "ProperMacro",
.FaceId = 95,
.Caption = "적절한문자",
End With,
End With,
,
' 아래 명령어로 중간 구분자를 넣을 수 있음,
ContextMenu.Controls(4).BeginGroup = True,
End Sub,
,
Sub DeleteFromCellMenu(),
Dim ContextMenu As CommandBar,
Dim ctrl As CommandBarControl,
,
' CommandBars("Cell")로 지정하면 ContextMenu를 접근할 수 있음,
Set ContextMenu = Application.CommandBars("Cell"),
,
' Delete the custom controls with the Tag : My_Cell_Control_Tag.,
' 모든 콘트롤들을 보면서 Tag가 My_Cell_Control_Tag 인 항목을 찾아서 지워줌,
' 이렇게 하면 원하는 모든 걸 한번에 지울 수 있으니 이 방법을 쓰면 좋을 것임,
For Each ctrl In ContextMenu.Controls,
If ctrl.Tag = "My_Cell_Control_Tag" Then,
ctrl.Delete,
End If,
Next ctrl,
,
,
On Error Resume Next,
' 내장 기능에 대한 삭제는 아래와 같은 방법으로 사용,
ContextMenu.FindControl(ID:=3).Delete,
On Error GoTo 0,
End Sub,