Wstążka / menu kontekstowe

Co to menu kontekstowe?
Się zachodzisz pewnie w głowę.
Kliknij sobie prawym myszy,
Można dodać co zażyczy
Sobie Szef lub jego żona.
Niżej sekcja poświęcona
Wstążce, makrom i obrazkom,
I kolorkom, zawijaczkom.
Nie masz XML edytora?
Lub ribbonów kreotara?
Nic nie szkodzi, tu pokażę,
Przy okazji się wykażę,
Jak programistycznie sprawić,
By coś mogło się pojawić -
Nowy guzik na wstążeczce,
Jak cukierek w choineczce.

menu kontekstowe

Sub RemoveGMIFTSBar()
' ta procedura usuwa, dla pewności, bar ze wstązki, żeby nie pojawiały sie kilkukrotnie
' jeżeli nie ma jeszcze tego bara, to nic się nie dzieje

On Error Resume Next
Application.CommandBars("name ").Delete

End Sub

Sub> CreateBar()
Dim oBar As CommandBar
Dim oControl As CommandBarControl

Application.ScreenUpdating = False

RemoveGMIFTSBar 'tu dla bezpieczeństwa usuwany jest bar, żeby ich nie duplikować
'tworzymy nowy tab, na samym końcu, o nazwie ‘addins’

Set oBar = Application.CommandBars.Add(Position:=msoBarTop, Temporary:=True)

With oBar
.NameLocal = "name"
.Name = " name "
.Visible = True
End With
‘’’dodajemy kontrolki
Set oControl = oBar.Controls.Add(ID:=1, Before:=1)
With oControl
.OnAction = "extractExcel" ' jakie macro ma zostać wywołana po wciśnięciu
.FaceId = 5 '’obrazek

.Caption = "Guzik"
.Style = msoButtonIconAndCaption
.TooltipText = "tooltip"
End With


End Sub








Przy okazji, żeby w menu kontekstowe,
Dać ikonki impastowe,
Można użyć tego kodu,
Bez zachodu nie ma miodu.

menu kontekstowe


Sub DodajDOmenuKomorki()
Dim ContextMenu As CommandBar
Dim MySubMenu As CommandBarControl

'w tym miesjcu wstawiłbym zabezpieczenie przed duplikowaniem kontrolek, opisane niżej
'po wklikaniu się prawym w komórkę pojawi się nowe menu

Set ContextMenu = Application.CommandBars("Cell")


'Dodaję menu kontekstowe z 2 guzikami w liście rozwijanej
Set MySubMenu = ContextMenu.Controls.Add(Type:=msoControlPopup, Before:=1)

With MySubMenu
.Caption = "ListaRozwijana"
.Tag = "Tak,którego będziemy używać np do pozbycia się dodanych przycisków"

With .Controls.Add(Type:=msoControlButton)
.OnAction = "Makro1"
.FaceId = 612
.Caption = "Makro1"
.TooltipText = "opis makro1"
End With
With .Controls.Add(Type:=msoControlButton)
.OnAction = "Makro2"
.FaceId = 366
.Caption = "Makro2"
.TooltipText = "opis makro2"

End With

End With

ContextMenu.Controls(4).BeginGroup = True


Set MySubMenu = Nothing
Set ContextMenu = Nothing

End Sub






Jak się pozbyć później tego?
Ja polecam coś takiego:



Sub UsunzMenukontekstowego()
Dim ContextMenu As CommandBar
Dim ctrl As CommandBarControl

'menu komórki
Set ContextMenu = Application.CommandBars("Cell")

'w tym przypadku usuwam kontrolki po tagu: "Tak,którego będziemy używać np do pozbycia się dodanych przycisków"
For Each ctrl In ContextMenu.Controls
If ctrl.Tag = "Tak,którego będziemy używać np do pozbycia się dodanych przycisków" Then
ctrl.Delete
End If
Next ctrl


'czasami na samej górze pojawia się klawisz „Save”, dla pewności usuwam
On Error Resume Next
ContextMenu.FindControl(ID:=3).Delete
On Error GoTo 0>
Set ContextMenu = Nothing

End Sub







Ważne jest, by mieć sprawdzenie,
By ominąć gromadzenie,
Się przycisków identycznych,
Komentarzy też, cynicznych,
Przecież brzydko to wygląda
I kolegów śmiech przyciąga :)

menu kontekstowe


'dwa sposoby:
'1: sprawdzam czy istnieje guzik o takim tagu

Dim spr As Boolean
For Each ctrl In ContextMenu.Controls
If ctrl.Tag = "Tak,którego będziemy używać np do pozbycia się dodanych przycisków" Then
Spr = True
End If
Next ctrl
If Not spr = True Then
'procedura dodawania :)
End If

'2: profilaktycznie w macro do dodania przycisków dodaję procedurkę do usunięcia na samym początku
Sub DOdajDoMenuKomorki()
Dim ContextMenu As CommandBar
Dim MySubMenu As CommandBarControl


Call UsunzMenukontekstowego