Сначала создайте событие _MouseUp
для выполнения на соответствующем элементе управления, чтобы посмотреть, была ли нажата правая кнопка мыши, и если это так, вызовите метод .ShowPopup
.
Конечно, это предполагает
Private Sub MyListControlName_MouseUp(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Long, ByVal Y As Long)
' Call the SetUpContextMenu function to ensure it is setup with most current context
' Note: This really only needs to be setup once for this example since nothing is
' changed contextually here, but it could be further expanded to accomplish this
SetUpContextMenu
' See if the right mouse button was clicked
If Button = acRightButton Then
CommandBars("MyListControlContextMenu").ShowPopup
End If
End Sub
Поскольку на этом этапе командная строка MyListControlContextMenu
не определена, я определяю меню в отдельном модуле следующим образом:
Public Sub SetUpContextMenu()
' Note: This requires a reference to Microsoft Office Object Library
Dim combo As CommandBarComboBox
' Since it may have been defined in the past, it should be deleted,
' or if it has not been defined in the past, the error should be ignored
On Error Resume Next
CommandBars("MyListControlContextMenu").Delete
On Error GoTo 0
' Make this menu a popup menu
With CommandBars.Add(Name:="MyListControlContextMenu", Position:=msoBarPopup)
' Provide the user the ability to input text using the msoControlEdit type
Set combo = .Controls.Add(Type:=msoControlEdit)
combo.Caption = "Lookup Text:" ' Add a label the user will see
combo.OnAction = "getText" ' Add the name of a function to call
' Provide the user the ability to click a menu option to execute a function
Set combo = .Controls.Add(Type:=msoControlButton)
combo.BeginGroup = True ' Add a line to separate above group
combo.Caption = "Lookup Details" ' Add label the user will see
combo.OnAction = "LookupDetailsFunction" ' Add the name of a function to call
' Provide the user the ability to click a menu option to execute a function
Set combo = .Controls.Add(Type:=msoControlButton)
combo.Caption = "Delete Record" ' Add a label the user will see
combo.OnAction = "DeleteRecordFunction" ' Add the name of the function to call
End With
End Sub
Поскольку на три функции ссылались, мы можем перейти к определению их следующим образом:
getText : Обратите внимание, что для этого параметра требуется указать как имя меню панели команд , так и имя заголовка элемента управления .
Public Function getText() As String
getText = CommandBars("MyListControlContextMenu").Controls("Lookup Text:").Text
' You could optionally do something with this text here,
' such as pass it into another function ...
MsgBox "You typed the following text into the menu: " & getText
End Function
LookupDetailsFunction : Для этого примера я создам функцию оболочки и верну текст «Hello World!».
Public Function LookupDetailsFunction() As String
LookupDetailsFunction = "Hello World!"
MsgBox LookupDetailsFunction, vbInformation, "Notice!"
End Function
DeleteRecordFunction : В этом примере я позабочусь о том, чтобы элемент управления все еще действовал, проверив его на ноль, и, если он все еще действителен, выполнит запрос для удаления записи из таблицы.
Public Function DeleteRecordFunction() As String
If Not IsNull(Forms!MyFormName.Controls("MyListControlName").Column(0)) Then
Currentdb.Execute _
"DELETE * FROM [MyTableName] " & _
"WHERE MyKey = " & Forms!MyFormName.Controls("MyListControlName").Column(0) & ";"
MsgBox "Record Deleted", vbInformation, "Notice!"
End If
End Function
Примечание. Для функций LookupDetailsFunction
, DeleteRecordFunction
и getText
они должны находиться в открытом доступе для правильной работы.
Наконец, последний шаг - проверить меню. Для этого откройте форму, щелкните правой кнопкой мыши элемент управления списком и выберите один из вариантов во всплывающем меню.
Опционально button.FaceID
может использоваться для обозначения известного значка офиса, связанного с каждым экземпляром всплывающего меню.
Я нашел Работа Пиллая Шьяма по созданию надстройки браузера FaceID очень полезной.
Ссылка:
Microsoft
FaceID