如何在不为每一行分配按钮的情况下向行添加交互?

How can I add an interaction to rows without assigning a button to each?

这有点像意见调查​​,但它是关于 excel vba 事件

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

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

我可以通过什么 "excel-like" 方式实现这一目标?或者,我有什么选择?

有没有试过这个的人有成功的方法可以分享一下吗?

或者每行添加一个按钮可以吗?有 2.000 多行并且还在增长

我使用双击事件。 VBA 代码放在作品sheet 中,因此它是该作品的本地代码sheet。

作品sheet有一个像这样的事件处理程序:

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

例如,我有一个执行文件搜索的 sheet。单元格 A1 是文件搜索的输入。单元格 B1 是要在文件中查找的文本的输入。第 2 行只是标签,但我使用它们对找到的数据进行排序。双击 A2 或 B2 从第 3 行向下排序。每次双击第 2 行上的单元格时,排序顺序都会反转。因此,第一次双击 A2 按文件名升序对 sheet 排序,第二次双击 A2 按文件名降序排序。 B2 和路径同上。

第 3 行及之后的行接收搜索结果。 A 列接收文件名。 B 列接收文件的路径。如果文件有关联程序,双击 A 列中的文件名将打开该文件。双击 B 列中的路径将在该文件夹中打开 Windows 资源管理器。

如果 Target 参数指示双击空单元格,我将 Cancel 设置为 True 并退出,结果没有采取任何操作。

它为您提供了比您请求的更多的粒度,但这只是一个示例。听起来您只需要该行。

使用右键单击上下文菜单并将链接添加到两个子例程(GetFieldsGetTables)的示例代码:

ThisWorkbook 代码模块中的代码:

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

另请参阅:Adding Controls to the Cell Context Menu by Using VBA Code(这可能是我最初从中获取代码的地方)

注意: FaceId 属性 玩起来很有趣。我现在忘记了我从哪里获得每个值所指的图标列表。 (它可能来自 MSDN 页面上的一个链接。)编辑:我怀疑这是否是我最初看到它的地方,但 this Stack Overflow answer by Horst Schmid 可能有用。