[[20150315104056]] 『ユーザーフォーム上の右クリックメニューが再度表』(田吾作) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォーム上の右クリックメニューが再度表示されてしまう』(田吾作)

 officetanakaさんの↓の記述を参考にユーザーフォームのテキストボックス上で右クリックすることによって
 メニューを表示し、選択したメニューを実行する、ということをしようとしています。

http://officetanaka.net/excel/vba/tips/tips02.htm

 出来ているコードは下記の通りです。

 'ユーザーフォーム

 Dim myBar As Variant    ''(1)

 Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
                                                      ByVal X As Single, ByVal Y As Single)
     If Button = 2 Then myBar.ShowPopup    ''(5)
 End Sub

 Private Sub UserForm_Initialize()
     Set myBar = CommandBars.Add(Position:=msoBarPopup, Temporary:=True)    ''(3)
     With myBar
         With .Controls.Add    ''(4)
             .Caption = "選択再転記"
             .OnAction = "saitenki"
             '.FaceId = 594
         End With
         With .Controls.Add
             .Caption = "選択コピー"
             .OnAction = "selcpy"
             '.FaceId = 595
         End With
     End With
 End Sub

 '標準モジュール

 Sub saitenki()
  Dim seltxt As String
   seltxt = UserForm1.TextBox1.SelText
   UserForm1.TextBox1.Value = seltxt
 End Sub

 Sub selcpy()
  UserForm1.TextBox1.Copy
 End Sub

 いま躓いているのは、右クリッックで表示したメニューをクリックで実行するところまでは出来ている
 のですが、実行後再度メニューが表示されてしまう、ということです。

 試しに実行するメニューを選択状態でEnterキーで実行しても再度メニューが表示されてしまいました。

 実行後メニューが再度表示されてしまうのを回避するにはどのようにすればいいでしょうか?
 ご存知の方、ご教示お願いいたします。

 ※リストボックスでは再度メニューが表示される、ということはありませんでした。

< 使用 Excel:Excel2007、使用 OS:WindowsVista >


 Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
                                                      ByVal X As Single, ByVal Y As Single)
     If Button = 2 Then myBar.ShowPopup    ''(5)
 End Sub

 このイベントをmousedownではなく、mouseupイベントで行ってみてください。

 私は、この右クリックメニューは、全部クラスモジュールに管理させるようにしています。

 この右クリックメニューで私の場合、よく見かける 切り取り コピー 貼付け機能を付けています。

 これは、ユーザーフォームを使うときには、必ずと言ってよいほど使うので クラスモジュールで
 管理させて、使う場合は、このオブジェクトのインタンスを作成し、メニューを使うコントロールを
 登録するだけにしています。

 私の場合は、このコピー&ペースト専門に使用しているので全部オブジェクトに任していますが、
 右クリックメニューをカスタマしたい場合は、クラス(オブジェクト)にイベントを用意し、
 ユーザーフォーム内にそのメニュー機能処理をコード化できるような構造にするとよいでしょう

[[20100921183617]]

 コピー&ペーストのクラスモジュール例です。

( ichinose) 2015/03/15(日) 11:43


 ichinoseさん、ご回答ありがとうございます。

 MouseUpイベントにすることで解決しました。

 リンク先のクラスモジュールの例も勉強させていただきます。
 アドイン化しておくと汎用的になるので便利ですね。
 ありがとうございました。
(田吾作) 2015/03/15(日) 12:19

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.