|
▼そう さん:
おはようございます。
>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ではなく、イベントプロシジャーで処理することを
考えると他のモジュールとの関わり合いが少なくなり、結合度が弱くなりそうです。
検討してみてください。
|
|