• 締切済み

Excelで行挿入イベントをハンドルしたい

Excelで行・列の挿入や削除をしたときの処理をしたいのですが Changeイベントでフックしてくれません。 何かうまい方法はないものでしょうか。 あるいは、Excelの挿入、削除メニューを無効にしたりカスタマイズしたりする方法でも良いです。 ご存知の方教えてください。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

小生素人で、#1でおしゃっているレベルのことに及びませんが、 小生も色んなエクセルの操作をイベントとして捉えてくれると良いなと思いますが、現状では十分できません。 (例)列・行の挿入・削除、列幅の拡大・縮小、書式の変更 シート削除 現状のイベントはマウスの動作ー目的操作単位ー業務のうち、マウスの操作が中心のように思います(特にコントロール類は)。 またシートのセルのエリアに関したものが多い。ツールバー部・メニューバー部などはない。 WorkbookのOpenなどあるのに、と思います。 ここにはMSの下した選択の問題があり、個人的には、その体系が見えない(どういう風に体系的に選んだか)。 エクセルのInsideな構成とか処理方式を知らないとダメなので そういうことを議論することは普通の人には不可能でしょうが。 ーー 普通のVBAの知識ではそれは不可能でしょう。 そのレベルを越えて、クラスの扱いや、内容的にAPIのレベルまで踏み込んで理解しないと無理ではないかと思います。 それとか下記URLの回答のように実質は同じ効果を挙げる他の方法を検討するとか。例えばメニューの一項目を使用できないようにする・削除するとか。 (例 下記) ーー 多分質問の操作を禁止したいというようなことかと思いますが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2252522に似た質問あり ました。 禁止も、上記で言った、個別の目的(が決まった)操作レベルの 禁止の仕組みは無い。 現状あるのはシートの保護程度です。 開発者ー使用者という対立レベルで起こりそうな点からの問題発想が あまり体系的に無いよう。 ーーー つまらぬ感想ばかり述べてしまったので、お詫びに、編集の削除をEnabledするコードを載せます。 Sub Sample() Dim ct As Object Dim ct1 As Object Application.ScreenUpdating = False For Each ct In CommandBars("Worksheet menu bar").Controls ' MsgBox ct.Caption If ct.Caption = "編集(&E)" Then For Each ct1 In ct.Controls 'MsgBox ct1.Caption If ct1.Caption = "削除(&D)..." Then MsgBox ct1.Caption & "Enabled" ct1.Enabled = True 'False End If Next End If Next Application.ScreenUpdating = True End Sub

catecholamine
質問者

お礼

回答ありがとうございます。お礼が遅くなって申し訳有りません。 No.1の方へも書きましたが、いちおう目的を達成することができました。 貴重なご意見ありがとうございます。

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

こんにちは。 ご質問の意図が明確ではありませんが、ふたつの方法があります。 ひとつは、自分でイベントを作る方法です。ただし、他のマクロが動かなくなることがあります。元来は、こちらのほうが主なのですが、私は、ほとんどやったことがありません。PCの負担が多くなるからです。 もうひとつは、クラスで、行・列の挿入・削除のボタンにインスタンスを設け、クリックでイベントにすることですね。 少しややこしくて CommandBars("Row") CommandBars("Worksheet Menu Bar") この中のControls に、ボタンがあります。それと、行全体・列全体を選択した時に出てくる特殊なメニューがあるはずです。 これらを全部、クラスとして保持(=変数)していれば、制御できます。 しかし、内部で、Enabled プロパティを切り替えられているので、機能を完全に無効にすることは不可能ですから、無効にする場合、コマンドメニューの場合は、以下のようにして、見えないようにしないと、無効に出来ません。他のメニューは、Enabled プロパティでも可能です。 CommandBars.FindControl(, 297).Visible = False CommandBars.FindControl(, 296).Visible = False 分かりにくいようでしたら、またお聞きください。 以前のように、回答が出ないから、すぐに閉めてしまうというようなことはしないでくださいね。特に、今回のようなプログラム上の一般論というのは、VBAの中でも難しい質問だと思います。他の掲示板で、ためしにお聞きになっても構いません。実際は、具体的な目的や意図はあるのかもしれませんが、多くの質問というのは、それは明らかにされません。その中で、回答をするというのは、必ずしも、質問が理解出来ているわけではないからです。もしかしたら、VBAは必要がないのかもしれないのですから。また、その場合は、Excelのバージョンにも影響してきます。

catecholamine
質問者

お礼

回答ありがとうございます。 家庭の事情でお礼が遅くなりました。申し訳有りません。 シート保護と右クリックメニューのカスタマイズで目的を達成することができました。ご意見も参考にしたいと思います。

関連するQ&A