Accessのテーブルのデータを処理するためのマクロのことを[データマクロ]と呼びます。
テーブルで行った削除や追加、更新などの実行時に、設定した処理を自動で実行するマクロのことです。
この機能を使って、更新したレコードを[更新記録テーブル]へ自動で追加保存することができます。更新日時も保存できます。
また、既存のマスターテーブルなどに[更新日時]フィールドを追加して、変更前のデータも同時に保存できます。
データマクロは、Access2010以降の機能です。
ここでは、データマクロの[更新後処理]と[変更前]を使って解説します。
参考ウィンドウの表示は[タブ付きドキュメント](既定)を選択しています。[ウィンドウを重ねて表示する]と[タブ付きドキュメント]の違いについては、以下の記事で解説しています。
-
[タブ付きドキュメント]と[ウィンドウを重ねて表示する]の違い
Access2007以降、オブジェクトを表示すると、タブ付きウィンドウで表示されるようになっています。 昔からAccessを使用している方に ...
更新記録を保存するテーブルを作成
商品マスターとして、以下のようなテーブル[T_商品]を作成しています。
以下は、デザインビューです。
マスターテーブルをコピーして更新記録テーブルを作成
更新したレコードを保存するテーブルを作成します。
マスターテーブル[T_商品]をコピーします。
貼り付けを実行すると、[テーブルの貼り付け]ダイアログボックスが表示されますので[テーブル構造のみ]を選択します。
テーブル名を入力して[OK]ボタンをクリックします。
ここでは、[T_商品更新記録]という名前にします。
テーブル[T_商品更新記録]をデザインビューで開き、以下のように変更します。
フィールド名[更新記録ID](オートナンバー型)と、[更新日時](日付/時刻型)を追加します。
マスターテーブル[T_商品]と同じフィールドには、同じデータ型を指定します。
これで空っぽのテーブル[T_商品更新記録]ができました。以下は、テーブル[T_商品更新記録]のデータシートビューです。
このテーブルにマスターテーブル[T_商品]で更新されたレコードを保存していきます。
テーブルは保存して閉じておきます。
参考[テーブルの貼り付け]ダイアログボックスについては、以下の記事で解説しています。
-
テーブル・クエリなどのオブジェクトをコピーして活用する
Accessの1つのデータベース内でテーブルやクエリ、フォーム、レポートなどのオブジェクトをコピーする方法です。 コピーボタンや貼り付けボタ ...
[更新後処理]のデータマクロを作成
マスターテーブル[T_商品]を表示します。
データシートビューでも、デザインビューでもかまいません。
データシートビュー/デザインビューで操作
データシートビューであれば、[テーブル]タブの[イベント後]グループにある[更新後処理]をクリックします。
更新後処理
既存のレコードが変更された後に実行するロジックを作成します。
Update("フィールド名") 関数を使用して、特定のフィールドが変更されたかどうかを判断します。
[Old].[Field Name] を使用して、レコードが変更される前のフィールドの値を検査します。デザインビューで操作する場合は、[テーブルデザイン]タブの[フィールド/レコード/テーブルのイベント]グループにある[データマクロの作成]から[更新後処理]をクリックします。
データマクロアクションの[レコードの作成]を選択
[新しいアクションの追加]の▼ボタンをクリックして、アクションの一覧から[レコードの作成]を選択します。
[アクションカタログ]から選択してマクロウィンドウへ追加する方法もあります。
[レコードの作成]アクションになります。
[レコードの保存先]は、プルダウンから[T_商品更新記録]を選択します。
すぐ下にある[新しいアクションの追加]をクリックして、プルダウンから[フィールドの設定]を選択します。
注意[新しいアクションの追加]が2個並んでいますが、[レコードの保存先]アクションの中にある[新しいアクションの追加]を選択します。ここは、間違えないようにしてください。
[フィールドの設定]の[名前]には、以下のように入力します。[テーブル名]は、保存先のテーブル名です。
[テーブル名] の後ろは、[!](エクスクラメーション)でも構いません。ここでは、以下のようになります。
[フィールドの設定]の[値]には、以下のように入力します。
[o]まで入力すると、入力補助メニューが表示されますので、選択すると効率的です。
[値]は、以下のようになります。
フィールドの設定を追加します。
[新しいアクションの追加]のプルダウンから[フィールドの設定]を選択して、以下のように設定します。
最後に、更新日時を自動で入力したいので、[フィールドの設定]を選択して、名前にテーブル[T_商品更新記録]の[更新日時]を指定します。
[値]には、以下のように入力します。
Now()
マクロアクションの設定が完了したら、上書き保存して、マクロウィンドウは閉じます。
参考同じマクロアクションが続く場合は、コピー&ペーストすると効率的です。
-
マクロツールで既存のアクションをコピーして活用(再利用)するには
Accessでは多くのマクロアクションが使用できます。 しかし、毎回アクションを選択して入力するのは面倒ですね。 マクロアクションは、コピー ...
データマクロ[更新後処理]の動作確認
動作を確認してみます。
マスターテーブル[T_商品]を表示します。1つのレコードを選択して、[価格]を変更します。
商品コード[WTB-101]の価格[390]を[400]に変更して保存します。
テーブル[T_商品更新記録]を表示すると、マスターテーブル[T_商品]変更前のレコードが保存されています。
両方のテーブルを表示している場合は、[ホーム]タブの[レコード]グループにある[すべて更新]をクリックしてみてください。
参考テストとして、レコードを更新して動作を確認した後、オートナンバーを振り直す場合は、以下の方法が簡単です。
-
オートナンバー型の番号の振り直し(切り取りと貼り付けでリセット)
Accessのテーブルでフィールドのデータ型を[オートナンバー型]にして、レコードを削除すると、そのレコードは欠番になります。 以下のテーブ ...
もしくは、レコードをすべて削除して最適化を実行すると、振り直されます。
-
ファイルサイズが大きくなってしまったら[最適化と修復]を実行
Accessのデータベースファイルは、使用していくうちに容量が大きくなっていきます。オブジェクトを編集したり、削除したりする操作を繰り返して ...
データマクロを編集するには
以下は、データマクロ設定後のマスターテーブル[T_商品]のデータシートビューです。
[テーブル]タブを見ると、何の処理をしているかは分かります。
データマクロを作成した時と同じように、ボタンをクリックすると、マクロウィンドウが表示されますのでアクションを追加したり編集することができます。
参考データマクロの編集については、以下の記事も参照していただくと分かりやすいと思います。
以下の記事では、[削除後処理]のデータマクロを作成して、マスターテーブル[T_商品]のレコードを削除した場合、テーブル[T_生産停止商品]へ自動で保存されるようにしています。
-
削除後のレコードを自動で指定テーブルへ保存するデータマクロ
Accessには、テーブルで行った削除や追加、更新などの実行時に、設定した処理を自動で実行してくれる[データマクロ]というのがあります。 こ ...
マスターテーブルに最新の更新日時を表示するには
テーブルの[テーブル]タブには、以下のイベントがあります。以下の画像は、テーブルのデータシートビューです。
[イベント前]グループには[変更前]と[削除前]、[イベント後]グループには[挿入後処理]と[更新後処理]、[削除後処理]があります。
マスターテーブルで変更前のデータを保存するには、[変更前]で設定します。
フィールド[最新更新日時]の追加
マスターテーブル[T_商品]をデザインビューで開いて、以下のようにフィールドを追加します。
フィールド名は[最新更新日時]、データ型は[日付/時刻型]を選択します。
データシートビューに切り替えると、[最新更新日時]フィールドが追加されています。
データマクロ[変更前]を選択して作成
[テーブル]タブの[イベント前]グループにある[変更前]をクリックします。
変更前
レコードを保存する前に実行するロジックを作成します。このロジックでは、変更内容を検証して、新しい値を許可するのか、値を変更するのか、またはエラーを表示して変更を中止するのかを決定します。
[Insert] プロパティを使用して、イベントが挿入なのか更新なのかを判断します。デザインビューにもあります。[データマクロの作成]の[変更前]を選択します。
どちらで操作しても同じです。
[マクロウィンドウ]が表示されます。
[新しいアクションの追加]の▼ボタンをクリックして、[フィールドの設定]を選択します。
[フィールドの設定]の[名前]には、フィルード名を入力します。
[値]には、以下のように入力します。
Now()
データマクロのアクションの設定が終わったら、上書き保存して、マクロウィンドウを閉じます。
動作確認
テーブル[T_商品]をデータシートビューで開いて、変更してみます。
商品コード[WTB-101]の商品名を変更します。
レコードが保存されると同時に、フィールド[最新更新日時]に更新日時が表示されます。
参考テーブル[T_商品更新記録]にも追加されます。
変更前のデータも保存するには
更新日時だけでは、何が更新されたのかが分かりません。
マスターテーブル[T_商品]に変更前のデータを表示することもできます。
ただ、すべてのフィールドのデータを表示すると長くなりますので、必要なデータかどうか判断したほうがいいと思います。
まず、[T_商品]のフィールド[最新更新日時]のデータ型を[短いテキスト]に変更します。文字列を入力できるようにするためです。
分かりやすくするために、ここではフィールド名を[最新更新日時と変更前データ]とします。
データマクロ[変更前]を表示して修正します。
[フィールドの設定]の[名前]は、[最新更新日時と変更前データ] に変更します。
[値]は、以下のように編集します。
データは[&]で繋ぎ、変更前のデータは [Old].[フィールド名] で取得できます。
分かりやすくするために区切り文字として、ここでは["/"]を使用しています。
Now() & "/" & [Old].[価格] & "/" & [Old].[商品名]
商品コード[WTB-101]の価格を変更してみます。
[最新更新日時と変更前データ]フィールドには、以下のように表示されます。
ただ、この場合は、直前のデータのみになります。
履歴として保存したいのであれば、更新記録テーブルを作成して追加していきます。
参考以下の記事では、フォームでの更新を履歴として保存するようにしています。追加クエリを作成して、変更履歴テーブルを作成する方法です。ただ、フォーム以外で更新すると、保存されません。
確実に履歴を保存したいのであれば、テーブルのデータマクロで保存するようにしたほうが確実ですね。
-
追加クエリを使った変更履歴テーブルの作成
追加クエリを使用して、テーブルに変更履歴を残す方法です。 履歴テーブルを作成して、単票フォームの更新日のテキストボックスに更新日を取得するマ ...