アクセスでレコードの内容が変更されたかどうかを調べる方法とは?

このQ&Aのポイント
  • Win2000、Access2000を使用しています。以下の作業をするためのVBを作成しているのですが、レコードの内容が変更されたかどうかを調べるためのコードとその他のコードとの組み立てがわからず困っています。
  • フォーム上に作成した「戻るボタン」をクリックした時のイベントで、レコードの内容が変更されていたらメッセージボックスを表示する。
  • メッセージボックスの「はい」をクリックしたら、保存してフォームを閉じる。メッセージボックスの「いいえ」をクリックしたら、変更されたフィールドの値を変更前の状態に戻してフォームを閉じる。
回答を見る
  • ベストアンサー

アクセスでレコードの内容が変更されたかどうかを調べるには

Win2000、Access2000を使用しています。 以下の作業をするためのVBを作成しているのですが、レコードの内容が変更されたかどうかを調べるためのコードとその他のコードとの組み立てがわからず困っています。 部分的にでもかまいませんので、おわかりになる方がいましたら教えてください。 1.フォーム上に作成した「戻るボタン」をクリックした時のイベントで、レコードの内容が変更されていたらメッセージボックスを表示する。 2.メッセージボックスの「はい」をクリックしたら、保存してフォームを閉じる。 3.メッセージボックスの「いいえ」をクリックしたら、変更されたフィールドの値を変更前の状態に戻してフォームを閉じる。 以上、よろしくお願いします。

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

  • ベストアンサー
  • vantage
  • ベストアンサー率60% (310/514)
回答No.1

ヒントだけ… フォーム上の連結コントロールの値が変更されたかどうかを知るのは <oldvalue>プロパティを使用します。 If Me!コントロール名.value <> Me!コントロール名.oldvalue then … と比較することで、変更されたかどうかを知ることが出来ます。 また Me!コントロール名.value = Me!コントロール名.oldvalue で、変更前の値に戻すこともできます。 詳細は参考URLやヘルプを参照して下さい。 では、頑張って下さい。

参考URL:
http://homepage1.nifty.com/tsware/tips/tips_219.htm
n-shan
質問者

お礼

ご回答ありがとうございました。 参考URLで細かな解説があり、うまくいきました。

その他の回答 (2)

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

#2の方と似たような意見ですが、 非連結のチェックボックスを非表示で配置する。 全てのコントロールのAfterUpdateイベントでチェックボックスをTrueにするコードを挿入する。 フォームのBeforeUpdateイベントでチェックボックスがTrueの場合だけ動くコードを記述する。 フォームのAfterUpdateでチェックボックスをFalseにする。 この場合Undoされたときが問題になりそうです。 未実験です。

n-shan
質問者

お礼

ご回答ありがとうございました。 フォームのBeforeUpdate、AfterUpdateですね。 やってみます。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.2

更新フラグを立てるということをするのではないでしょうか。 Yes/No型の値を設定し、フォームを開いた時やレコード移動時はNoにし、新規入力や編集された時にYseにして、戻るや閉じるをしようとしたとき、もしYesだったら「更新されていますが保存しますか?」と訊くようにしていますよ。Noならなにも言いません。 で、そのようにするためにはフォームはテーブル等とは非連結にし、DBオブジェクトを操作する、という風にしなければなりません。AccessVBAの中では核心の部分だと思いますが、私はこのあたり「Access97Expert」という本で勉強しました。 ただし97と2000ではDBオブジェクトの扱いが変わっていますので要注意です。(DAO→ADO)

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4797304782/qid=1070407930/sr=1-1/ref=sr_1_0_1/250-4002224-0258616#product-detai
n-shan
質問者

お礼

ご回答ありがとうございました。 フォームとテーブルの連結を非連結にするのは、他にも作業があるため、ちょっと厳しいです。 今までDAO、ADOは、ちょっと抵抗があってなるべく使用しないようにしていたのですが、これからは避けずにチャレンジしてみようと思います。

関連するQ&A

  • アクセス サブフォームのレコードの値が変更したら

    フォームの中にテーブルに基づいたサブフォームを入れています。 サブフォームはデータシートビューで表示しています。 そのサブフォームのレコードの値が変わったら msgboxを表示させるにはどのイベントで行なえば良いですか? サーブフォームのコントロールに Private Sub ページ名_AfterUpdate() MsgBox "" End Sub としたら確かにメッセージボックスは表示されるのですが 全てのコントロールにつけないとだめですか? 「サブフォームのレコードの値が変更したら」 とするにはどうすればいいでしょうか?

  • 1つ前のレコードのフィールドをコピーするVBAについて

    あるフィールドに入力する時、1つ前のレコードと同じ値であれば、Ctrl+2で簡単に入力出来ますね。 それで、更に入力の手間を省くために、これもVBAで自動化しようと思ったのですが、はてどうしたらと行き詰まってしまいました。 入力用のフォームを作っておいて、いくつかのフィールドに入力するテキストボックスをいくつか作って、そのうち1つはほとんど同じ値を持つとすれば、このフォームの更新前のイベントプロシージャが適切かと思います。このフォームに入力しようとしたら、即座にほとんど決まった値を持つフィールドに、1つ前のレコードの値が入るというようなコードになるかと思います。そのコードの1例を教えて頂けますか?また、他のいい方法はあるのでしょうか? 以上、よろしくお願い致します。

  • アクセスで最後のレコード内容の同入力

    アクセス2002を使っています。[年月日]と[内容]のフィールドがあります。新しいレコードに本日の年月日と、前回の最後レコードの内容をコマンドボタンを押すだけで入力したいのですが、(前 Do ボタン) コマンドボタンのプロパテイのイベントのクリック時にプロシジャーでどう書けばよいのですか?教えてください。 VB初心者です。よろしくお願いします。

  • ACCESSフォームのリストボックスでレコードが選択できない

    ACCESS2000です。 フォームの左側に親テーブルのフィールド1の値を選択させるリストボックスがあり、そこで選択したレコードにリンクする子テーブルのレコードをフォームの右側にサブフォームで表示させたいのですが、リストボックスでレコードを選択できません(クリックしても反転しません)。でもレコード移動ボタンを押すと、リストボックス内の該当レコードがちゃんと反転し、右側のサブフォームにも正しく反映します。 リストボックスのプロパティはくまなく見ましたがそれらしい設定項目はみつかりませんでした。どこを直せばよいのでしょうか。

  • Access更新クエリの「レコード更新」をフォームから指定する方法

    お世話になっています。 早速ですが質問があります。 テーブルにあるフィールドの値を全て変更する更新クエリを作成したのですが、出来ればフォームから指定したいのです。 どうやったら「レコードの更新」の値をフィールドから指定出来るのでしょうか? 以上、よろしくお願いします

  • accessのレポートで…

    レポート(テーブル1から作成)にあるフィールド1には「1・2・3…」という数字が入っています。 この1・2・3はテーブル2(ID・名前)とリンクしています。 フォーム上ではコンボボックスにして、テーブル2の名前も表示するようになっています。 (テーブルに値としては入っていません) これでレポートを作成した場合、テーブル2の名前を表示させたいのですが、テキストボックスで Iif([フィールド1] = "1","****",Iif(… というようにしてしまうと、せっかくリンクにしたのにデータが固定になってしまうのを避けたいんです。 フォームだとコンボボックスの更新後処理とレコードの移動にコードをかけば最新の情報を表示することができたんですが、レポートでもこのようなことはできるんでしょうか? (コードをかいて処理したいです) Access2000です。 よろしくお願いします。

  • Access2003 レコード削除時のメッセージを変更するには

    いつもお世話になっております。 フォーム上の削除ボタンをクリックすると、メッセージが表示されて”OK”をクリックすると該当のレコードが削除されます。 このメッセージを任意に変更したいのですが、どうすればいいでしょうか? 現在のコードはこのようになっています。 DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 具体的にはリレーションシップが組んであるレコードを削除しようとすると、 「このリレーションシップには参照整合性の・・・」という長いメッセージが表示されるのを「このデータを削除しますか?」のように変更したいのです。 ご教授いただければ幸いです。よろしくお願いいたします。

  • ACCESSでレコードのコピー

    ACCESS初心者です。 テーブルt_Aとt_Bがあり、t_Aを元にしたフォームがあるとします。 行いたいのはこのフォームでレコードを選択しボタンをクリックして t_Aの該当レコードのフィールドの値をt_Bのフィールドにコピー(新規追加)したいのです。 追加クエリでなんとかなるかなと思ったのですが思うようなクエリが作れないのです。 アドバイスをいただけませんでしょうか。 マクロ、VBAの利用方法についてはほぼわかっております。

  • ACCESS サブフォーム レコード移動ボタンをつ

    ACCESS初心者です。 フォーム A サブフォーム B リンク親フィールド 名前 子リンク親フィールド 名前 サブフォームで表示されるレコードセレクタと移動ボタンを、フォームA上にオリジナルでボタンとテキストで下記項目を作成したいです。 作りたい項目 ボタン1 次のレコードへ移動 ボタン2 前のレコードへ移動 テキストボックス 現在のレコード/レコード数 ボタンの作成まではできましたが、イベントプロージャにどういう内容を入れたらよろしいのでしょうか

  • 異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。

    msAccess2000のVBAコードの質問です。 元々、全てを理解しているわけではないのにVBAコードを書いているのが無茶なんですが、無茶を承知でプログラミングしています。 あるクエリの結果を、あるフォームで帳票表示しています。この帳票の一レコードにボタンをつけて、クリックイベントで、そのレコードを取得しようとしています。フォームはこの後、閉じられた後、呼び出された親にその、レコードを渡したいのです。 フォームは、親フォームのボタンクリックイベントから、DoCmd.Openformメソッドによって呼び出されるので、戻り値は使えません。 しょうがないので、広域変数rst(DAO.Recordset型)で、受け渡そうと思ったのですが、recordset型は、どうやら参照のようで、フォーム(クエリ?)を閉じると、レコードが壊れてしまうようなのです。 Module1で、 public rst as DAO.recordset として、 Private Sub コマンド34_Click() set Module1.rst=me.recordset ' この中では、rst.fields(*)で、フィールドの値を使えるのですが・・・ END Sub 呼び出した親フォームでは、module1.rst.fields(*)を使用できません。 質問は二つあります。 1)広域変数rstは、上記のような宣言・使用法で問題ないですか? 2)sub またはfunction間にわたって、レコードを渡す、いい方法はないですか?

専門家に質問してみよう