今回は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
次に、できたテーブルを使用してクエリを作成し、動作させると 「メモリ不足です。」のエラーが再現できます。
 
  
  
  
  
