KoreDefo > お役立ち記事

Excelが重いときの原因と軽くする方法

入力するたびに「計算中」で固まる、スクロールがカクカクする。重いブックには、だいたい決まった原因があります。上から順に確認すれば、ほとんどのブックは軽くなります。

更新日:2026年10月29日

1. Excel が重くなる主な原因

どれが原因かわからないときは、5章の VBA でシートごとに数を出すと、当たりをつけられます。

2. 増えすぎた条件付き書式を整理する

条件付き書式が付いた行をコピーしたり、行を挿入・削除したりすると、Excel はルールを適用先ごとに分けてコピーします。気づかないうちに、同じルールが何十個、何百個にもなります。

  1. 「ホーム」タブ→「条件付き書式」→「ルールの管理」を開きます。
  2. 上の「書式ルールの表示」で「このワークシート」を選びます。
  3. 同じ数式・同じ書式のルールが並んでいたら、1つだけ残して、その「適用先」を表全体(例:=$B$2:$M$500)に書き直します。
  4. 残りの同じルールを選んで「ルールの削除」を押し、OK を押します。

ルールが多すぎて整理できないときは、「条件付き書式」→「ルールのクリア」→「シート全体からルールをクリア」で全部消してから、必要なルールだけを作り直すほうが早いこともあります。

増やさないコツ:表はテーブル(Ctrl+T)にしておくと、行を足しても条件付き書式は1つのルールのまま広がります。ほかの場所から数式だけ持ってきたいときは、「形式を選択して貼り付け」(Ctrl+Alt+V)→「数式」で貼り付けると、条件付き書式はコピーされません。

3. 使っていない範囲を削除する

Ctrl+End を押すと、Excel が「ここまで使っている」と思っている最後のセルへ移動します。データの最後よりはるか下や右に飛んだら、その間の空のセルにも書式などが残っていて、ファイルが大きく重くなっています。

  1. データの最後の行の1つ下の行番号をクリックします。
  2. Ctrl+Shift+↓ で、シートの最後の行まで選びます。
  3. 行番号の上で右クリック→「削除」を選びます(Delete キーで中身を消すだけでは足りません)。
  4. 列も同じように、データの最後の列の1つ右の列番号をクリックし、Ctrl+Shift+→ で選んで削除します。
  5. 上書き保存します。保存すると、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

結果の見かた

使い方(コードの貼り付け方・実行のしかた)は提出前のExcelを整えるVBAの「使い方」と同じです。確認が終わったら、一覧を作ったシートは削除してください。

6. それでも重いとき

毎回の確認を、ボタン1つに

KoreDefo は、OFFSET・INDIRECT・NOW・TODAY・RAND・RANDBETWEEN・CELL・INFO を使った数式を見つけて、場所を一覧にします。クリックでそのセルへ移動できるので、上の表を見ながら置き換えられます。条件付き書式の数や使っていない範囲はチェックの対象外なので、5章の VBA で確認してください。

30日間無料で試すチェック項目の一覧を見る