我怎样才能添加一个交互行而不分配给每个button?

这是一个意见的追求,但它是关于Excel VBA事件

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

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

什么是我可以做到的“超类”方式? 或者,我有什么select?

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

或者可以在每一行添加一个button吗? 有2000多行,并在不断增长

使用右键单击上下文菜单并将链接添加到两个子例程( 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答案可能是有用的。

我使用双击事件。 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被input用于文件search。 单元格B1是要在文件中查找的文本的input。 第2行只是标签,但我使用它们来sortingfind的数据。 双击A2或B2从第3行开始sorting。 每次双击第2行的单元格时,sorting顺序都会反转。 因此,第一次双击A2按升序排列文件名,第二次双击A2按文件名降序排列。 B2和path一样。

第3行和以下接收search结果。 列A接收文件名称。 B列收到文件的path。 双击列A中的文件名将会打开文件,如果它有关联的程序。 双击列B中的path将打开该文件夹的Windows资源pipe理器。

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

它比你要求的更精细,但这只是一个例子。 这听起来像你只需要行。