Accessでちょっと冷や汗もののトラブルが発生したので記録。
いろいろ業務上のデータを整理するために作っているAccess 2010のシステムを、業務の都合上テーブルの一部や機能に結構手を入れる作業をしていると、突然Accessがクラッシュ。 モジュールを開こうとすると間違いなくクラッシュするご様子。
こう言うのは、Access97の頃からごくたまに発生していましたね。モジュールに限らずフォームなども 、何かの拍子に突然壊れてしまい、デザインですら開けなくなります。 こういう場合は、 新しいMDB(ACCDB)を作って、壊れたオブジェクト以外をインポートするなどしてリカバリしてきました。まあ、壊れたオブジェクトが結構力作だったりすると涙目になるわけですが、そこはもうAccessとのつきあいも足かけ15年にもなろうかというわたくしですから、ファイルを定期的にバックアップをとるなどして、そこからサルベージするなどすればなんとかなるわけです。
でも、今回のはなんかおかしい。
- モジュールを開こうとするとクラッシュ
- 新規のモジュールもクラッシュ
- Visual Basic Editorを開こうとするとクラッシュ
- 壊れたACCDBからモジュールをエクスポート/インポートするとクラッシュ
- 壊れたACCDBからフォームをエクスポート/インポートするとクラッシュ
- テーブルやクエリはインポート/エクスポートも大丈夫
- 壊れたACCDBでフォームを開くのは大丈夫 というなんだか重傷気味の動きで、今までやってきた方法ではリカバリができないというかなりやばい状況に陥りました。 もう、サラから作り直す、なんていうレベルじゃなくなってるので、とりあえず落ち着いて別のことをやってから回避策を探してみました。トラブル解決は焦るとダメです。
何回もクラッシュさせてみて、VBAに絡むようなオブジェクトを操作しようとすると落ちているようですし、さらに特定のオブジェクトが壊れているわけではないという感じです。クラッシュしたときに出るダイアログには、どのモジュール(Accessのモジュールではない)で落ちたのかが表示されるのですが、常に「VBA7.dll」というやつが落ちているようです。
こういう場合は、とりあえずそのまま「VBA7.dll」でGoogle先生に聞いてみると早いでしょう。 検索結果の最初のページぐらいのサマリをみれば、どの程度情報があるかわかりますね。
この辺がどんぴしゃです。 「Office 2010 SP1を入れた後データベースを開いたりVBAウインドウが開くとき不定期にクラッシュする 」って感じですね。 解決策は、コマンドラインからACCDBを「/decompile」オプションをつけて開く、ということらしいです。
無事解決しました。めでたしめでたし。
な、わけないでしょ。
SP1入れたせいでいちいち「ランダムに」こんなことになったら、おちおち触れないでしょ。 何でそうなるかの背景は、Office 2010 SP1でAccess2010が壊れる現象についてで分析してくれていますが、根本的な解決策は「SP1を入れない」ぐらいですかね。 困ったもんです。
で、どうも/decompileをしたACCDB以外でも現象が出なくなりました。 ということはACCDBファイル自体に問題があるわけじゃないような気がします。 いろいろ引きずりそうですな……