質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

10841閲覧

Excel 右クリックメニューで表示されるコマンドを実行できないようにしたい

yoshin

総合スコア39

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/09/23 03:58

###前提・実現したいこと
ExcelVBAにてツールを開発しています。

行、列、セルを右クリックして表示されるメニューから以下の項目を実行できないようにしたいです。

・挿入
・削除
・非表示(セルのときは不要)
・再表示(セルのときは不要)

###発生している問題・エラーメッセージ

行、列における挿入不可は以下のコードでできました。

'行 挿入の不可
CommandBars("Row").FindControl(, 3183).Enabled = False
'列 挿入の不可
CommandBars("Column").FindControl(, 3183).Enabled = False

同様のコードをセルに対して実行するとエラーが発生しました。
CommandBars("Cell").FindControl(, 3183).Enabled = False
⇒実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。

###教えていただきたいこと

・行、列において実行した
CommandBars("").FindControl(,).Enabled = false
というコードはセルに対しては有効ではないのでしょうか?
だとしたら、セルの右クリックメニューの項目を実行できないようにする方法が知りたいです。

・挿入については、.FindControl(,3183)を指定すればよいことはわかりました。
他の項目のIDはどうやって調べればよいでしょうか?
どこかに一覧のようなものがあるのでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
Excel 2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下の記事が参考になると思います。
⇒組み込みのコマンド バー コントロールの ID 番号の一覧
⇒CommandBar ID 一覧(Office 2010)

上記の情報を参考に実際に調査してみたところ、以下のような値で参照できるようでした。
(確認環境:Excel2010)

セルの挿入:3181
コピーしたセルの挿入:3185
セルの削除:292

行の挿入:3183
コピーした行の挿入:3187
行の削除:293
行の非表示:883
行の再表示:884

列の挿入:3183
コピーした列の挿入:3187
列の削除:294
列の非表示:886
列の再表示:887

注意すべきは「セルの挿入」と「コピーしたセルの挿入」が別IDだという点です。
セルをコピーしている状態ではメニューには「コピーしたセルの挿入」が表示されていますので、この時CommandBars("Cells")の中に「セルの挿入」のID:3181は見つからず、制御もできません。

On error Resume Nextでエラーを無視しつつEnabled制御するか、存在を確認したうえでEnabled制御をするか、何らかの対処が必要です。

※列・行の挿入も同様です。

以上、参考になれば幸いです。

投稿2016/09/23 06:45

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshin

2016/09/23 07:23

コピーしたセル、列、行の挿入があることは盲点でした。 貴重な情報ありがとうございます。 検討してみます。
yoshin

2016/09/26 04:26

セルの挿入:3181を禁止する処理をいれたところ、 コピーしたセルの挿入:3185 の処理をいれなくても、 右クリックでメニューを表示した際、コピーしたセルの挿入がグレーアウトされて実行できない状態になりました。 もしかしたら私の環境がEecel2013だからかもしれませんが。
jawa

2016/09/26 05:01

バージョンの違いによる動作の差異はあるかもしれません。 当方の環境(Excel2010)では、メニューに「コピーしたセルの挿入」が表示されている状態で ``` CommandBars("Cell").FindControl(, 3181).Enabled = False ``` を行うと、「実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。」のエラーが発生しました。 ただ、あらかじめメニューに「セルの挿入」が表示されている状態で3181を無効化設定しておくと、その後セルをコピーしてメニューに「コピーしたセルの挿入」が表示されるようになっても「コピーしたセルの挿入」は無効化状態で表示されるようでしたので、無関係ではなさそうでした。 設定に対する動作結果しかわからないので、はっきりしたことが言えなくて申し訳ないです。。
yoshin

2016/09/26 06:43

こちらでもメニューに「セルの挿入」が表示されていない状態で、 3181を無効化しようとするとエラーが発生しました。 事前のユーザーの操作によって表示されるメニューが変わるため、 それに応じた処理を考慮する必要があることがわかりました。 それらを踏まえると、 右クリックメニューで制御するのがもしかしたらあまりよろしくないのかなとも思い始めました。 シートの保護でも行の挿入等の許可を制御できそうなので、それも踏まえてもう一回仕様を検討してみようと思います。 いろいろと教えていただき本当にありがとうございました。 この件については一旦クローズとさせていただきます。
jawa

2016/09/26 09:07 編集

現在の方針でいくのであれば、回答本文にも記載しましたが、 ①エラーを無視しながら3181も3185もEnabled制御する方法 ``` On Error Resume Next CommandBars("Cell").FindControl(, 3181).Enabled = False CommandBars("Cell").FindControl(, 3185).Enabled = False ``` ②存在を確認したうえでEnabled制御をする方法 ``` Dim ctl As CommandBarControl Set ctl = CommandBars("Cell").FindControl(, 3181) If Not ctl Is Nothing Then ctl.Enabled = False Set ctl = CommandBars("Cell").FindControl(, 3185) If Not ctl Is Nothing Then ctl.Enabled = False ``` などがあると思います。 新たに検討されていますシートの保護で制御する方法もありだと思います。 …というかメニューをいじるよりも真っ当なやり方のような気もしますので、頑張ってください。
guest

0

とりあえず、Cellの挿入メニューのIDは3181でした(Excel2010環境)

VBA

1CommandBars("Cell").FindControl(, 3181).Enabled = False

調べた方法は以下のようなコードでIDとテキストを出してみました。

VBA

1For Each c In CommandBars("Cell").Controls 2 Debug.Print c.ID & ":" & c.Caption 3Next

本来ならFindControlsで検索できそうですが、よくわからなかったので・・・。

投稿2016/09/23 04:41

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshin

2016/09/23 07:22

回答ありがとうございます。 教えていただいた方法でExcel2013でのIDがわかりました。 たすかりました。 'セル '挿入 CommandBars("Cell").FindControl(, 3181).Enabled = flg '削除 CommandBars("Cell").FindControl(, 292).Enabled = flg '行 '挿入 CommandBars("Row").FindControl(, 3183).Enabled = flg '削除 CommandBars("Row").FindControl(, 293).Enabled = flg '非表示 CommandBars("Row").FindControl(, 883).Enabled = flg '再表示 CommandBars("Row").FindControl(, 884).Enabled = flg '列 '挿入 CommandBars("Column").FindControl(, 3183).Enabled = flg '削除 CommandBars("Column").FindControl(, 294).Enabled = flg '非表示 CommandBars("Column").FindControl(, 886).Enabled = flg '再表示 CommandBars("Column").FindControl(, 887).Enabled = flg
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問