突然の停止。原因は「データの量」ではありません
今まで動いていたAccessが、ある日突然「エラー3048」で止まる。
閉じ直せば動くこともあるけれど、すぐにまた再発する。
「データが増えすぎたせい?」と思われがちですが、実はこれ、Accessが「もうRecordsetを回しきれない!」と悲鳴を上げているサインです。
なぜエラー3048が出るのか?
技術的な原因: Accessには同時に開けるテーブルやクエリの数(テーブルハンドル)に上限(2048個)があります。
よくあるミス: VBAでRecordsetをOpenしたあと、処理が終わるたびにCloseしていない。
ループの罠: 1万件のデータに対してループの中でRecordsetを開き続けると、一瞬で上限に達してフリーズします。
【応急処置】とりあえず動かすためのチェックリスト
rs.CloseとSet rs = Nothingを、すべてのループの終わりに入れていますか?- 呼び出し元の関数が、開いたまま放置されていませんか?
プロの視点: 確かにこれでエラーは消えます。しかし、「1件ずつ処理する」という非効率な構造が残ったままでは、根本解決とは言えません。
【根本解決】SQLへの「書き換え」が必要な理由
そもそも、1万回Recordsetを開閉すること自体が、Accessにとって大きな負担です。
プロの処方箋: 1万回のループを捨てて、1本の「更新クエリ(SQL)」に書き換えます。
これにより、同時に使うハンドル数は「1つ」になり、エラー3048は物理的に発生しなくなります。さらに、速度は数十分から数秒へと劇的に改善します。
まとめ:エラー3048は「システム刷新」のチャンス
エラーが発生するのは、そのツールが次のステージ「再設計」を必要としている証拠です。
場当たり的な修正で凌ぎ続けるか、この機会に「二度と止まらない高速Access」に生まれ変わらせるか。
20年のキャリアを持つわたしが、リファクタリング(最適化)し、安定した業務環境を取り戻します。
「エラー3048を消すだけでなく、業務の停滞も消しませんか?」
わたしの高速化リファクタリングサービスでは、こうしたエラーの根本原因を排除し、「止まらない・迷わない・速い」Accessに作り替えます。
「自分のコードのどこが悪いのか分からない」「前任者のコードを直すのが怖い」という方は、まずは無料のコード診断からお気軽にご相談ください。



