• ベストアンサー

Excel VBA メニューバー内の各項目の enable/disable変更

Excel VBA を用いて Excelのメニューバーの各項目の enable/disable 状態を変更する事は可能でしょうか? (「編集」-「貼り付け」の許可/禁止の切り替えなど) ご存知の方、教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 Office 2003までに限られますが、 '標準モジュール Sub Test1()  Call MenuVisible(False) 'Off--False, On--True End Sub ' Sub MenuVisible(flg As Boolean) With Application  .CommandBars("Worksheet Menu Bar").Controls("編集(&E)") _    .Controls("貼り付け(&P)").Enabled = flg '編集メニュー  .CommandBars("Cell").FindControl(, 22).Enabled = flg '右クリックメニュー  If flg Then   Application.OnKey "^v"  Else   Application.OnKey "^v", "Dummy" 'ショートカットを無効  End If  End With End Sub ' Private Sub Dummy()  Application.CutCopyMode = False End Sub '------------------------------------------- '起動時は、 Sub Auto_Open()   Call MenuVisible(False) End if '終了する場合は、 Sub Auto_Close()   Call MenuVisible(True) End if '------------------------------------------- とすれば可能です。

nori79
質問者

お礼

年末のお忙しい中、早速の回答ありがとうございます。 教えていただいた方法で試してみます。

nori79
質問者

補足

ありがとうございます。 編集メニュー&右クリックメニューのロックができました。 そこで、補足で教えて下さい。 右クリックメニューのロックで使用している FindControl(, 22)の引数の設定方法が調べたのですがわかりませんでした。 「22」は右クリックメニューの「編集」のことだと思いますが、数字の取得方法、もしくは一覧表のような物はあるのでしょうか。 又、第1引数は省略しない場合は何を設定するものなのでしょうか。 申し訳ありませんが、ご教示下さい。お願い致します。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 返事が遅くなりました。 >FindControl(, 22)の引数の設定方法が調べたのですがわかりませんでした。 「22」は右クリックメニューの「編集」のことだと思いますが、数字の取得方法、もしくは一覧表のような物はあるのでしょうか。 こういう質問をする人は、何年ぶりでしょうか?こういう質問は、大歓迎です。 私が、入門当事は、本の巻末に出ていましたので、それを参考にしました。しかし、私がマクロで作りましたので、ここに出しておきます。それを、ブックにコントロールリストにしても良いと思います。(ほかにも、エラーリストがマクロで出せます。Err.Number と、Err.Description で、1から10000ぐらいをループさせるだけですが。) このマクロは、時間が掛かります。 '------------------------------------------- 'メニューコントロール一覧リスト作成 Sub ControlListsShowup() Dim c As Variant Dim n As Variant Dim i As Long  Application.ScreenUpdating = False  On Error Resume Next   Cells(1, 1).Resize(, 3).Value = Array("CommandBar", "Control", "ID")   i = 2   For Each c In CommandBars      Cells(i, 1).Value = c.Name    For Each n In c.Controls      Cells(i, 2).Value = n.Caption      Cells(i, 3).Value = n.ID      i = i + 1    Next n   Next c  On Error GoTo 0   Application.ScreenUpdating = True End Sub '------------------------------------------- 今回の質問というのは、少し特殊で、抜け落ちは許さないという種類のものだと思います。その場合は、「編集」というキャプションをすべて探します。 >又、第1引数は省略しない場合は何を設定するものなのでしょうか。 第1引数は、MsoControlType とヘルプには出ていますが、msoControlButtonなどの種類で、それは、規定のコントロールの場合は指定する必要がありません。 expression.FindControl(Type, Id, Tag, Visible, Recursive) 次のTag というのは、ユーザーが設定したメニューコマンドの場合に、Add で設定するときに、ついでにTag にユニークな名前をつけておいて、後で、変更したり、メニューを解除したりするときに、そのTag で呼び出します。他は、使ったことがありません。

nori79
質問者

お礼

早速の回答ありがとうございます。 メニューコントロール一覧のリストを出力することができました。 一覧表を用いて確認することにより「抜け落ち」を防ぐことができますね。 初心者にも親切な回答をありがとうございました。

関連するQ&A

専門家に質問してみよう