| 
    
     |  | ▼そう さん: おはようございます。
 
 
 >UserFormを右クリックするとメニューが現れ、その中の項目を選択すると
 >マクロが実行されるというものをつくる場合・・・・・・。
 >とりあえす以下のコードを考えました。
 >
 >
 >///////// UserForm1 フォームモジュール //////////////////////////
 >
 >Dim myCB As CommandBar
 >
 >Private Sub UserForm_Initialize()
 >
 >  On Error Resume Next
 >  CommandBars("tbMenu").Delete
 >  On Error GoTo 0
 >
 >  Set myCB = CommandBars.Add(Name:="tbMenu", _
 >       Position:=msoBarPopup, Temporary:=True)
 >
 >  With myCB
 >    With .Controls.Add(Type:=msoControlButton)
 >      .Caption = "第1次変換モード"
 >      .OnAction = "FirstStringConv"
 >    End With
 >
 >    With .Controls.Add(Type:=msoControlButton)
 >      .Caption = "第2次変換モード"
 >      .OnAction = "SecondStringConv"
 >      .BeginGroup = True
 >    End With
 >  End With
 >
 >End Sub
 >
 >
 >Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As  Integer, ByVal X As Single, ByVal Y As Single)
 >
 >  If Button = 2 Then
 >    myCB.ShowPopup
 >  End If
 >
 >
 >End Sub
 >
 >
 >Private Sub UserForm_Terminate()
 >
 >  On Error Resume Next
 >  CommandBars("myCB").Delete
 >  On Error GoTo 0
 >
 >End Sub
 >
 >
 >以上実行すると、フォームを右クリックするとメニューが表示され、
 >そのメニューから項目を選択すると標準モジュール内のプロシージャ
 >[ FirstStringConv ] 、[ condStringConv ] を呼び出せました。
 >
 >ここからが質問なのですが、このメニューから標準モジュール内では
 >なく、フォームモジュール内に書かれてあるプロシージャを呼び出す
 >という場合には、 .OnAction = の次にどのような書き方で実行したい
 >プロシージャ名を指定すればよいのでしょうか?
 提示されたコードのように、Onactionプロパティには、
 標準モジュールのプロシジャーを指定して、
 
 このプロシジャーの中からユーザーフォームのプロシジャーを呼び出す方法も
 考えられます。
 
 標準モジュール
 
 sub FirstStringConv()
 userform1.フォームのプロシジャー名
 end sub
 
 (尚、この時、ユーザーフォームの呼び出すプロシジャーは
 Public宣言されている必要があります)
 
 例
 public sub フォームのプロシジャー名()
 
 
 が、
 コードや仕様にもよりますが、
 各モジュール間の結合度が強くなってしまうことが懸念されます。
 
 
 ユーザーフォームのモジュールを
 
 Option Explicit
 Dim myCB As CommandBar
 Private WithEvents btn_FirstStringConv As Office.CommandBarButton
 Private WithEvents btn_SecondStringConv As Office.CommandBarButton
 
 Private Sub btn_FirstStringConv_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
 MsgBox "FirstStringConvの中のコードを実行"
 'ここに第1次変換モードというボタンがクリックされたときの
 'コードを記述します。
 
 End Sub
 
 Private Sub btn_SecondStringConv_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
 MsgBox "SecondStringConvの中のコードを実行"
 'ここに第2次変換モードというボタンがクリックされたときの
 'コードを記述します。
 
 End Sub
 
 Private Sub UserForm_Initialize()
 On Error Resume Next
 CommandBars("tbMenu").Delete
 On Error GoTo 0
 Set myCB = CommandBars.Add(Name:="tbMenu", _
 Position:=msoBarPopup, Temporary:=True)
 With myCB
 Set btn_FirstStringConv = .Controls.Add(Type:=msoControlButton)
 With btn_FirstStringConv
 .Caption = "第1次変換モード"
 End With
 
 Set btn_SecondStringConv = .Controls.Add(Type:=msoControlButton)
 With btn_SecondStringConv
 .Caption = "第2次変換モード"
 .BeginGroup = True
 End With
 End With
 
 End Sub
 
 
 Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 
 If Button = 2 Then
 myCB.ShowPopup
 End If
 
 
 End Sub
 
 
 Private Sub UserForm_Terminate()
 
 On Error Resume Next
 myCB.Delete
 On Error GoTo 0
 
 End Sub
 
 
 このようにOnactionではなく、イベントプロシジャーで処理することを
 考えると他のモジュールとの関わり合いが少なくなり、結合度が弱くなりそうです。
 
 検討してみてください。
 
 |  |