こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

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

Access2010を使用しています。

VBAでイベントを削除したのですが、そんな事って可能ですか?
例えば、フォームでテキストボックスのエンターのイベントそのものを削除するとかです。

代案の回答は結構です。

投稿日時 - 2015-10-08 09:13:31

QNo.9060547

困ってます

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

下記のページの「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 = "[イベント プロシージャ]"

投稿日時 - 2015-10-09 09:15:11

お礼

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

投稿日時 - 2015-10-11 16:39:13

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.4

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

投稿日時 - 2015-10-09 13:18:31

-広告-

ANo.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

でもいいかもしれません。確認はしていませんが。
もし、ほかに入力をスルーする方法があるならば
このほうがいいかもしれません。

投稿日時 - 2015-10-09 03:00:56

ANo.1

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

投稿日時 - 2015-10-08 10:02:20

補足

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

ちなみに
>VBAでイベントを削除したのですが

>VBAでイベントを削除したいのですが
の間違いです。

投稿日時 - 2015-10-08 16:17:14

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-