Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


23973 / 76732 ←次へ | 前へ→

【58114】Re:プロシージャの呼び出し方について
発言  ichinose  - 08/10/3(金) 6:55 -

引用なし
パスワード
   ▼そう さん:
おはようございます。


>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ではなく、イベントプロシジャーで処理することを
考えると他のモジュールとの関わり合いが少なくなり、結合度が弱くなりそうです。

検討してみてください。
2 hits

【58113】プロシージャの呼び出し方について そう 08/10/3(金) 1:28 質問
【58114】Re:プロシージャの呼び出し方について ichinose 08/10/3(金) 6:55 発言
【58115】Re:プロシージャの呼び出し方について そう 08/10/3(金) 9:29 発言
【58121】Re:プロシージャの呼び出し方について ichinose 08/10/4(土) 8:21 発言
【58122】Re:プロシージャの呼び出し方について そう 08/10/4(土) 9:59 お礼

23973 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free