問題の状況
大容量の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ビット版はより多くのメモリを使用できますが、それでも以下の状況では限界に達します:
- 数十万行と多数の数式列を持つファイル
INDIRECT、OFFSET、NOW()、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)

