dポイントプレゼントキャンペーン実施中!

VBの”Worksheet_BeforeRightClick”でCancel=Falseにして、ユーザーフォームだけを表示させたのですが、コンテキストメニューも表示させたい時があります。
ユーザーフォーム上のコマンドボタン(例:とじる)で、コンテキストメニューを再表示する事は可能なのでしょうか?

エクセル2010です。
皆様よいお知恵をご教示下さい。

A 回答 (6件)

こんばんは。

度々お邪魔してすいません。こんなのはいかがでしょうか?
フォームが表示されていないときは、フォーム表示して、メニュー表示しなし。フォームが表示されているときは、通常どおりのメニューとなります。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not UserForm1.Visible Then
UserForm1.Show vbModeless
Cancel = True
End If
End Sub
    • good
    • 0
この回答へのお礼

解決しました

こんばんは、ママチャリさん。
長い時間お付き合い下さり誠にありがとうございますm(_ _)m

行いたかった最初の方法よりも、使い勝手が良くなりました!
#2のご回答も他のフォームでまるっと使わせて頂きました^^
またご機会がありましたら、よろしくおねがい致します。

お礼日時:2017/01/18 19:52

私の方は、話が見えなくなってしまいました。

すみません。

>1.UserForm1でOptionを数点設定し、セルに対して実行する。
>2.他のセル範囲も同じ、または少しの設定変更なら、UserForm1が表示されている状態で再セル選択し実行する。

個人的には、私は、UserForm では作らないでしょう。もう少し、リボンカスタマイザーを使いこなせれば、リボンのタブの中で処理できると思います。ただ、今のVBAの流行からすると、C#でXLL ファイル作って、アドイン化して使うほうが主流のようです。

>「再入力が面倒だ」です^^;
これについては、Userform に何を入れているか分かりませんが、通常は、Custom Properties に書き込む方法が一番多いですね。今どきは、隠しシートを置いておいて、そこに書き込んでしまうという人もいます。たぶん、通じてはないと思いますが、日本でExcelツールを公開している人は、その二種類に限られるようです。

BeforeRightClick ->Cancel =False のイベントなどは不要だと思います。それ自体のメニューをオン・オフをすれば済む話です。

>メニューそのものへマクロ追加。。。って事でしょうか。
>思いもよりませんでしたが、大変参考になりました。

#1で書いたものが、Class のインスタンス。そして、その次が、コンテクストメニュー・カスタマイズ
安全性は、Class のほうが上なのですが、ここの所評判が良くありません。コンテクストメニュー・カスタマイザーは、まだ、ユーザーが自由に使えるツールが少ないです。

>そのメニューはBOOK単位で表示(アドイン?)されていまうのでしょか?
それぞれのブックに組み込むものですが、アドイン型にすることも可能ですが、ブック自体をXML専用エディタで書き換えてしまいます。
    • good
    • 0
この回答へのお礼

ありがとう

WindFallerさん、こんばんは。
ご助言ありがとうございます。
最初の質問の仕方が悪くお手数お掛けしモヤモヤさせてしまいすみませんでした。

初めて聞く内容が多く、それぞれに質問したい所ですがまたのご機会にお助け頂ければと思います。
沢山の収穫を得る事が出来ました!
ありがとうございました^^

お礼日時:2017/01/18 19:50

おはようございます。

No.2です。
そういうことだったのですね。おっしゃる通り、この方法はモードレスでは使えません。

今回の質問の本質は、「ユーザフォーム表示のトリガ―を何にすべきか」ということだと思います。「もう右クリックには拘らない」というのであれば、以下は読み捨てて下さい。

「モーダルだと、都度、フォームが閉じてしまって、次に開いた時に再入力が必要になるので面倒だ。都度、閉じても良いが、開いた時に前回の内容を引き継ぎたい」ということで良ければ、フォームをアンロードして閉じるのではなく、非表示にすることにより、次に開いた時に前回の内容が引き継がれるはずです。
こんな感じです。

Unload Me
 ↓
UserForm1.Hide
    • good
    • 0
この回答へのお礼

ありがとう

おはようございます。
モードレスをご確認くださりありがとうございました。
「特定」原因の様に記載した後、パソコンの環境で違うのでは?と思って後悔しておりました。。。

ご察しの通り「右クリックに拘っている」「再入力が面倒だ」です^^;
自分のコードを読み返して、UserForm1.Hideがコメントアウトされていたので、検討の結果自己不満足だった様です。ご教示ありがとうございました。
もう少し悩んでみます。

お礼日時:2017/01/15 10:44

#1の回答者です。



>頻繁にはないのですが、特に1つのセルに対して、文字の色、大きさ、セルの色、コメントなど一通り修正する事があります。
>右クリック→フォーム表示(のみで閉じるボタン)→コンテキストメニュー表示の流れだと良いかなと考えていました。

どうやらこちらが考えていたものとは違うようですね。
気になるのは、UserFormの働きなのです。おそらくUserFormを使って、セルの処理をするのではないでしょうか。

もしかしたら、以下のようなマクロは代わりになりませんか?
Microsoft 側にも出ているはずですが、
http://www.rondebruin.nl/win/s2/win014.htm
例えば、こんなものです。

コードもオープンになっていますが、コードは、XML で書かれています。
ふつうは、右クリックして、特別メニューが出てきて、既存の組み込み型のツールのボタンを呼び出すだけなのです。
    • good
    • 0
この回答へのお礼

こんばんは。
再検討ありがとうございます。
メニューそのものへマクロ追加。。。って事でしょうか。
思いもよりませんでしたが、大変参考になりました。
そのメニューはBOOK単位で表示(アドイン?)されていまうのでしょか?
質問が質問を呼んでスミマセン。

お礼日時:2017/01/13 23:36

とりあえず、こんな感じでどうでしょう。


UserForm1のCommandButton1をクリックして閉じた時だけ、メニューが表示されます。

【標準モジュール】
Public myCancel As Boolean

【Sheet1モジュール】
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
myCancel = True
UserForm1.Show
Cancel = myCancel
End Sub

【UserForm1モジュール】
Private Sub CommandButton1_Click()
myCancel = False
Unload Me
End Sub
    • good
    • 0
この回答へのお礼

こんばんは。
ご回答下さりありがとうございます。
#1 WindFallerさんへのお礼の前にご回答頂けていたのですね。。。
お返事が遅れてすみません。

ご提示頂いたコードが希望していた動作です。
・・・ですが、組み込むと動かない...
原因は
UserForm1.Show vbModeless

後出しですみません。下記の使い方をしたいのでモードレスにしています。
1.UserForm1でOptionを数点設定し、セルに対して実行する。
2.他のセル範囲も同じ、または少しの設定変更なら、UserForm1が表示されている状態で再セル選択し実行する。

最初の投稿(質問)に対してBAなので恐縮ですが、これは実現出来ますでしょうか?

お礼日時:2017/01/13 23:16

こんにちは。



>”Worksheet_BeforeRightClick”でCancel=False

何か、このイベントマクロは生きて使われているのでしょうか?それとも、Context Menu(Cellメニュー)を出さないためにしているのでしょうか。一般的には、RightClickMenu --コンテキストメニューを出さない目的なら、

Application.CommandBars("Cell").Enabled = False
にすれば出てきません。出すなら、その逆の、'True' にすればよいです。

RightClickMenuのイベント側でいじるなら、イベント自体を、Class に移行して、そこで、インスタンスを作れば、どこからでも命令でオン・オフが可能だと思います。

以下は、アプリ全体に及ぼします。(規模を縮小して、ThisWorkbookレベルまでは可能だと思います)
'標準モジュール
'-------------------
Public myClass As Class1
Sub ClassControl_On()
 Set myClass = New Class1
 Set myClass.xlApp = Excel.Application
End Sub

Sub ClassControl_Off()
 Set myClass = New Class1
 Set myClass.xlApp = Nothing
End Sub

'Class モジュール/Class1
'-------------------
Public WithEvents xlApp As Excel.Application

Private Sub xlApp_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
'//
    • good
    • 0
この回答へのお礼

こんばんは。
ご回答下さりありがとうございます。
使い方としては、セルをn行m列選択した状態で右クリックしユーザーフォームを表示させます。
フォームにはオプションボタンやラベル、テキストボックスがあり、それらの条件で各セルの内容を変更させます。

この時にコンテキストメニューがちらちら現れるので。。。
出さないようにしたのですが、先ほどのn行m列または、1つのセルに対して大文字にしたり、コメントを挿入したりと後で作業があると、やっぱりコンテキストメニューが欲しくなってしまいました。
頻繁にはないのですが、特に1つのセルに対して、文字の色、大きさ、セルの色、コメントなど一通り修正する事があります。
右クリック→フォーム表示(のみで閉じるボタン)→コンテキストメニュー表示の流れだと良いかなと考えていました。

ご提示いただいたコーディングはまだ試してはいませんが(見ただけでは理解できず・・・。^^;)
早速のご教示ありがとうございました♪

お礼日時:2017/01/11 23:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています