
CVE-2019-1402 で MS Access に導入された Query is corrupt エラーに対する最新の回避策です。
他にも管理者レベルで適用する必要がある回避策(誤った更新プログラムのアンインストールなど)がありますが、ここで提供するものは、可能な限り手間をかけずに MDB/ACCDB の内容自体を自動的に変更することで機能することを目的としています。
マイクロソフトは 2019 年 12 月 10 日(パッチデー)にこの問題の修正をリリースしており、これは WSUS などを介してデフォルトで自動インストールされます。したがって、この回避策は修正が適用された後は不要になるはずであり、これを使用した人は RemoveWorkaroundForCorruptedQueryIssue() 関数を呼び出して元のアプリケーション状態に戻すことができます。
VBA エディターの [ツール] -> [参照設定] で、Microsoft DAO 3.6 Object Library(下位互換性)または Microsoft Office x.x Access Database Engine Object Library の参照が有効になっていることを確認してください(詳細は #1 を参照)。
basWorkaround.bas モジュールを使用して、マイクロソフトが推奨する回避策(テーブルの代わりにクエリを使用)を自動的に実装します。念のため、最初にデータベースをバックアップしてください。
AddWorkaroundForCorruptedQueryIssue() を呼び出して回避策を適用し、RemoveWorkaroundForCorruptedQueryIssue() を呼び出していつでも元に戻せます。
AddWorkaroundForCorruptedQueryIssue() は、すべての非システムテーブルに接尾辞 _Table を追加します。たとえば、テーブル IceCreams は IceCreams_Table に名前が変更されます。
また、元のテーブル名を持つ新しいクエリを作成し、名前変更されたテーブルのすべての列を選択します。この例では、クエリの名前は IceCreams で、SQL select * from [IceCreams_Table] を実行します。
RemoveWorkaroundForCorruptedQueryIssue() は逆の操作を行います。
私はこの回避策を、SQL Server のような外部の非 MDB テーブルを含む、あらゆる種類の 400 以上のテーブルを持つ大規模プロジェクトで使用しています。
私の場合、USysRibbons_Table を手動で USysRibbons に戻す必要がありました。過去に作成したときにシステムテーブルとしてマークしていなかったためです。
以下の点に注意してください。
TableDefs!MyTableName のようなステートメントを明示的に使用している場合、コードや UI 内の該当箇所を検索して置換する必要があります)。