Userform
Listbox
の動的コンテキストメニューを構築しました。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
から成るUserform
Listbox
ために右クリック活性化されたコンテキストメニューを作成します指定されたFolderName
ディレクトリ内の各フォルダに対して
私は動的にmySendTo
Sub
または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
ありがとう!残念ながら、 '.OnAction'行は' Error:400'を引き起こします。私がコメントした場合、この行はブロックされますが、エラーはありません(イベントもありません)。また、私が 'Public Sub mySendTo()'の先頭にブレークポイントを使用すると、何もトリガされません。私はあなたの例として 'MyWorkbookName.xlsx'を使用したことに気付きましたが、私のファイルはAddOnファイル' .xlam'です - これは問題ですか?どちらの場合でも、 '.OnAction'はイベントをトリガーしません。どんな考えですか? –
OnActionをトリガーするコマンドバー項目をクリックしたときにOnActionを割り当てると、エラー400が表示されますか? –
あなたの.xlamにカスタムリボンが入っていますか? –