2017-08-15 6 views
1

これは、どのような意見のクエストをいくつかあるが、それは、Excel VBAのイベントに関するれそれぞれにボタンを割り当てずに行に対話を追加するにはどうすればよいですか?

私は営業の歴史が含まれているテーブルがありますが、私は、各行のでを対話ユーザーがにできるようにしたいです何らかの形で、エディタでその販売を開きます。 JavaScriptから来て誰かとして

は、私の最初の考えは、行のセルにクリックまたはダブルクリックのイベントでしたが、Excelでは、これらのイベントは、すでにその機能を持って、そのない非常に直感的

ので、私はこれを達成できる「卓越した」方法は何ですか?または、私の選択肢は何ですか?

これまでに試したことがある人は、成功する方法がありますか?

または、各行にボタンを追加しても問題ありませんか? 2.000 +行があり、成長しています

+1

私は同様のことをしなければならない時に、ユーザーに2つのオプションを提供しました。 (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ページのリンクの1つであった可能性があります)編集:これは私が最初にそれを見た場所であるかどうかは疑問ですが、Horst Schmidによるthis Stack Overflow answerがおそらく役に立ちます。

2

私はダブルクリックイベントを使用します。 VBAコードはワークシート内に配置され、ワー​​クシートのローカルに配置されます。私は、ファイルserachesを行いシートを持っている例として

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は単なるラベルですが、私は見つかったデータをソートするためにそれらを使用します。行3からA2またはB2のいずれかをダブルクリックしてください。行2のセルをダブルクリックするたびにソート順が逆になります。したがって、A2の最初のダブルクリックはファイル名の昇順でシートをソートし、A2の2回目のダブルクリックはファイル名の降順ソートを行います。 B2とパスのために同上。

3行目以降に検索結果が表示されます。列Aはファイル名を受け取ります。列Bはファイルへのパスを受け取ります。列Aのファイル名をダブルクリックすると、関連するプログラムがある場合はそのファイルが開きます。 B列のパスをダブルクリックすると、そのフォルダのエクスプローラが開きます。

Targetパラメーターが空のセルをダブルクリックしていることを示している場合は、CancelをTrueに設定して終了します。その結果、アクションは実行されません。

これは、要求しているよりも細分性がありますが、これは単なる例です。あなたは行が必要なように聞こえます。

右クリックのコンテキストメニューを使用し、2つのサブルーチン( GetFieldsGetTables)へのリンクを追加し
関連する問題