2017-08-21 17 views
2

UserformListboxの動的コンテキストメニューを構築しました。Excel VBA Userform Listbox動的コンテキストメニュー.OnActionメソッドを使用

この内にListboxはシリーズファイルです。私の目標は、ファイルを右クリックすると、コンテキストメニューがポップアップしてフォルダの場所のリストが表示されることです。これらのフォルダの場所の1つを左クリックすると、その場所にファイルがコピーされます。

これを行うには.CopyFile(Location, Destination, [Overwrite])の方法を使用します。

.OnActionのイベントを動的に割り当てることが難しいです。Itemが追加されました。

Userform

モジュールコード

Option Explicit 
Private Const mCONTEXT_MENU_NAME = "myRightClickListbox" 
Private m_clsContextMenu As CContextMenu 

'Function mySendTo(fName As String) 
    'MsgBox fName 
'End Function 

Sub mySendTo(fName As String) 
    MsgBox fName 
End Sub 

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
Dim myString As String: myString = "C:\myFolder\" 
Dim FolderName As String: FolderName = Dir("C:\myFolder\", vbDirectory)  

If Button = 2 Then 
     '*\\Listbox right click context menu 
     On Error Resume Next 
     Application.CommandBars(mCONTEXT_MENU_NAME).Delete 'remove any previous instance 
     On Error GoTo 0 

     Set m_clsContextMenu = New CContextMenu 

     With CommandBars.Add(mCONTEXT_MENU_NAME, Position:=msoBarPopup) 
      With .Controls.Add(Type:=msoControlPopup, before:=1, temporary:=True) 
       .Caption = "Send to" 

       i = 0 
       Do While FolderName <> "" 
        If FolderName <> "." And FolderName <> ".." Then 
         If (GetAttr(myString & FolderName) And vbDirectory) = vbDirectory Then 
          i = i + 1 
          With .Controls.Add(Type:=msoControlButton, before:=i, temporary:=True) 
           .FaceId = 23 
           .Caption = FolderName 
           .Tag = "t" & FolderName 
           .OnAction = "'mySendTo " & FolderName & "'" 
           '.OnAction = "=mySendTo(" & FolderName & ")" 
           '.Parameter = FolderName 
          End With 
         End If 
        End If 
        FolderName = Dir() 
       Loop 
      End With 

      Set m_clsContextMenu.LBox = Me.ListBox1 
     End With 
     '*// 
    End If 
End Sub 

ClassモジュールコードCContextMenu

Public LBox As MSForms.ListBox 

上記のコードは正常Itemsを含むサブメニューType:=msoControlPopupから成るUserformListboxために右クリック活性化されたコンテキストメニューを作成します指定されたFolderNameディレクトリ内の各フォルダに対して

私は動的にmySendToSubまたはFunctionを呼び出すために作成された各Itemため.OnActionイベントを割り当てるしようとしています。私はこの方法でFunctionsという名前で呼び出すことができ、それ自身のパラメータでSubを呼び出すことは失敗すると言われました。どちらも私は両方を試しても、どちらもうまくいかないようです。いずれもExcelがError: 400を呼び出すと、Excelがイベントを呼び出そうとしています。

どちらのイベントでも、パラメータStringを表示するだけでMsgBoxがトリガされます(これは、コードが正しく動作することがわかるまでわかります)。この場合、FolderNameディレクトリ内のサブフォルダ名(自身の場所 -重要である何

は、サブメニュー内の各Itemがクリックされた場合、それはその特定のItem.Captionテキストを参照するコードをトリガーするということです)。

ファイルListboxからコンテキストサブメニューItemの新しい宛先フォルダにファイルをコピーします。

私は私の.OnAction構文との緊密なんだということを知っているが、私はだから、それはだかどうかを誤使用して、私のパラメータのコールイベントとSub/Function、または私はまた、動的すでにへ.OnActionイベントを割り当てるしようとしているので、動的に作成されたコンテキストサブメニューItem、私は私の人生のためにそれを理解することはできません。

ブランクUserformモジュールに上記のコードを貼り付け、 "ListBox1"という名前のListboxを追加すると、サブメニュー付きの右クリックアクティブ化コンテキストメニューが有効になります。

Itemsのいずれかをクリックしてみると、Error: 400も受信する必要があります。

私はパラメータがあることで、各ItemにダイナミックSubまたはFunctionを渡すことができる方法上の任意のヘルプ

それ自身の.Captionくらいは感謝、そしてもう一度お時間をありがとうございましたになります。

氏はJ

答えて

1

すべてのOnActionパラメータなしで公共のサブに設定します。そのSub内で、Application.CommandBars.ActionControlを使用して、イベントをトリガした特定のコマンドバー項目を取得します。次に、あなたが扱っている項目を識別するコマンドバー項目のプロパティを得ることができます。 .Parameterプロパティが最適です。

あなたの場合は、私が想定しているCaptionプロパティを使うことができます...しかし、後でそれをフォーマットしたり、切り捨てたりすることがあるので、危険です。したがって、コマンド項目のパラメータフィールドを問題のフォルダに設定してください(これはあなたのコードにありますが、コメントアウトされています)。あなたの元のコードで

ので:ところで

With .Controls.Add(Type:=msoControlButton, before:=i, temporary:=True) 
    .Caption = FolderName 
    'etc etc 
    .OnAction = "'MyWorkbookName.xlsx'!mySendTo" 
    .Parameter = FolderName 
End With 

は、常に.OnActionで完全修飾マクロ名を指定します。私はハードな経験を通してこれを学んだ。上記のように必ずワークブック名​​を一重引用符で囲んでください。 (引用符は常に必要ではありませんが、多くの場合は...、それは常にそれを持っていて損はありません。)

その後、あなたのイベントハンドラで:迅速な対応のための

Public Sub mySend() 
    Dim sourceFolder as String 

    On Error resume Next 
    sourceFolder = Application.CommandBars.ActionControl.Parameter 
    On Error goto 0 

    if sourceFolder <> "" Then GoOnAndDoWhatever(sourceFolder) 
End Sub 
+0

ありがとう!残念ながら、 '.OnAction'行は' Error:400'を引き起こします。私がコメントした場合、この行はブロックされますが、エラーはありません(イベントもありません)。また、私が 'Public Sub mySendTo()'の先頭にブレークポイントを使用すると、何もトリガされません。私はあなたの例として 'MyWorkbookName.xlsx'を使用したことに気付きましたが、私のファイルはAddOnファイル' .xlam'です - これは問題ですか?どちらの場合でも、 '.OnAction'はイベントをトリガーしません。どんな考えですか? –

+0

OnActionをトリガーするコマンドバー項目をクリックしたときにOnActionを割り当てると、エラー400が表示されますか? –

+0

あなたの.xlamにカスタムリボンが入っていますか? –

関連する問題