Excelが重いときの原因と軽くする方法
入力するたびに「計算中」で固まる、スクロールがカクカクする。重いブックには、だいたい決まった原因があります。上から順に確認すれば、ほとんどのブックは軽くなります。
更新日:2026年10月29日
1. Excel が重くなる主な原因
- 条件付き書式が増えすぎている:コピーや行の挿入をくり返すうちに、同じルールが何百個にも分かれる
- 使っていない範囲が広がっている:データは100行なのに、Excel は10万行目まで「使っている」と思っている
- 揮発性関数が多い:OFFSET・INDIRECT・TODAY などは、どこかを1か所変えるたびに毎回計算し直される
どれが原因かわからないときは、5章の VBA でシートごとに数を出すと、当たりをつけられます。
2. 増えすぎた条件付き書式を整理する
条件付き書式が付いた行をコピーしたり、行を挿入・削除したりすると、Excel はルールを適用先ごとに分けてコピーします。気づかないうちに、同じルールが何十個、何百個にもなります。
- 「ホーム」タブ→「条件付き書式」→「ルールの管理」を開きます。
- 上の「書式ルールの表示」で「このワークシート」を選びます。
- 同じ数式・同じ書式のルールが並んでいたら、1つだけ残して、その「適用先」を表全体(例:
=$B$2:$M$500)に書き直します。 - 残りの同じルールを選んで「ルールの削除」を押し、OK を押します。
ルールが多すぎて整理できないときは、「条件付き書式」→「ルールのクリア」→「シート全体からルールをクリア」で全部消してから、必要なルールだけを作り直すほうが早いこともあります。
3. 使っていない範囲を削除する
Ctrl+End を押すと、Excel が「ここまで使っている」と思っている最後のセルへ移動します。データの最後よりはるか下や右に飛んだら、その間の空のセルにも書式などが残っていて、ファイルが大きく重くなっています。
- データの最後の行の1つ下の行番号をクリックします。
- Ctrl+Shift+↓ で、シートの最後の行まで選びます。
- 行番号の上で右クリック→「削除」を選びます(Delete キーで中身を消すだけでは足りません)。
- 列も同じように、データの最後の列の1つ右の列番号をクリックし、Ctrl+Shift+→ で選んで削除します。
- 上書き保存します。保存すると、Ctrl+End の位置がデータの最後に戻ります。
4. 揮発性関数(OFFSET・INDIRECT など)を減らす
ふだん Excel は、変えたセルに関係する数式だけを計算し直します。ところが次の関数はどこを変えても毎回計算し直され、それを参照している数式もすべて計算し直されます。
OFFSET・INDIRECT・NOW・TODAY・RAND・RANDBETWEEN・RANDARRAY・CELL・INFO
数式の中から探すには、Ctrl+F→「オプション」で、「検索場所」を「ブック」、「検索対象」を「数式」にして、OFFSET( や INDIRECT( を「すべて検索」します。
| よくある使い方 | 置き換え方 |
|---|---|
OFFSET で、行が増えても合計範囲が伸びるようにしている | 表をテーブルにして =SUM(売上[金額]) のように列名で参照します。テーブルにできないときは =SUM(B2:INDEX(B:B,行数)) のように INDEX を使います(INDEX は揮発性ではありません) |
INDIRECT で、シート名を切り替えて集計している | 月別・支店別などに分かれたシートを、「月」や「支店」の列を足した1つの表にまとめ、SUMIFS や XLOOKUP で集計します |
たくさんのセルで TODAY() を使っている | 提出用の資料なら、基準日を1つのセルに日付で入力し、ほかの数式はそのセルを参照します。あとで開いても数字が変わらないので、見直しもしやすくなります |
RAND で作ったテスト用の数字が残っている | 範囲をコピーして「値の貼り付け」で数字に変えます |
揮発性関数が数個あるだけなら、重さにはほとんど影響しません。何千個もの数式が参照しているときに効いてきます。
5. VBA で、シートごとに原因を数える
ブックのすべてのシートについて、条件付き書式のルールの数・Excel が使っていると思っている範囲・データが入っている範囲・揮発性関数を使った数式の数を、新しいシートに一覧にします。数えるだけで、ブックの中身は変えません。
Option Explicit
' シートごとに「重くなる原因」を数えて、新しいシートに一覧にする(数えるだけで、何も変えない)
Sub CheckHeavySheets()
Dim wb As Workbook, ws As Worksheet, out As Worksheet, r As Long
Dim lastR As Range, lastC As Range, f As Range, c As Range, vol As Long
Set wb = ActiveWorkbook
Set out = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
out.Range("A1:E1").Value = Array("シート", "条件付き書式のルール", _
"Excel が使っている範囲の最後", "データの最後", "揮発性関数を使った数式")
r = 2
For Each ws In wb.Worksheets
If Not ws Is out Then
out.Cells(r, 1).Value = ws.Name
out.Cells(r, 2).Value = ws.Cells.FormatConditions.Count
With ws.UsedRange
out.Cells(r, 3).Value = ws.Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1).Address(False, False)
End With
Set lastR = ws.Cells.Find("*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set lastC = ws.Cells.Find("*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
If lastR Is Nothing Then
out.Cells(r, 4).Value = "(空)"
Else
out.Cells(r, 4).Value = ws.Cells(lastR.Row, lastC.Column).Address(False, False)
End If
vol = 0
Set f = Nothing
On Error Resume Next ' 数式が1つもないシートではエラーになるため
Set f = ws.UsedRange.SpecialCells(xlCellTypeFormulas)
On Error GoTo 0
If Not f Is Nothing Then
For Each c In f
If IsVolatile(c.Formula) Then vol = vol + 1
Next c
End If
out.Cells(r, 5).Value = vol
r = r + 1
End If
Next ws
out.Columns("A:E").AutoFit
MsgBox "結果を「" & out.Name & "」シートに書き出しました。", vbInformation
End Sub
Private Function IsVolatile(ByVal fm As String) As Boolean
Dim fn As Variant
fm = UCase(fm)
For Each fn In Array("OFFSET(", "INDIRECT(", "NOW(", "TODAY(", "RAND(", _
"RANDBETWEEN(", "RANDARRAY(", "CELL(", "INFO(")
If InStr(fm, fn) > 0 Then IsVolatile = True: Exit Function
Next fn
End Function結果の見かた
- 条件付き書式のルールが数十以上あるシートは、2章の方法で整理します。
- 「Excel が使っている範囲の最後」が「データの最後」よりはるか下や右(例:
XFD1048576とM120)なら、3章の方法で削除します。 - 揮発性関数を使った数式が多いシートは、4章の表を見て置き換えを検討します。
使い方(コードの貼り付け方・実行のしかた)は提出前のExcelを整えるVBAの「使い方」と同じです。確認が終わったら、一覧を作ったシートは削除してください。
6. それでも重いとき
- 見えない図形がたくさんある:Ctrl+G→「セル選択」→「オブジェクト」で、シート上の図形やテキストボックスがすべて選ばれます。Webやほかのファイルからコピーしたときに、小さな図形が大量に紛れ込むことがあります。
- 入力中だけ計算を止める:「数式」タブ→「計算方法の設定」→「手動」にすると、F9 を押すまで計算しません。ただし、数字が古いままになるので作業が終わったら必ず「自動」に戻してください。これは応急処置で、上の原因を直すのが本筋です。
毎回の確認を、ボタン1つに
KoreDefo は、OFFSET・INDIRECT・NOW・TODAY・RAND・RANDBETWEEN・CELL・INFO を使った数式を見つけて、場所を一覧にします。クリックでそのセルへ移動できるので、上の表を見ながら置き換えられます。条件付き書式の数や使っていない範囲はチェックの対象外なので、5章の VBA で確認してください。
30日間無料で試すチェック項目の一覧を見る