2017-08-15 25 views
1

這是一些意見追求的是什麼,但它是關於Excel的VBA事件如何在不爲每個行分配按鈕的情況下向行添加交互?

我有一個包含我們的銷售史上的一個表,但我希望用戶能夠互動在每一行以某種方式,以便它在編輯器中打開銷售。

正如有人誰來自JavaScript中,我的第一個想法是點擊雙擊在該行的細胞事件,但在Excel中這些事件已經有了自己的功能,所以它不是很直觀

什麼是我可以實現的「類似Excel」的方式?或者,我有什麼選擇?

任何以前嘗試過的人都可能有成功的方法來分享?

還是可以向每一行添加一個按鈕?有2.000多排並且正在增長

+1

當我不得不做類似的事情時,我向用戶提供了兩個選項。 (1)我爲單元格的右鍵單擊菜單添加了一個附加選項,該選項稱爲我的子例程(2)我在工作表中添加了一個按鈕,該按鈕稱爲我的子例程。顯然,該子程序然後使用「ActiveCell」對象來確定表的哪一行被引用。 – YowE3K

+0

@ YowE3K哦,我不知道你可以在右鍵菜單中添加新的選項,聽起來很完美 – Mojimi

回答

1

示例代碼:

守則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(這可能是我最初得到代碼的地方m)

注意:FaceId屬性很有趣。我現在忘了我在哪裏獲得了每個值所指的圖標列表。(它可能來自MSDN頁面上的其中一個鏈接。)編輯:我懷疑這是否是我最初看到它的地方,但this Stack Overflow answer通過Horst Schmid可能是有用的。

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 

作爲一個例子我有確實文件seraches的片材。單元格A1被輸入用於文件搜索。單元格B1是要在文件中查找的文本的輸入。第2行只是標籤,但我使用它們對發現的數據進行排序。雙擊A2或B2從第3行開始排序。每次雙擊第2行的單元格時,排序順序都會反轉。因此,第一次雙擊A2按升序排列文件名,第二次雙擊A2按文件名降序排列。 B2和路徑一樣。

第3行及以下行接收到搜索結果。列A接收文件名稱。列B接收文件的路徑。雙擊A列中的文件名將會打開文件,如果它有關聯的程序。雙擊B列中的路徑將打開該文件夾中的Windows資源管理器。

如果Target參數指示雙擊一個空單元格,我將Cancel設置爲True並退出,導致不採取任何操作。

它給你比請求更多的粒度,但這只是一個例子。聽起來你只需要這一行。

使用右鍵快捷菜單,然後添加指向兩個子程序( GetFieldsGetTables
相關問題