目标是创建可以与 MS Access 表单上的某些控件一起使用的菜单,并且能够右键单击该控件,例如在列表框和带有选项的相关上下文特定菜单弹出窗口上,如果单击,将触发预定义的子程序或函数。
以编程方式完成此任务的最佳方法是什么?
我正在使用 MS Access 2003 并希望使用 VBA 来执行此操作。
首先创建一个_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:对于本例,我将创建一个 shell 函数并返回文本“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
,可用于指示与菜单弹出控件的每个实例相关联的已知办公室图标。
我发现Pillai Shyam在创建 FaceID 浏览器插件方面的工作非常有帮助。
为了用包含默认操作和自定义操作的菜单替换默认快捷菜单,您必须创建一个包含默认操作的自定义快捷菜单。无法扩展默认快捷菜单。
Access 2003 及更早版本中的快捷菜单是一种特殊的工具栏。您创建它们的方式(或多或少)与创建自定义工具栏的方式相同。不过,用户界面有点奇怪,因为有一个特殊的地方可以创建它们。
要开始使用,请右键单击前端 Access MDB 中的工具栏。选择自定义。在工具栏列表中,选中快捷菜单。这将为您提供所有内置快捷菜单的列表,除了它们实际上最终看起来不像在实际使用中那样。例如,如果右键单击一个表单,你会得到这个快捷菜单:
Form Design
Datasheet View
PivotTable View
PivotChart View
Filter By Form
Apply Filter/Sort
Remove Filter/Sort
Cut
Copy
Paste
Properties
现在,快捷菜单上的这个菜单在哪里?好吧,这恰好是 FORM VIEW TITLE BAR 菜单,即使它在您单击窗体上的控件以外的任何位置时都会弹出。因此,如果这是您要更改的菜单,您可以通过向其添加菜单项来编辑它(拖放操作)。
我认为创建一个自定义快捷菜单来复制内置菜单并添加您的增强功能实际上更好(如上所述),因为这允许您保留 Access 默认快捷菜单,同时还可以使用您的自定义版本你想要它。在这种情况下,您需要启动一个新的快捷菜单,这就是 UI 很奇怪的地方:
单击快捷菜单上的最后一个选项 CUSTOM。您会看到它下拉了一个占位符。您不能拖放到它。相反,您必须在主工具栏编辑窗口中单击“新建”并创建一个新的快捷工具栏(将其命名为您希望自定义快捷菜单具有的名称)。您的新工具栏现在显示在工具栏列表中。突出显示它并单击 PROPERTIES,然后将类型更改为 POPUP。这将为您提供信息警告,表明此更改将其从工具栏更改为快捷菜单。然后您可以关闭工具栏/快捷菜单的属性表,现在如果您再次选中快捷菜单并查看自定义菜单,您将看到新创建的菜单。现在您可以将内置菜单的菜单项拖放到新菜单中——但不要将它们拖放到菜单本身上,
然后,您可以将所需的任何选项从任何菜单或工具栏中拖放到自定义菜单中。
我假设您知道如何使用快捷菜单,因为它是所有表单对象的属性表的一部分。
2009 年 5 月 21 日更新:Access 2007 官方博客刚刚发布了一篇关于在 Access 2007 中以编程方式执行此操作的文章。由于功能区界面的原因,会有所不同,但有些事情会相同。
试试这个
Sub Add2Menu()
Set newItem = CommandBars("Form View Popup").Controls.Add(Type:=1)
With newItem
.BeginGroup = True
.Caption = "Make Report"
.FaceID = 0
.OnAction = "qtrReport"
End With
End Sub
如您所见,它将在“Form View Popup”命令栏中添加项目,当单击此项目时,它将加载过程qtrReport
并使用此功能查看 Access 中的所有命令栏
Sub ListAllCommandBars()
For i = 1 To Application.CommandBars.Count
Debug.Print Application.CommandBars(i).Name
Next
End Sub