• ベストアンサー

VBAでイベントを削除したい

Access2010を使用しています。 VBAでイベントを削除したのですが、そんな事って可能ですか? 例えば、フォームでテキストボックスのエンターのイベントそのものを削除するとかです。 代案の回答は結構です。

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

  • ベストアンサー
回答No.3

下記のページの「CodeModuleのメソッド」の DeleteLinesメソッド・ReplaceLineメソッドを使えば可能だと思いますが、 Office TANAKA - VBAでVBEを操作する http://officetanaka.net/excel/vba/vbe/ > 「Private Sub 商品番号_KeyDown()」でエンターキーを押した時、入力された商品番号が、とある商品番号だった場合、「Private Sub 商品番号_KeyDown()」自身を削除する、みたいな感じです。 イベントプロシージャを削除してしまうと、未来永劫のこのイベントは発生しなくなりますが、それでいいのですか。 特定の商品番号の時だけ、イベントプロシージャが発動しないようにしたいというのが目的ではないですか。 Accessの場合は、Excelとは少し異なり、特定のイベントプロシージャが発動しないようにするには、イベントとイベントプロシージャの関連付けを解除するという考え方になります。 If Me.商品番号.Text = "特定の商品番号" Then Me.商品番号.OnKeyDown = "" '関連付け解除 End If これで、商品番号 の KeyDownイベントプロシージャは発動しなくなります。 関連付けが必要になったときは、下記のコードに関連付けます。 Me.商品番号.OnKeyDown = "[イベント プロシージャ]"

tdosj
質問者

お礼

有難うございます。 リンク先n記事は存じていましたが、勝手にダメだと思い込んでいました。 普通にと言いますかやってみたらできました。

その他の回答 (3)

  • panacon
  • ベストアンサー率31% (214/679)
回答No.4

tdosj さんへ 例えば、テキストボックスのエンターのイベントを削除したいのであれば、値の代入で、そのテキストボックスのエンターのプロパティに、Nullを代入すればOKです。反対に、イベントを動かしたいなら、同じく値の代入で、"[イベントプロシージャ]"と書けば動くと思います。両方やりたいのなら、トグルやチェックボックスの値でIF文で分岐すれば良いですね。その際は、IF トグル=-1 then 値の代入、IF トグル=0 then 値の代入、とやればできますね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>イベントそのものを削除する >モジュールを自分自身で消す方法は分かるのですが、イベントの場合どうやるのか この文章の流れからするとイベントの取り消し、 すなわち入力を拒否するということですかね。 もう少し具体的に、データを入力したら指定のデータであれば 入力をはじきフォーカスをどこにおくとか、そのように説明しないと 「何のことやら」になります。 >代案の回答は結構です。 というからには、確固たる説明をする必要があると思いますが。 イベントそのものを無かったことにするのは 無理だと思いますが(イベントログの取り消し)。 擬似的にイベントを取り消し、入力したデータをはじくことは出来ます。 Undoを使います。 たとえば、商品番号に「1000」を入力したら拒否するということであれば、 Private Sub 商品番号_KeyDown(KeyCode As Integer, Shift As Integer)   If KeyCode = 9 Or KeyCode = 13 Then     If Me!商品番号.Text = 1000 Then       Me!商品番号.Undo       Me!商品番号.SetFocus       Me!商品番号.SelStart = 0       KeyCode = 0     End If   End If End Sub ここで、 KeyCode = 9 はタブキー、 KeyCode = 13 はエンターキー を表します。タブキーを入れたのは数値型だと タブキーでそのままスルーをしてしまうので、 タブキーを使った場合も網にかけるようにしています。 なお、     If Me!商品番号.Text = 1000 Then の、Textプロパティを省略しないように。 あるいは、KeyDown時のKeyCodeを指定せずに、 Private Sub 商品番号_KeyDown(KeyCode As Integer, Shift As Integer)   If Me!商品番号.Text = 1000 Then     Me!商品番号.Undo     Me!商品番号.SetFocus     Me!商品番号.SelStart = 0     KeyCode = 0   End If End Sub でもいいかもしれません。確認はしていませんが。 もし、ほかに入力をスルーする方法があるならば このほうがいいかもしれません。

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

もう少し全般的な、やりたいこと(ニーズを必要とする場面)の、説明が必要と思う。 質問には「そのニーズを必要とする場面」の解説が、一番回答者の手がかりになる、ことを覚えておいて。 ・いまあるコードを削除する。コメント化する。 ・エンターのイベント、で飛んで来たらExit SUB的なところへ行かせる ・EnableEvent=False しかしエクセルではこれがあるが、Applicationのものなので、1つのイベントだけを狙い撃ちして、働かなくできないかもしれない。すべてのイベントが動かなくなると思う。アクセスにもエクセルと同程度としても、あるかな。 http://okwave.jp/qa/q5815609.html のような質問回答があるが、本質問者が聞いていることが違うような。 ーー もしかして、イベントの連鎖が嫌なのかな。エクセルのChangeイベントのような。

tdosj
質問者

補足

例えば、「商品番号」と言う名前のテキストボックスがあるとして、「Private Sub 商品番号_KeyDown()」でエンターキーを押した時、入力された商品番号が、とある商品番号だった場合、「Private Sub 商品番号_KeyDown()」自身を削除する、みたいな感じです。 モジュールを自分自身で消す方法は分かるのですが、イベントの場合どうやるのか、やり方があるのかと思いまして。 ちなみに >VBAでイベントを削除したのですが は >VBAでイベントを削除したいのですが の間違いです。

関連するQ&A