• ベストアンサー

Access2000のVBAのイベントプロシージャについて

以前から疑問に思っていましたが、イベントプロシージャの「更新前」と「更新後」と 「変更時」の意味、というかタイミングがよくわかりません。例えばコンボボックスの 「更新前」とは、具体的にはどういうときなのでしょうか。コンボの値を更新する前と いうのなら、何もいじってない状態という意味に取れるのですが、何もいじってないなら イベントは発生していないと思うのですが。また、コンボボックスの「更新後」は、 値が変わったときだと思うのですが(例えば「北海道」が選択されているコンボの値を 「東京都」に変えたときなど)、「更新後」と「変更時」はどう違うのですか? どうぞよろしくご教授ください。

noname#21585
noname#21585

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

  • ベストアンサー
noname#7099
noname#7099
回答No.2

コンポボックスなら、更新後と変更時に違いがないかもしれませんが、 変更時は、一文字変更するごとに動作します。 自分で入力するなら、「北海道」をDeleteキーでいっぺんに消すと1回、一文字ずつ消すと3回、東京都でも、「とうきょうと」を1回で変換すると1回、「とうきょう」「と」と2回で変換すると2回動作します。都合2回から5回ほど動作する可能性があります。コンポボックスで選んでもらうつもりならここに指定してもあまり意味はないでしょう。  「AfterUpdate/更新後処理」は、変換が終わって、enterキーtabキーが押されてカーソルが外で出て行く直前に、「変更後の値」に対して処理が行われます。私は、「フィールドの更新後処理」に、入力した値のチェックをしたり、更新をきっかけに他の値を変更しています。  「BeforeUpdate/更新前処理」は、変換がおわって、enterキーtabキーが押されてカーソルが外で出て行く直前に、「変更前の値」に対して処理が行われます。私は「フォームの更新前処理」に、「更新日付フィールドに本日日付を代入する」命令を入れて、レコードがいつ更新されたかがわかるようにしています。  他のイベントもいろんな違いがあり、使い分けることができます。

noname#21585
質問者

お礼

分かりやすくご説明いただきありがとうございました。よく理解できました。

その他の回答 (2)

  • sgh
  • ベストアンサー率61% (75/121)
回答No.3

一般的に「更新後」は入力された値を受けて、別のコントロールに変更 を加える処理に使います。 たとえば、コンボボックスの値「北海道」が「東京都」に変更されたとき 住所をクリアする等が考えられます。 「更新前」は入力された値そのものが正しいかをチェックするのに便利です。 たとえば別のコントロールの値から「北海道」が選択されるのは明らかに おかしい場合、「更新前」のイベントでチェックし、Cancel=Trueを入れると 更新されなかったことに出来ます。 ご参考まで。

noname#21585
質問者

お礼

理解しやすくご説明くださいましてありがとうございました。

noname#5584
noname#5584
回答No.1

イベントの意味はヘルプに記載されています。 わからないとは、それを読んだ上での疑問なのでしょうか? > コンボの値を更新する前と いうのなら、何もいじってない状態という意味に取れる ヘルプを読みましょう。 イベント (メッセージ) の発生タイミングについては、イベントプロシージャにデバッグ用のコード (Debug.Print, MsgBox 等) を埋め込めば確認できます。

noname#21585
質問者

お礼

ヘルプももう一度読んでみました。理解ができたような気がしました。ありがとうございました。

関連するQ&A

  • (アクセス)全てのイベントプロシージャが無反応に

    何らかの原因でプロシージャやコマンドボタンに設定したマクロ等が無反応になる現象に苦慮しています。 多くのフォームの中で、この現象に関連するフォームは2画面あり、それぞれをフォームA、フォームBということで説明いたします。((1)~(4)) (1)フォームAのコマンドボタン押下でフォームBを開きクエリーのデータ(フォームAで指定した条件)  を表示しています。  フォームBで他のフォームと異なっているプロパティは次の通りです。  ・ポップアップ ----はい  ・作業ウィンド固定 --はい (2)フォームBにはレコードソース(クエリ)の値を表示する幾つかのテキストボックスとコンボボックス  が2つあり、それぞれをコンボA、コンボBとするとフォームBを開いた時はそれぞれにクエリーの   データを表示し、変更する場合はコンボAで選定した条件でクエリによりコンボBにデータを表示す  るようにしています。 (3)なお、コンボAの列数は2で、コンボボックスには列1のデータ(商品名)を表示するようしていて列 2の値(商品コード)を一旦テキストボックスに取り出し、そのコードでクエリによりコンボBのデータ  を表示しています。テキストボックスのプロパティのコントロールソースには次のように記述していま す。   =コンボ186.column(1)   ※=コンボ186がコンボAのことです (4)あと、フォームBにはデータをチェックするためのイベントプロシージャが幾つかとフォームAへ戻る ためのコマンドボタンがありますが他のフォームと比べても特に問題は無いように思えます。 以上のような環境でフォームAからフォームBを開いた時に、フォームBにはレコードソースであるクエリの値は全て表示するものの全てのイベントプロシージャ及び(3)で説明しました  =コンボ186.column(1) の処理が一切動作しなくなります。 しかし、次の操作により回復し、その後はACCESSを終了し再起動しても正常に動作します。  ・フォームBをデザインビューで開く  ・フォームBを開く時に設定しているイベントプロシージャを表示  ・イベントプロシージャをいじって閉じる。(内容は変更しない)  ・フォームBをホームビューで開く   だらだらと長くなり説明も不十分かと思いますが、原因がどうしてもわからなく困っております。 何か手がかりを教えて頂けたらと思い投稿しました。 よろしくお願いいたします。

  • アクセスvba [イベント プロシージャ]つけたい

    もうフォームモジュールにイベントは出来上がってるのですが コントロールの名前を変更したため デザインビューのプロパティの[イベント プロシージャ]と言う文字が消えてしまいました。 フォーム上の全てのコマンドボタンのクリック時に [イベント プロシージャ]と言う文字を入れたいのですが そのような作業は可能でしょうか? [イベント プロシージャ]と言う文字が入れば、該当のイベントは既にモジュールにある為 イベントとして機能します。

  • Access2010イベントプロシージャ起動せず

    access2003からaccess2010にアップグレードしたところaccessのイベントプロシージャの一部が発生しなくなりました。 例えば「フォーカス喪失時」 ボタンの「クリック時」は機能しますが、項目の「変更時」、「更新後処理」は使えなくなりました。 どなたか対処方法をご存知でしたら、教えてください。

  • Accessイベントプロシージャについて

    前からの疑問なのですが、フォーム上のイベントプロシージャについてお教え下さい."更新前""更新後""フォーカス取得時""フォーカス取得後""フォーカス喪失時""フォーカス喪失後"の違いがいまいち分かりません.今見たら"ダーティ時"というのも…。ループしてしまっているときの対処ですか?ご回答、お願いいたします。

  • VBA テキストボックスのイベントについて

    Microsoft ACCESS 2010を使用しています。 「テキスト0」という名前のテキストボックスがあり、 Me![テキスト0].Value = "こんにちは" というコードでテキストボックスの文字を変更します。 この時、テキストボックスの値が変更されたという条件でまた別のコードを動作させたいのですが、テキストボックスのイベントである、「更新前処理」「更新後処理」「ダーティー時」「変更時」では、動作しませんでした。 テキストボックスの値を変更する段階で別のコードを入力すれば対応は可能なのですが、「テキストボックスの値を変更した時」のタイミングで別コードを動作させることで、コードをまとめたいと考えています。 これに対して良い方法はありますか?よろしくお願いします。

  • Access2010 イベントプロシージャのエラー

    Accessの初心者です。テキストを読みながら、フォームに配置したコンボボックスにイベントプロシージャを設定して実行したところ、エラーメッセージ表示されました。どなたか御指導頂ければ幸いです。 1.関連するオブジェクト a) 一側テーブル名: T_選手プロフィール  このテーブルに「ID_選手プロフィール」という主キーフィールドがあります。 b) 多側テーブル名: T_期間成績  このテーブルに「選手プロフィール親ID」というフィールドがあります。 * リレーションシップウィンドウで「ID_選手プロフィール」と「選手プロフィール親ID」にリレーションシップを設定しました。 c) クエリ名: Q_期間成績_現役選手プロフィール  このクエリの中に、「ID_選手プロフィール」と「氏名」と「登録番号」というフィールドがあります。 d) フォーム名: F_期間成績 サブフォーム「T_期間成績明細」を中に入れたフォームを作成しました。 2.フォーム上での操作 a) フォーム「F_期間成績」に、コンボボックス「登録番号_コンボ」というコンボボックスを配置しました。 b) このコンボボックスのコントロールソースは、c)の「Q_期間成績_現役選手プロフィール」の「選手プロフィール親ID」です。 c) このコンボボックスで選択した「ID_選手プロフィール」という値に対応する、「氏名」をフォームに新たに配置した非連結のテキストボックス「氏名_テキスト」に、「Q_期間成績_現役選手プロフィール」の「氏名」フィールドの値を表示させようとしています。 d) 「登録_コンボ」コンボボックスの更新後処理からコードビルダーを起動し、テキストを参照しながら以下のコードを書きました。 Private Sub 登録番号_コンボ_AfterUpdate() Name = DLookup("[氏名]", "Q_期間成績_現役選手プロフィール", "登録番号=登録番号_コンボ") If Not IsNull(Name) Then 氏名_テキスト = Name End If End Sub e) フォームにてコンボボックスを操作したところ、「実行時エラー '94': Nullの使い方が不正です。」という実行時エラーが表示されました。色々と試してみましたが、上手くいきませんでした。 分かりにくい説明で恐縮ですが、宜しくお願い致します。

  • コンボボックス ▼ボタンをクリックしたらイベント

    コンボボックスのクリックイベントについて。 コンボボックスの▼ボタンをクリックしたらイベントを発生させたいのですが Private Sub コンボ0_Click() MsgBox "" End Sub として、▼ボタンを押しても無反応です。 どうやらClickイベントは値が入力されたら発生するようですが 値を入力する前に、▼ボタンでプルダウンで値を入力しようとしたとき位 発生させるにはどうすればいいでしょう? GotFocusイベントだと、▼ボタン以外の部分に触れてもイベントが発生してしまいます。

  • Visual Basic 6.0 コンボボックスのChangeイベントが発生しません

    VB6.0を使用しておりますが、 コンボボックスのリストから選択して値を変更しても Changeイベントが発生しないです。 コンボボックスの入力欄に直接入力した場合はChangeイベントは 発生します。 リストから選択して、Changeイベントを発生されるには どうしたら良いでしょうか?

  • アクセスのサブフォームでのトラブル

    サブフォームにコンボボックスがあります。値集合ソースにクエリを指定しており、クエリの抽出条件でメインフォームのリストボックスの値を参照しています。 ところがなぜか、メインフォームのリストボックスを変更しても、それがサブフォームのコンボボックスに反映されません。どういうわけか、変更する前の値が反映されてしまいます。 ところがデータベースウィンドウからそのサブフォームを開くと、同じコンボボックスにメインフォームの変更がちゃんと反映されています。 メインフォームのリストボックスの更新後処理イベントでサブフォームのコンボボックスのリクエリを実行しています。 原因が分からず困っています。よろしくお願いします。

  • アクセスのVBAなんですけど

    アクセスのVBAでフォームからフォームへ値を渡すことはできますか?具体的にいうとあるフォームでコンボボックスから選択し、OKボタンで次のフォームを開くのですが、初めのコンボボックス(ちなみに5つ選択項目があります)で選んだ条件でフォームの表示内容を変更させようと思っています。 今のところ、選択した項目を一時的にテーブルに保存して、新しいフォームが開くときにテーブルから値を取得してやるのか・・・・と考えているのですが、まどろっこしいので・・・・・よろしくお願いします。

専門家に質問してみよう