エラーの内容
作業の途中で — 50万行のソート、ピボットの更新、複数シートにまたがるVLOOKUPの実行中 — Excelが次のエラーをスローします:
Excel cannot complete this task with available resources. Choose less data or close other applications.
すぐに失敗することもあれば、Excelが2分間フリーズしてからクラッシュすることもあります。いずれにせよ作業は止まり、ダイアログには何を修正すればよいか一切書かれていません。
発生原因
ExcelがRAM、アドレス空間、またはGDIオブジェクト数の上限に達しました。主な原因は次のとおりです:
- 32ビット版Excel:マシンのRAM搭載量に関係なく、約2GBのRAMに制限されています。30万行とFormulasを含むワークブックはすぐにこの上限に達します。
- 大規模な揮発性関数:
INDIRECT、OFFSET、NOW()、RAND()— これらはそれらを使用するすべてのセルで、キーストロークのたびに再計算されます - 膨大な範囲にわたるレガシー配列数式:10万行以上のCSE配列は不釣り合いにメモリを消費します
- 複数の大きなワークブックを同時に開く:同一インスタンス内のすべてのExcelワークブックは1つのメモリプールを共有します
- 過剰な書式設定:データセルだけでなく列全体を書式設定すると、Excelは100万セル以上の書式状態を追跡しなければならなくなります — 静かなメモリキラーです
- 最適化されていないPower Queryのステップ:フィルタリングより前に完全なテーブルをメモリに読み込んでしまっている
修正1:64ビット版Excelに切り替える(最も効果的)
大量データに対して32ビット版Excelを使用していることが最も一般的な根本原因です — 修正は一度だけの再インストールで済みます。
まずバージョンを確認してください:
File → Account → About Excel
ダイアログに「32ビット」または「64ビット」と明示されています。32ビットの場合:
- 設定 → アプリから現在のOfficeをアンインストールする
- MicrosoftアカウントまたはボリュームライセンスポータルからOffice 64ビットインストーラーをダウンロードする
- 64ビット版Officeをインストールする
注意点:古い32ビットCOMアドインやXLLプラグインは64ビット版で動作しなくなる場合があります。再インストール前に、ファイル → オプション → アドインで使用しているアドインを確認してください。
修正2:手動計算モードに切り替える
編集中または貼り付け中にクラッシュしますか?自動再計算がほぼ確実に実行されてメモリを使い果たしています。
Formulas → Calculation Options → Manual
ExcelはF9を押すまで再計算を停止します。すべての編集を行い、準備ができたら一度だけ再計算を実行します。必要に応じてその後「自動」に戻してください。
メニュー操作ができないほどExcelがフリーズしている場合は、VBAで実行します:
Application.Calculation = xlCalculationManual
' ... 作業を行う ...
Application.Calculation = xlCalculationAutomatic
修正3:他のワークブックとアプリケーションを閉じる
同一Excelインスタンスで開いているすべてのワークブックは同じメモリプールを使用します。不要なものは閉じましょう。
- 現在作業していないワークブックをすべて閉じる
- Chromeのタブ、Slack、Teamsを終了する — ビデオ通話だけで500MB以上消費することがあります
- タスクマネージャー(
Ctrl+Shift+Esc)を開き、「詳細」タブでExcelのメモリ使用量を確認する
複数の大きなワークブックを同時に開く必要がありますか?それぞれ別のExcelインスタンスで起動してください — それぞれが独自のメモリ空間を持ちます:
Start → Excel (hold Alt while clicking a second file to open in new instance)
またはコマンドラインから:
excel.exe /x
修正4:揮発性関数を見つけて置き換える
揮発性関数は見た目以上にコストがかかります。5万個のセルで使われている数式の中にINDIRECTが1つネストされているだけで、キーストロークのたびに5万回の再計算が発生します。
揮発性関数を含むすべてのセルを強調表示するマクロを使用してください:
Sub FindVolatile()
Dim cell As Range
Dim volatileFuncs As Variant
volatileFuncs = Array("INDIRECT", "OFFSET", "NOW", "TODAY", "RAND", "RANDBETWEEN")
For Each cell In ActiveSheet.UsedRange
If cell.HasFormula Then
Dim f As String
f = UCase(cell.Formula)
Dim v As Variant
For Each v In volatileFuncs
If InStr(f, v) > 0 Then
cell.Interior.Color = RGB(255, 200, 0)
End If
Next v
End If
Next cell
End Sub
次に、最も問題のある箇所を非揮発性の代替関数に置き換えます:
INDIRECT("Sheet1!A"&ROW())→ 動的参照を完全に避けるようにデータを再構成するOFFSET(A1, n, 0)→INDEX(A:A, n+1)で同じことができ、再計算をトリガーしません- 計算式内の
TODAY()/NOW()→ 静的な値として貼り付け、必要なときに手動で更新する
修正5:過剰な書式設定を整理する
これは多くの人が見落とします。列全体を選択して「太字」にしたり、背景色を変えたりします。するとExcelはその列の全1,048,576セル分の書式データを格納しなければなりません — 空のセルも含めて。
Excelが実際に使用範囲をどこまでと認識しているか確認します:
' VBAイミディエイトウィンドウで (Alt+F11 → Ctrl+G)
Debug.Print ActiveSheet.UsedRange.Address
データが5,000行までしかないのに$A$1:$XFD$1048576と返ってくる場合は、書式設定の問題があります。
3つのステップで修正します:
- 実際のデータを超えるすべての行と列を選択する
ホーム → クリア → すべてクリア- ファイルを保存してファイルサイズを確認する — 45MBから8MBへの減少も珍しくありません
組み込みツールを使いたい場合は、Inquireアドイン(Excel 2013以降)に専用の余分なセルの書式設定をクリーンアップオプションがあります。
修正6:Power Queryを最適化する
Power Queryのエラーはたいてい1つのことに起因します:フィルタリングがクエリの後半で行われている。Excelはまず完全なテーブルをメモリに読み込んでから削減します — 最終的に捨てるデータのためにRAMを無駄にしています。
フィルタリングのステップをクエリの先頭に移動します:
// 修正前(すべてを読み込んでからフィルタリング)
let
Source = Excel.Workbook(...),
AllData = Source{[Name="Data"]}[Data],
Filtered = Table.SelectRows(AllData, each [Year] = 2024)
in
Filtered
// 修正後(早期フィルタリング = 必要な行だけメモリに)
let
Source = Excel.Workbook(...),
AllData = Source{[Name="Data"]}[Data],
TypedYear = Table.TransformColumnTypes(AllData, {{"Year", Int64.Type}}),
Filtered = Table.SelectRows(TypedYear, each [Year] = 2024)
in
Filtered
また、大規模なクエリのバックグラウンド更新を無効にしてください — 作業中に静かにメモリを消費します:
Data → Queries & Connections → right-click query → Properties → uncheck "Enable background refresh"
修正7:大規模なデータセットをシートの外に移動する
20万行を超えると、Excelのグリッドはデータ処理に適した場所ではありません。より優れた3つの選択肢があります:
- Power Pivot:列指向圧縮によって数千万行を処理できます。
ファイル → オプション → アドイン → COMアドイン → Microsoft Office Power Pivotで有効にします。 - Power Query + データモデル:シートに直接貼り付けるのではなく、データモデルにデータを読み込む
- PythonまたはSQLで事前集計:インポート前に集計する — Excelには生データではなく結果だけを渡す
100万行のCSVを扱いやすいサマリーに変換するPythonの簡単な例:
import pandas as pd
df = pd.read_csv('large_dataset.csv')
summary = df.groupby(['region', 'product']).agg({'sales': 'sum', 'units': 'count'})
summary.to_excel('summary_for_excel.xlsx', index=False)
修正8:仮想メモリを増やす(Windows)
ハードウェアのアップグレードが常に選択肢にあるわけではありません。本当にRAMが不足している場合、Windowsのページファイルを増やすことでExcelに余裕が生まれます — 実際のRAMよりは遅いですが、ハードクラッシュを防げます。
Win+R→sysdm.cpl→ 詳細設定 → パフォーマンスの設定 → 詳細設定 → 仮想メモリ- 「自動的に管理する」のチェックを外す
- 初期サイズを
RAM容量(MB)× 1.5、最大サイズをRAM容量(MB)× 3に設定する(例:8GB RAMなら初期12288MB / 最大24576MB) - 「設定」→「OK」→ 再起動
確認
クラッシュした時と全く同じ操作を再現します — 同じソート、同じピボットの更新、同じ数式。実行中に:
- タスクマネージャーでExcelのメモリ使用量を確認する。利用可能なRAMの80%以下に収まっていれば良好です。
- 自動計算を無効にしていた場合は元に戻す:
数式 → 計算方法の設定 → 自動 - 保存後のファイルサイズを確認する。大幅な減少(例:45MB → 8MB)は過剰な書式設定が正常にクリーンアップされた証拠です。
予防策
- データが多い作業には64ビット版Excelを使用する。32ビットに留まる正当な理由はありません。
- 書式設定はデータセルのみに行う — 行や列全体には設定しない
- 大きな範囲では
VLOOKUPよりXLOOKUPまたはINDEX/MATCHを使う。データに明確な範囲がある場合、A:Aのような列全体参照は避ける。 - ソースデータはシートに直接置かず、Power QueryまたはデータモデルThrough管理する
- 長期間使用しているワークブックでは定期的にInquire → 余分なセルの書式設定をクリーンアップを実行する
- 1つの巨大なワークブックを維持するのではなく、年別・地域別にファイルを分割する

