大容量ファイルで発生するExcel「この操作を完了するためのメモリが不足しています」エラーの解決方法

intermediate📊 Microsoft Excel2026-03-18| Microsoft Excel 2016/2019/2021/365、Windows 10/11、macOS 12+

Error Message

There isn't enough memory to complete this action. Try using less data or closing other applications.
#excel#メモリ#パフォーマンス#大容量ファイル

問題の状況

大容量のExcelファイルを開いたとき——20万行の売上レポート、複数シートを集計するピボットテーブル、数十列にわたる重い数式が含まれたブックなど——Excelがフリーズして次のエラーをスローします:

There isn't enough memory to complete this action. Try using less data or closing other applications.

編集中に発生することもあれば、開いた瞬間に起きることもあります。ファイルサイズが50MBの場合もあれば、10MB未満でも揮発性数式が詰め込まれていることもあります。いずれにせよ、Excelのワーキングメモリが不足している状態です。

原因

Excelは再計算のたびにワークブック全体をRAMに読み込みます。一部のOfficeインストールにまだバンドルされている32ビット版は、マシンのRAMがどれほど多くても2GB RAMに固定上限があります。64ビット版はより多くのメモリを使用できますが、それでも以下の状況では限界に達します:

  • 数十万行と多数の数式列を持つファイル
  • INDIRECTOFFSETNOW()RAND()などの揮発性関数——キーを押すたびに再計算される
  • 計算フィールドが多い大型ピボットテーブル
  • 列全体に適用された条件付き書式ルール
  • ファイルサイズを膨らませる埋め込み画像、グラフ、OLEオブジェクト

応急処置(まずこれを試してください)

1. Excelのビット数を確認する

ファイル → アカウント → Excelのバージョン情報に移動します。32ビットと表示されていれば、それが原因です。Officeをアンインストールして、今度は64ビットオプションを選択して再インストールしてください。

どちらかわからない場合は、PowerShellで確認できます:

# パスに "Program Files (x86)" が含まれている場合は32ビット版
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Office\*\Excel\InstallRoot" | Select-Object PSPath

2. RAMを解放し仮想メモリを拡張する

ファイルを再度開く前に、Chrome、Slack、その他の重いアプリを閉じてください。次にWindowsの仮想メモリを増やします:

  • Win + Rを押し、sysdm.cplと入力してEnterを押す
  • 詳細設定 → パフォーマンス → 設定 → 詳細設定 → 仮想メモリ → 変更に移動
  • 自動的に管理するのチェックを外し、初期サイズを4096、最大サイズを8192に設定(ディスク容量があればより大きくてもよい)
  • 設定 → OK → 再起動をクリック

3. 手動計算に切り替える

ファイルを開く前にExcelを手動計算に設定します。これにより、ファイルを読み込んだ瞬間に数万の数式が再計算されるのを防ぎます:

// ファイル → オプション → 数式 → 計算方法の設定 → 手動
// その後でファイルを開く

またはVBAイミディエイトウィンドウ(Ctrl+G)に貼り付けます:

Application.Calculation = xlCalculationManual

実際に再計算が必要なときはF9を押してください。

根本的な解決策

4. 揮発性数式を見つけ出す

INDIRECTは最も問題のある関数で、変更のたびにワークブック全体の再計算を強制します。可能な限り、直接セル参照に置き換えてください。

Ctrl+Fを押し、=INDIRECTを検索して、それぞれを固定参照に置き換えます。すべてのシートにわたる揮発性関数を一度に見つけるには、次のマクロを実行します:

Sub FindVolatileFunctions()
    Dim ws As Worksheet
    Dim cell As Range
    Dim volatiles As Variant
    Dim v As Variant
    
    volatiles = Array("INDIRECT", "OFFSET", "NOW", "TODAY", "RAND", "RANDBETWEEN")
    
    For Each ws In ThisWorkbook.Worksheets
        For Each cell In ws.UsedRange
            If cell.HasFormula Then
                For Each v In volatiles
                    If InStr(cell.Formula, v) > 0 Then
                        Debug.Print ws.Name & "!" & cell.Address & ": " & cell.Formula
                    End If
                Next v
            End If
        Next cell
    Next ws
End Sub

5. 条件付き書式の適用範囲を絞り込む

$A:$Aのような列全体に適用されたルールは、気づかないうちにメモリを大量消費します。データが500行しかなくても、Excelは100万行以上にわたってそれを評価します。

まず、状況がどれほど深刻かを確認します:

Sub CleanConditionalFormatting()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Debug.Print ws.Name & ": " & ws.Cells.FormatConditions.Count & " 件のルール"
    Next ws
End Sub

次にホーム → 条件付き書式 → ルールの管理に移動し、列全体を参照しているルールを絞り込みます。$A:$A$A$2:$A$50000のように変更してください。

6. 静的な数式を値に変換する

変化することのない数式は計算サイクルを無駄にしているだけです。値として固定しましょう:

  • 範囲を選択する
  • Ctrl+Cでコピー
  • Ctrl+Shift+V → 形式を選択して貼り付け → 値

アクティブシート全体を一度に処理するには:

Sub ConvertFormulasToValues()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    ws.UsedRange.Value = ws.UsedRange.Value
End Sub

7. 生データと分析を分離する

20万行の生データとピボットテーブルを同じワークブックに保存することはトラブルの原因です。分離しましょう:

  • 生データを専用のdata.xlsxに保存する
  • Power Query(データ → データの取得 → ファイルから)を使って分析ワークブックに取り込む
  • Power Queryは遅延読み込みを行い、直接シート参照よりも大規模データセットをはるかに効率的に処理できる

8. 幽霊行と列を削除する

古いExcelファイルには隠れた不要データが蓄積されます——Excelが追跡し続ける空の行、削除されたデータの書式が残ったもの、理由もなく1,048,576行目まで延びている列など。このマクロでそれらを見つけて削除します:

Sub ReduceFileSize()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long
    
    For Each ws In ThisWorkbook.Worksheets
        lastRow = ws.Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        lastCol = ws.Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        
        If lastRow < ws.Rows.Count Then
            ws.Rows(lastRow + 1 & ":" & ws.Rows.Count).Delete
        End If
        
        If lastCol < ws.Columns.Count Then
            ws.Columns(lastCol + 1 & ":" & ws.Columns.Count).Delete
        End If
    Next ws
    
    ' xlsxとして保存すると古い互換性オーバーヘッドが除去される
    ThisWorkbook.SaveAs ThisWorkbook.FullName, xlOpenXMLWorkbook
End Sub

確認手順

Excelを完全に閉じてからファイルを再度開いてください。次のチェックリストを確認します:

  • メモリエラーが発生せずにファイルが読み込まれる
  • ファイルサイズの確認:右クリック → プロパティ。適切に最適化された20万行のファイルは20MB未満のはず
  • ファイルを開いた状態でタスクマネージャー(Ctrl+Shift+Esc)を開く——典型的な大容量ワークブックでは、Excelのメモリ使用量が500MB未満であること
  • Ctrl+Alt+F9で強制的に完全再計算を実行。エラーが出なければ完了
  • ファイル → オプション → 数式を確認——計算時間は分ではなく秒であること

Excelでは処理しきれない場合

データセットによっては、スプレッドシートには本当に大きすぎるものもあります。そういった場合は、Excelと戦うのをやめて、その用途に適したツールを使うのが正解です:

  • Python + pandas:数百万行のデータを楽々処理できる
  • DuckDB:CSVやParquetファイルに直接SQLを実行できる——分析に驚くほど高速
  • Power BI:大規模データセットの可視化に特化して設計されている
# 必要な列のみを読み込む——メモリ使用量を大幅に削減できる
import pandas as pd

df = pd.read_excel('large_file.xlsx', 
                   usecols=['Date', 'Sales', 'Region'],
                   engine='openpyxl')

result = df.groupby('Region')['Sales'].sum()
print(result)

Related Error Notes