Excel 如何向行添加交互而不为每个行指定按钮?

Excel 如何向行添加交互而不为每个行指定按钮?,excel,excel-2016,excel-automation,vba,Excel,Excel 2016,Excel Automation,Vba,这是一个什么样的意见寻求,但它是关于excel vba事件 我有一个包含销售历史记录的表,但我希望用户能够以某种方式与每一行进行交互,以便在编辑器中打开该销售记录 作为一个来自Javascript的人,我的第一个想法是行单元格上的单击或双击事件,但在excel中,这些事件已经有了它们的功能,因此它不是很直观 我可以通过什么样的“类似excel”的方式实现这一点?或者,我有什么选择 以前尝试过这个的人可能有一个成功的方法来分享 或者可以在每行添加一个按钮吗?有2.000多行并且正在增长我使用双击事

这是一个什么样的意见寻求,但它是关于excel vba事件

我有一个包含销售历史记录的表,但我希望用户能够以某种方式与每一行进行交互,以便在编辑器中打开该销售记录

作为一个来自Javascript的人,我的第一个想法是行单元格上的单击双击事件,但在excel中,这些事件已经有了它们的功能,因此它不是很直观

我可以通过什么样的“类似excel”的方式实现这一点?或者,我有什么选择

以前尝试过这个的人可能有一个成功的方法来分享


或者可以在每行添加一个按钮吗?有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哦,我不知道您可以在右键单击上下文菜单中添加新选项,这听起来很完美