Создание контекстного меню в Excel
Автор статейки Тихвинский В.И.
1)Необходимо сделать функцию для создания контекстного меню:
- Код: Выделить всё
Function СоздатьКонтекстноеМеню(ParamArray ПунктыМеню())
Dim mButton As CommandBarButton, r As CommandBarButton
Dim m, N As Long, i As Long
Dim s As String, ИмяСобытия
N = 0
For Each m In ПунктыМеню
N = N + 1
S=m
If instr(s,”;”) <> 0 then
Подпись=””
ИмяСобытия =””
Flag= true
For i = 1 To Len(s)
If flag = true then
If Mid(s, i, 1) <>";" Then
ИмяСобытия = ИмяСобытия + Mid(s, i, 1)
Else
Flag=false
End If
Else
Подпись= Подпись+ Mid(s, i, 1)
End if
Next i
Else
ИмяСобытия =””
For i:=1 to len(s)
If mid(s,i,1)<>”&” then
ИмяСобытия = ИмяСобытия + mid(s,i,1)
End if
Next i
Подпись=S
End if
If N = 1 Then
Set MBar = Application.CommandBars.Add(, msoBarPopup)
End If
With MBar
Set mButton = .Controls.Add(Type:=msoControlButton)
With mButton
.Style = msoButtonCaption
.Caption = Подпись
.OnAction = ИмяСобытия
End With
End With
Next m
If N > 0 Then
MBar.ShowPopup
СоздатьКонтекстноеМеню = True
'Application.CommandBars(MBar.Name).Delete
End If
End Function
2)В модуле подпрограмм проекта необходимо создать подпрограммы имя которых соответствует именам событий меню.
3)Из события листа запускаем функцию:
- Код: Выделить всё
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
Cancel = СоздатьКонтекстноеМеню("Первый", “ВторойПункт;Второй пункт”)
End Sub
Примечание:
1) События вводятся в строковом формате как аргументы функции, через запятую.
2)Имя события не должно содержать пробелов.
3)Если нужно записать и имя события пункта меню, и подпись пункта меню их разделяют точкой с запятой.
4)Если необходимо подчеркнуть букву подписи, перед ней ставят символ &
4) Через свойства объекта Target: Row и Column, можно ограничить вывод не стандартного контекстного меню в конкретных строках и столбцах листа Excel.
5)Для продолжения пункта контекстного меню(вызываемого из пункта контекстного меню), функция СоздатьКонтекстноеМеню вызывается как процедура в соответствующей процедуре пункта.