今回はAccessのクエリやマクロを使用した際に、
「メモリ不足です。」 と突然エラーコードがでてしまった場合の対処方法を紹介します。
エラーの原因は?どんな状況で発生する?
エラーメッセージが「メモリ」とあるのでパソコンのメモリと勘違いしやすいですが、
原因はクエリやマクロを使用した際に、Accessファイルが2GBを超えてしまうためです。
Accessはファイル全体で最大2GBという制限があります。
私の場合、大規模データを扱うAccessの改修中、
突然「メモリ不足です。」と出て、 以下の対処をすることで解決できました。
<効果のあったこと>
・Accessファイルの最適化
<効果のなかったこと>
・メモリを8GBから16GBに増設
・仮想メモリを付与
・MaxLocksPerFileというトランザクション処理の最大値を変更
・パソコン再起動
・Accessファイルの修復 等
対処方法
今回のエラーの原因が、Accessファイルが2GBを超過することにあるため、
対処方法は以下のファイルサイズ対策になります。
- Accessファイルの最適化(おすすめ!)
(手動・自動による最適化)
Accessファイルを最適化することで、不要な領域を整理する
メリット:簡単で、今まで通り利用できる
デメリット:最適化しても容量が2GBを超える場合対応できない - Accessファイルの分割
Accessファイルのデータを別のAccessファイルに作り、リンクテーブルで連携する。
例)AccessAはAテーブル、AccessBはBテーブル。AccessAからBのリンクテーブルを貼る
メリット:すべてのテーブル容量の合計が2GBを超過しても使用できる
デメリット:個々のテーブル容量が2GBを超過すると使えない - DB構築
SQLServerやPostgresなどDBを構築し、 データはDBからリンクテーブルで利用、編集や更新等はAccessで行う
メリット:テーブルの容量が2GBを超過しても使用できる
デメリット:DB構築は少しハードルが高い
ただ、「メモリ不足です。」エラーが出る場合、単純に最適化ができていないことが多いため、 次項からはAccessファイルの最適化だけに絞って説明します。
Accessファイルの最適化(手動)
手動で最適化する方法です。
最適化は数分程度かかることもあるため、ユーザーの都合のいいときに最適化できます。
デメリットは意識的に行わないとならないことです。
方法は、「ファイル」→「情報」から、「データベースの最適化/修復」を選択するだけです。
押すと、最適化が開始され、右下にメッセージが現れます。
Accessファイルの最適化(自動)
自動で最適化する方法です。
Accessファイルを閉じる際に、毎回最適化されるのでユーザーは意識せず最適化できます。
デメリットとしては、毎回最適化に時間がかかることや、
複数ユーザーで頻繁に使用すると破損するリスクがあるため、あまり使用しない方がいいという意見もあります。
方法は、「ファイル」→「Accessのオプション」から、「閉じるときに最適化する」を選択するだけです。
備考:「メモリ不足です。」エラーを再現するには
まず、以下のコードを実行して、2GB弱のデータを作ります。
(コード自体は2GB以上作ろうとするので、処理の途中でAccessが固まる or エラーになります)
コードは、「Microsoft Docs:Access テーブルで操作を実行すると、”ディスク領域またはメモリが足りない” というエラーが発生する」を参考にしています。
Sub CreateBigTable()
Dim db As Database, rs As Recordset
Dim iCounter As Long, strChar As String
Set db = CurrentDb
db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
"Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
dbFailOnError
Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
iCounter = 0
strChar = String(255, " ")
While iCounter <= 100000000
rs.AddNew
rs!ID = iCounter
rs!Field1 = strChar
rs!Field2 = strChar
rs!Field3 = strChar
rs!Field4 = strChar
rs.Update
iCounter = iCounter + 1
Wend
MsgBox "Done!"
End Sub
次に、できたテーブルを使用してクエリを作成し、動作させると 「メモリ不足です。」のエラーが再現できます。