1

这是一些意见调查,但它与 excel vba 事件有关

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

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

我可以实现这一目标的“类似excel”的方式是什么?或者,我有什么选择?

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

还是可以在每一行添加一个按钮?有 2.000 + 行并且还在增长

4

2 回答 2

2

我使用双击事件。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

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

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

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

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

于 2017-08-15T20:41:56.967 回答
1

使用右键单击上下文菜单并添加到两个子例程(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

另请参阅:使用 VBA 代码向单元格上下文菜单添加控件(这可能是我最初获取代码的地方)

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

于 2017-08-15T20:56:49.037 回答