上級: 専門的なコーディング、相互運用性、およびマルチユーザースキルが必要です。この資料は、Access データベース (.mdb) にのみ適用されます。

現象

データ アクセス オブジェクト (DAO) LastUpdatedプロパティは、Access のフォーム、レポート、マクロ、およびモジュールの日付/時刻を誤って返します。

原因

Access 固有のオブジェクト (フォーム、レポート、マクロ、およびモジュール) の変更については、Jet データベース エンジンに通知しません。したがって、MSysObjectsテーブルの[日付の更新]列が正しい日付と時刻に更新されることはありません。同じ動作は、Access データベース エンジンを使用する Access 2007 にも当てはまります。

状態

マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として確認しています。

詳細情報

DAO が提供するLastUpdatedプロパティは、データベース エンジン オブジェクト (テーブル、クエリ、およびリレーションシップ) の正しい日付/時刻を返しますが、Access 固有のオブジェクト (フォーム、レポート、マクロ、およびモジュール) の最終更新日ではなく、作成日のみを返します。Access 2000 より前のバージョンでは、Jet データベース (.mdb) ファイルを使用して、データベース オブジェクト (テーブル、クエリ、およびリレーションシップ) と Access 固有のオブジェクト (フォーム、レポート、マクロ、およびモジュール) の両方が格納されました。Access では、その特定のオブジェクト、特に MSysObjects テーブルと MSysModules (または MSysModules2) テーブルに格納されています。MSysObjects テーブルのDateUpdate列は、オブジェクトの最終変更日を格納し、DAO LastUpdatedプロパティがオブジェクトの最終更新日を返すために使用する列です。ユーザーが以前のバージョンでオブジェクトを変更して保存すると、Jet データベース エンジンにオブジェクトが変更されたことが通知され、Jet はDateUpdate列を現在の日付と時刻に更新しました。Access 2000 では、Jet データベース エンジンを使用せずに SQL Server データベースに直接接続できる Access プロジェクト (.adp) ファイルが導入されました。ADP ファイルは Jet データベース エンジン (または Access データベース エンジン) を使用しないため、Access 固有のオブジェクトに対して Jet データベースで以前に使用されていたのと同じストレージ形式を使用できませんでした。Jet データベースと Access プロジェクトの両方でアクセスできる新しい OLE ドキュメントストレージ形式で格納する必要がありました。ユーザーがフォームなどの新しい Access 固有のオブジェクトを最初に作成したときでも、データベース エンジンは MSysObjects テーブルの[日付の作成]列と [日付の更新]列に現在の日付と時刻を入力します。ただし、ユーザーがオブジェクトを変更して保存しても、データベース エンジンは通知されません。したがって、日付の更新列は常に同じままです。また、Access 2007 または Access 2010 のデータベース ウィンドウとナビゲーション ウィンドウに、オブジェクトの最終変更の日時が正しく表示されている場合があります。これは、データベース エンジンに関係なく、作成日と変更日を格納するために独自の内部メカニズムが使用されるためです。残念ながら、この情報はオブジェクト モデルに公開されません。したがって、Access でこの情報を取得するプログラムによる方法はありません。

現象の再現手順

  1. Access を起動し、新しい空のデータベースを作成します。

  2. デザイン ビューで新しい空白のフォームを作成します。

  3. フォームにテキスト ボックスを追加します。

  4. フォームをfrmLastUpdatedとして保存し、閉じます。

  5. Access 2003 以前のバージョンの Access では、[表示]メニューの [詳細]をクリックします。Access 2007 または Access 2010 で、左側のナビゲーションウィンドウの[カテゴリ]ヘッダーを右クリックし、[詳細で表示]をクリックします。これにより、各オブジェクトの更新日と作成日が表示されます。frmLastUpdated フォームの[更新日時]列と [作成日時] 列の両方が同じ日付と時刻に設定されることに注意してください。

  6. Ctrl キーを押しながら G キーを押して、Visual Basic エディタでイミディエイト ウィンドウを開きます。(Access 2007 または Access 2010 では、最初にコンテンツを有効にするか、データベースが信頼できる場所にある必要があります)。

  7. イミディエイト ウィンドウに次の行を入力し、Enter キーを押します。

    ?CurrentDb.Containers("Forms").Documents("frmLastUpdated").LastUpdated

    返される日付と時刻は、データベース ウィンドウの [更新日時]列と [作成日時]列に対応していることに注意してください。

  8. Alt キーを押しながら F11 キーを押して、Access に戻します。

  9. デザイン ビューで frmLastUpdated フォームを開きます。

  10. フォームに 2 番目のテキスト ボックスを追加し、保存して閉じます。データベース ウィンドウの [更新日時]列には、フォームの更新された日付と時刻が含まれていることに注意してください。

  11. 手順 7 と 8 を繰り返します。

メモLastUpdatedプロパティは、データベース ウィンドウの [更新日時]列に表示される新しい日付と時刻ではなく、元の日付と時刻を返します。

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?

ご意見をいただきありがとうございます。

×