2009-04-20 56 views
7

目的は、MS Accessフォーム上の特定のコントロールで利用できるメニューを作成し、そのコントロールを右クリックすることができるようにすることですリストボックス、および関連するコンテキスト固有のメニューポップアップ(オプション付き)。クリックすると、定義済みのサブルーチンまたは関数がトリガされます。メニュー項目をデフォルトの右クリックコンテキストメニューに追加する方法

これをプログラムで実行するには、どのような方法が最適ですか?

私はMS Access 2003を使用していますが、これはVBAを使用して行います。

+0

答えは、Accessのバージョンに大きく依存します。もしA2007、1つの答え、以前のバージョン、完全に異なる答え。 –

答えて

13

最初に_MouseUpイベントを作成してそれぞれのcoマウスの右ボタンがクリックされたかどうかを確認し、そうであれば.ShowPopupメソッドを呼び出します。もちろん

この時点で、コマンドバーMyListControlContextMenuは、次のように私は別のモジュールでメニューを定義し、定義されていませんので、これは

Private Sub MyListControlName_MouseUp(ByVal Button As Integer, _ 
             ByVal Shift As Integer, _ 
             ByVal X As Long, ByVal Y As Long) 

    ' Call the SetUpContextMenu function to ensure it is setup with most current context 
    ' Note: This really only needs to be setup once for this example since nothing is 
    ' changed contextually here, but it could be further expanded to accomplish this 
    SetUpContextMenu 
    ' See if the right mouse button was clicked 
    If Button = acRightButton Then 
    CommandBars("MyListControlContextMenu").ShowPopup 
    End If 
End Sub 

を前提としています

Public Sub SetUpContextMenu() 
    ' Note: This requires a reference to Microsoft Office Object Library 
    Dim combo As CommandBarComboBox 

    ' Since it may have been defined in the past, it should be deleted, 
    ' or if it has not been defined in the past, the error should be ignored 

    On Error Resume Next 
    CommandBars("MyListControlContextMenu").Delete 
    On Error GoTo 0 

    ' Make this menu a popup menu 
    With CommandBars.Add(Name:="MyListControlContextMenu", Position:=msoBarPopup) 

    ' Provide the user the ability to input text using the msoControlEdit type 
    Set combo = .Controls.Add(Type:=msoControlEdit) 
     combo.Caption = "Lookup Text:"   ' Add a label the user will see 
     combo.OnAction = "getText"    ' Add the name of a function to call 

    ' Provide the user the ability to click a menu option to execute a function  
    Set combo = .Controls.Add(Type:=msoControlButton) 
     combo.BeginGroup = True     ' Add a line to separate above group 
     combo.Caption = "Lookup Details"   ' Add label the user will see 
     combo.OnAction = "LookupDetailsFunction" ' Add the name of a function to call 

    ' Provide the user the ability to click a menu option to execute a function   
    Set combo = .Controls.Add(Type:=msoControlButton) 
     combo.Caption = "Delete Record"   ' Add a label the user will see 
     combo.OnAction = "DeleteRecordFunction" ' Add the name of the function to call 

    End With 

End Sub 

3つの機能がされているので、これらを次のように定義することができます。

getTextオプションは、コマンドバーメニュー名の名前と、のコントロールキャプションの名前の両方への参照を必要とします。

Public Function getText() As String 

    getText = CommandBars("MyListControlContextMenu").Controls("Lookup Text:").Text 

    ' You could optionally do something with this text here, 
    ' such as pass it into another function ... 
    MsgBox "You typed the following text into the menu: " & getText 

End Function 

LookupDetailsFunction:この例では、私はシェル関数を作成し、テキストを返します "Hello Worldのを!"。

Public Function LookupDetailsFunction() As String 

    LookupDetailsFunction = "Hello World!" 

    MsgBox LookupDetailsFunction, vbInformation, "Notice!" 

End Function 

DeleteRecordFunction:この例では、私はコントロールがnullに対してそれをチェックすることにより、依然として有効であり、さらに有効な場合は、テーブルからレコードを削除するクエリを実行します保証されます。

Public Function DeleteRecordFunction() As String 

    If Not IsNull(Forms!MyFormName.Controls("MyListControlName").Column(0)) Then 
    Currentdb.Execute _ 
     "DELETE * FROM [MyTableName] " & _ 
     "WHERE MyKey = " & Forms!MyFormName.Controls("MyListControlName").Column(0) & ";" 
    MsgBox "Record Deleted", vbInformation, "Notice!" 
    End If 

End Function 

注:LookupDetailsFunctionDeleteRecordFunctiongetText機能については、これらが正常に動作するために、公開範囲内でなければなりません。

最後に、最後の手順はメニューをテストすることです。これを行うには、フォームを開いてリストコントロールを右クリックし、ポップアップメニューからオプションの1つを選択します。

任意に、button.FaceIDは、メニューポップアップコントロールの各インスタンスに関連付ける既知のオフィスアイコンを示すために利用することができる。

私はがFaceIDブラウザアドインの作成に非常に役立つことがわかりました。

参考文献: Microsoft FaceID

+0

FYI私のリストメニューの '_MouseUp'ハンドラの' If'ブロックの中に 'DoCmd.CancelEvent'を追加して、私のカスタムメニューの後にデフォルトの右クリックメニューが現れないようにしなければなりませんでした。 'combo As CommandBarComboBox'のエラーです。これは、一般的な' CommandBarControl'タイプに切り替えることで簡単に解決されました。しかし、一般的にはこれは明らかでよく書かれた答え、+1です。 – DaveRandom

+0

コールバックコードを整理するためのメカニズムは少し気づきましたか?私はこれらのパブリックモジュールがすべて私のフォームコードに結合されているのが好きではありません。私はフォームのモジュールでパブリックサブクラスを呼び出すのが理想です。おそらくこれをジェネリッククラスモジュールで囲むこともできます。 – DaveRandom

+0

機構?いいえ。コードの配置はい。それらを使用して、それぞれのモジュールに必要なコールを配置することで、簡単に実行できます。これは、他のすべてが非常に制御されていたので、私のユースケースではうまく機能しました。他のプロジェクトでは、コードをそのエリアに呼び出して呼び出しました。 –

2

デフォルトのショートカットメニューを、デフォルトのアクションとカスタムアクションを含むメニューに置き換えるには、デフォルトのアクションを含むカスタムショートカットメニューを作成する必要があります。デフォルトのショートカットメニューを拡張する方法はありません。

Access 2003以前のショートカットメニューは特別な種類のツールバーです。カスタムツールバーを作成するのと同じ方法(多かれ少なかれ)を作成します。あなたがそれらを作成する特別な場所があるので、UIは奇妙な、しかし、です。

フロントエンドのAccess MDBでツールバーを右クリックします。 CUSTOMIZEを選択します。ツールバーのリストで、ショートカットメニューをオフにします。これにより、組み込みショートカットメニューの一覧が表示されますが、実際の使用では実際には表示されません。たとえば、フォームを右クリックすると、ショートカットメニューが表示されます。

Form Design 
Datasheet View 
PivotTable View 
PivotChart View 
Filter By Form 
Apply Filter/Sort 
Remove Filter/Sort 
Cut 
Copy 
Paste 
Properties 

ここでショートカットメニューのどこにこのメニューがありますか?これは、フォームのコントロール上以外の場所をクリックするたびにポップアップ表示されますが、フォームビュータイトルバーのメニューになります。したがって、それを変更したいメニューであれば、それにメニューアイテムを追加することで編集できます(ドラッグ&ドロップ操作)。

実際には、上記のように、組み込みメニューを複製し、拡張機能を追加するカスタムショートカットメニューを作成する方が良いと思います。これは、Accessの既定のショートカットメニューを保持し、それはあなたがそれを望むときに使用するためのものです。その場合は、新しいショートカットメニューを開始する必要があります。ここにはUIが変わっています:

ショートカットメニューCUSTOMの最後の項目をクリックします。あなたはそれがプレースホルダーを落とすのを見ます。ドラッグ&ドロップすることはできません。代わりに、メインのツールバー編集ウィンドウでNEWをクリックし、新しいショートカットツールバーを作成する必要があります(カスタムショートカットメニューに必要な名前を付けてください)。新しいツールバーがツールバーのリストに表示されるようになりました。強調表示してプロパティをクリックし、タイプをPOPUPに変更します。これにより、この変更によってツールバーからショートカットメニューに変更されるという有益な警告が表示されます。ツールバー/ショートカットメニューのプロパティシートを閉じて、メニューをもう一度オフにしてCUSTOMメニューを見ると、新しく作成されたメニューが表示されます。これで、組み込みメニューのメニュー項目を新しいメニューにドラッグアンドドロップできますが、メニュー自体の上にドロップすることはできませんが、メニュー名の>から右へのフライアウトのプレースホルダーにドロップしてください。

任意のメニューまたはツールバーから任意のオプションをカスタムメニューにドラッグアンドドロップできます。

すべてのフォームオブジェクトのプロパティシートの一部であるため、ショートカットメニューの使い方を理解していることが前提です。

UPDATE 2009/05/21: 公式のAccess 2007のブログでは、Access 2007にarticle on doing this programmaticallyが投稿されました。リボンインターフェイスのため、違いがありますが、いくつかは同じになります。

+0

AccessはExcel、WordなどのようにOffice.CommandBarおよびOffice.CommandBarButtonオブジェクトを使用しますか? – onedaywhen

+0

David、 これは、Accessがコマンドバーを処理する方法を理解するのに非常に役立ちます。しかし、私はあなたがプログラマチックに述べたことをするつもりです。 –

+0

私の経験では、それはプログラム的に行うことができますが、かなり難解です。 VBEヘルプで「プログラムツールバー」を検索し、そこのヘルプを読んでください。ショートカットメニューは単なるツールバーのフォームなので、同じ方法を使用します。私は自分自身でそうしないだろう。私はカスタムメニューを作成し、必要なコンテキストとして特定のアイテムを表示/非表示にします。 –

2

あなたはそれが「フォームビューポップアップ」コマンドバーの項目を追加し、この項目がクリックされたとき、それはqtrReport

を手順をロードし、この機能を使用します見ることができるように、この

Sub Add2Menu() 
    Set newItem = CommandBars("Form View Popup").Controls.Add(Type:=1) 
    With newItem 
    .BeginGroup = True 
    .Caption = "Make Report" 
    .FaceID = 0 
    .OnAction = "qtrReport" 
    End With 
End Sub 

をお試しくださいアクセス内のすべてのCommandbarsを表示する

Sub ListAllCommandBars() 
For i = 1 To Application.CommandBars.Count 
    Debug.Print Application.CommandBars(i).Name 
Next 
End Sub 
+0

これはまさに私が探していたものです。ありがとう –

関連する問題