Excel 如何向行添加交互而不为每个行指定按钮?
这是一个什么样的意见寻求,但它是关于excel vba事件 我有一个包含销售历史记录的表,但我希望用户能够以某种方式与每一行进行交互,以便在编辑器中打开该销售记录 作为一个来自Javascript的人,我的第一个想法是行单元格上的单击或双击事件,但在excel中,这些事件已经有了它们的功能,因此它不是很直观 我可以通过什么样的“类似excel”的方式实现这一点?或者,我有什么选择 以前尝试过这个的人可能有一个成功的方法来分享Excel 如何向行添加交互而不为每个行指定按钮?,excel,excel-2016,excel-automation,vba,Excel,Excel 2016,Excel Automation,Vba,这是一个什么样的意见寻求,但它是关于excel vba事件 我有一个包含销售历史记录的表,但我希望用户能够以某种方式与每一行进行交互,以便在编辑器中打开该销售记录 作为一个来自Javascript的人,我的第一个想法是行单元格上的单击或双击事件,但在excel中,这些事件已经有了它们的功能,因此它不是很直观 我可以通过什么样的“类似excel”的方式实现这一点?或者,我有什么选择 以前尝试过这个的人可能有一个成功的方法来分享 或者可以在每行添加一个按钮吗?有2.000多行并且正在增长我使用双击事
或者可以在每行添加一个按钮吗?有2.000多行并且正在增长我使用双击事件。VBA代码放置在工作表中,因此它是该工作表的本地代码 工作表具有如下事件处理程序:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Put your code here
'The Target parameter will tell you which cell was double clicked.
'Target.Row will be the 1 based row number.
'Target.Column will be the 1 based column number.
'Target.Address will give you the cell address in "A1" format
'The Cancel parameter is a return value.
'If you set it to true, Excel will "cancel" or ignore the double click.
End Sub
作为一个例子,我有一张表格,它可以归档seraches。单元格A1是用于文件搜索的输入。单元格B1是要在文件中查找的文本的输入。第2行只是标签,但我使用它们对找到的数据进行排序。双击A2或B2从第3行向下排序。每次双击第2行上的单元格时,排序顺序都会反转。因此,第一次双击A2按文件名升序排序,第二次双击A2按文件名降序排序。B2和路径同上
第3行和后面的行接收搜索结果。列A接收文件名。列B接收文件的路径。双击a列中的文件名将打开该文件(如果该文件有关联的程序)。双击B列中的路径将打开该文件夹中的Windows资源管理器
如果目标参数指示双击空单元格,则我将Cancel设置为True并退出,从而不执行任何操作
它为您提供了比您所要求的更高的粒度,但这只是一个示例。听起来您只需要该行。使用右键单击上下文菜单并添加指向两个子例程(
GetFields
和GetTables
)的链接的示例代码:
此工作簿中的代码
代码模块:
Private Sub Workbook_Activate()
Call AddToCellMenu
End Sub
Private Sub Workbook_Deactivate()
Call DeleteFromCellMenu
End Sub
Option Explicit
Sub AddToCellMenu()
Dim ContextMenu As CommandBar
Dim MySubMenu As CommandBarControl
' Delete the controls first to avoid duplicates.
Call DeleteFromCellMenu
' Set ContextMenu to the Cell context menu.
Set ContextMenu = Application.CommandBars("Cell")
With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
.OnAction = "'" & ThisWorkbook.Name & "'!" & "GetFields"
.FaceId = 498
.Caption = "Get Field Names"
.Tag = "My_Cell_Control_Tag"
End With
With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
.OnAction = "'" & ThisWorkbook.Name & "'!" & "GetTables"
.FaceId = 585
.Caption = "Get Table Names"
.Tag = "My_Cell_Control_Tag"
End With
' Add a separator to the Cell context menu.
ContextMenu.Controls(3).BeginGroup = True
End Sub
Sub DeleteFromCellMenu()
Dim ContextMenu As CommandBar
Dim ctrl As CommandBarControl
' Set ContextMenu to the Cell context menu.
Set ContextMenu = Application.CommandBars("Cell")
' Delete the custom controls with the 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
' Delete the custom built-in Save button.
On Error Resume Next
ContextMenu.FindControl(ID:=3).Delete
On Error GoTo 0
End Sub
标准代码模块中的代码:
Private Sub Workbook_Activate()
Call AddToCellMenu
End Sub
Private Sub Workbook_Deactivate()
Call DeleteFromCellMenu
End Sub
Option Explicit
Sub AddToCellMenu()
Dim ContextMenu As CommandBar
Dim MySubMenu As CommandBarControl
' Delete the controls first to avoid duplicates.
Call DeleteFromCellMenu
' Set ContextMenu to the Cell context menu.
Set ContextMenu = Application.CommandBars("Cell")
With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
.OnAction = "'" & ThisWorkbook.Name & "'!" & "GetFields"
.FaceId = 498
.Caption = "Get Field Names"
.Tag = "My_Cell_Control_Tag"
End With
With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
.OnAction = "'" & ThisWorkbook.Name & "'!" & "GetTables"
.FaceId = 585
.Caption = "Get Table Names"
.Tag = "My_Cell_Control_Tag"
End With
' Add a separator to the Cell context menu.
ContextMenu.Controls(3).BeginGroup = True
End Sub
Sub DeleteFromCellMenu()
Dim ContextMenu As CommandBar
Dim ctrl As CommandBarControl
' Set ContextMenu to the Cell context menu.
Set ContextMenu = Application.CommandBars("Cell")
' Delete the custom controls with the 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
' Delete the custom built-in Save button.
On Error Resume Next
ContextMenu.FindControl(ID:=3).Delete
On Error GoTo 0
End Sub
另请参见:(这可能是我最初获取代码的地方)
注意:
FaceId
属性很有趣。现在我忘了我从哪里获得了每个值所指图标的列表。(它可能来自MSDN页面上的一个链接。)编辑:我怀疑这是否是我最初看到它的地方,但by可能很有用。当我不得不做类似的事情时,我向用户提供了两个选项。(1) 我在单元格的右键单击菜单中添加了一个附加选项,该选项称为我的子例程(2)。我在工作表中添加了一个按钮,该按钮称为我的子例程。显然,子例程随后使用了ActiveCell
对象来确定引用了表中的哪一行。@YowE3K哦,我不知道您可以在右键单击上下文菜单中添加新选项,这听起来很完美