这是一些意见调查,但它与 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
举个例子,我有一张做文件搜索的工作表。单元格 A1 是文件搜索的输入。单元格 B1 是要在文件中查找的文本的输入。第 2 行只是标签,但我使用它们对找到的数据进行排序。双击 A2 或 B2 从第 3 行向下排序。每次双击第 2 行的单元格时,排序顺序就会反转。因此,第一次双击 A2 按文件名升序对工作表进行排序,第二次双击 A2 按文件名降序排序。B2 和路径同上。
第 3 行及之后的行接收搜索结果。A 列接收文件名。B 列接收文件的路径。如果文件有关联的程序,双击 A 列中的文件名将打开该文件。双击 B 列中的路径将在该文件夹中打开 Windows 资源管理器。
如果 Target 参数指示双击空单元格,我将 Cancel 设置为 True 并退出,导致不采取任何操作。
它为您提供了比您要求的更多的粒度,但这只是一个示例。听起来你只需要这一行。
使用右键单击上下文菜单并添加到两个子例程(GetFields
和GetTables
)的链接的示例代码:
代码模块中的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 答案可能很有用。