Excel の揮発性関数とは、参照しているセルが変わっていなくても、ブック内で再計算が走るたびに毎回計算される関数のことです。=NOW() や =OFFSET(...) が代表例で、少数なら便利ですが、行数が多いブックでは「最近ブックが重い」「F9 を押すと固まる」の主因になります。この記事では、Excel 2024 build 19929 で実機検証した揮発性関数 9 関数の一覧と、ブックが重くなる仕組み、F9 と手動計算モードの使い分け、OFFSET から INDEX への置き換えを、再現可能なサンプル付きで解説します。
サンプルファイル(xlsm)
本記事で使う「揮発性関数 9 関数の VolatileProbe 計測」「揮発性連鎖 (A1=NOW() を起点に B1/C1 まで再計算)」「1 万行 OFFSET vs INDEX ベンチマーク」を 1 ブックにまとめた配布マクロブックです。マクロを有効化して開くと、F9 を押すたびに揮発性関数の呼び出し回数が +1 されるのが見られます。

揮発性関数とは(再計算のたびに毎回動く関数)
Excel の通常の関数は、自分が参照しているセルや引数が変わったときだけ再計算されます。これに対して揮発性関数 (volatile function) は、ブック内のどこかで再計算が起きると、参照先がまったく変わっていなくても毎回再計算されます。
通常の関数と揮発性関数の違い
たとえば =SUM(A1:A10) は、A1 から A10 のいずれかが変わったときだけ再計算されます。一方 =NOW() は引数を 1 つも持ちませんが、別シートのセル 1 つを編集しただけで再計算が走ります。揮発性関数は「依存セル変更時のみ動く」というルールから外れた特別な関数なのです。
「揮発性」が観測できる最小サンプル
A1 セルに =NOW() を入れ、まったく無関係な Z100 セルの値を書き換えてから F9 を押してみてください。A1 の時刻が更新されます。これが揮発性として観測できる最小の例です。
=NOW()
Excel 2024 で確認した揮発性関数の一覧(9 関数 + 引数別検証)
Excel 2024 build 19929 で、各関数を =VolatileProbe(原関数) でラップして手動計算モードで検証した結果です。VolatileProbe は記事末尾の配布 .xlsm に含まれているユーザー定義関数で、無関係なセル変更でその関数が再評価されたら呼び出し回数を +1 します。

確実に揮発性として動く 7 関数
次の 7 関数は、Microsoft 公式資料 (Excel Recalculation / Excel performance) と Excel 2024 build 19929 の実機検証で、いずれも揮発性として確認できる代表的な関数です。RANDARRAY だけは Microsoft Learn の上記 2 ページに直接の記載はありませんが、本記事の検証では他の RAND 系と同じく揮発性として観測されました。
=NOW()— 現在の日付と時刻 (毎計算で値が変わる)=TODAY()— 今日の日付 (値は日跨ぎでないと変わらないが、UDF probe では再計算を観測)=RAND()— 0 以上 1 未満の乱数=RANDBETWEEN(1,1000000)— 範囲指定の整数乱数=RANDARRAY(1,1,1,1000000,FALSE)— 乱数の配列 (スピル先頭セルでも揮発性)=OFFSET($B$5,0,0)— 基準セルからずらした参照 (値は変わらないが毎回再評価される)=INDIRECT("$B$5")— 文字列から参照を作る (こちらも値は変わらないが揮発性)
CELL / INFO は今回確認した引数で揮発性として観測
Microsoft Learn の Excel Recalculation では、CELL と INFO は「引数依存 (depending on its arguments)」の揮発性関数として記載されています。本記事では、よく使われる以下の引数で実機検証し、いずれも揮発性として観測されました。すべての引数を網羅したわけではないため、実務では揮発性寄りに扱うのが安全です。
=CELL("filename",A1)— 引数filename=CELL("address",A1)— 引数address=CELL("format",A1)— 引数format=INFO("release")— 引数release=INFO("recalc")— 引数recalc(現在の計算モード「自動」「手動」を返す)=INFO("system")— 引数system
揮発性ではないが間違って紹介されがちな関数
古い解説記事で「揮発性」と紹介されることが多いものの、Excel 2024 build 19929 では非揮発性として観測される関数を以下にまとめます。Microsoft 公式ドキュメントも、これらは現行の Excel では非揮発性に変更された旨を明記しています。OFFSET の代わりに使える INDEX がここに入っているのが重要なポイントです (詳しくは「OFFSET を INDEX に置き換える」で解説)。
=INDEX($B$5:$B$10,1)=ROWS($B$5:$B$10)=COLUMNS($B$5:$D$5)=AREAS(($B$5:$B$10,$D$5:$D$10))
記事内のリンク先記事「名前付き範囲に使える「範囲・配列」を返す関数 – INDEX, INDIRECT, OFFSET」では、3 関数の使い分けを名前付き範囲の視点でさらに詳しく扱っています。
揮発性かどうかを自分で判定する方法
気になる関数が揮発性かどうかは、配布 .xlsm の VolatileProbe シートで手元で確認できます。シートに並んでいる 19 行ぶんは E 列 (備考) に判定結果がすでに記載されているので、まずはそちらを見れば十分です。新しい関数を自分で確かめたい場合は、累計呼び出し回数を返す GetProbe() の値が「無関係なセル変更で増えるか」を見ます。VolatileProbe(x) 自体は内部カウンタを +1 してから引数 x をそのまま返すラッパーなので、wrap したセルの値そのものは増えません (元の関数の戻り値が表示されます)。
- 計算方法を「手動」に切り替える (数式タブ → 計算方法の設定 → 手動)
- 任意の空きセル (例: G1) に
=GetProbe()を入れて、現在の累計呼び出し回数を表示しておく - Alt+F8 →
ResetProbeを実行して G1 を 0 に戻す - 別の空きセル (例: G2) に
=VolatileProbe(関数())の形で確認したい関数を wrap して入れる - 無関係な Z100 セルの値を書き換えて F9 を押す
- G1 (
=GetProbe()) の値が +1 されていれば、その関数は無関係なセル変更で再計算された=揮発性として観測

揮発性関数が「ブックが重い」につながる仕組み
揮発性関数 1 個あたりの再計算コストは、関数や状況によって大きく変わります (今回の OFFSET / INDEX 1 万行ベンチでは 1 セル 1 マイクロ秒未満でしたが、CELL / INFO / INDIRECT、外部参照、条件付き書式、UDF を絡めると桁が変わります)。それでもブックが重くなるのは、再計算 1 回ごとのコストではなく、次の 3 つの仕組みが組み合わさって発生する「再計算回数の爆発」が原因です。
連鎖再計算 (揮発性を参照したセルも揮発性扱い)
これが最大の罠です。揮発性関数を参照したセルは、自分自身が普通の関数でも、結果的に毎回再計算されます。 A1 に =NOW()、B1 に =A1+1、C1 に =B1+1 を入れて配布 .xlsm の VolatileProbe で計測すると、無関係な Z100 セル 1 つの変更で A1 / B1 / C1 すべてが再計算されました。

=A1+1
つまり、揮発性関数 1 個でも、それを参照する数式が数千行あれば「揮発性扱いのセル」が数千個に広がります。これが「OFFSET が大量にあると重い」「INDIRECT で集計したブックが固まる」の正体です。
他のブックを開いていても再計算される
同時に開いている別ブックに揮発性関数があると、こちらのブックを編集しただけで、向こうのブックも再計算されます。重い集計ブックを開いたまま別ブックで作業すると体感が遅くなるのはこのためで、いったん閉じるだけで応急的に軽くなります。
条件付き書式やデータの入力規則の数式にも波及する
条件付き書式の「数式を使用して、書式設定するセルを決定」やデータの入力規則の数式に OFFSET や INDIRECT を使うと、ルールが当たっている範囲のセル数だけ揮発性が広がります。条件付き書式が大量に入っているブックの重さに揮発性が絡んでいるケースは多いので、心当たりがあれば見直しましょう。
重いか確認する手順(F9 と手動計算モード)
「揮発性が原因か」を切り分けるには、いったん計算方法を「手動」に切り替えて、F9 を押したときの所要時間で判断するのが最短です。
F9・Shift+F9・Ctrl+Alt+F9・Ctrl+Alt+Shift+F9 の違い
Excel の再計算ショートカットは 4 種類あり、対象範囲と強制度合いが違います。
| キー | 対象 | 用途 |
|---|---|---|
| F9 | 開いているすべてのブックの「再計算が必要なセル」 | 通常の再計算 |
| Shift+F9 | アクティブシートの「再計算が必要なセル」 | 1 シートだけ更新したいとき |
| Ctrl+Alt+F9 | すべてのブックの「すべてのセル」(強制再計算) | 揮発性が残っていないか確認したいとき |
| Ctrl+Alt+Shift+F9 | 依存関係を再構築したうえですべてのセルを強制再計算 | 循環参照や式の食い違いの最終確認 |
関連記事「再計算のショートカットキー」でも、4 つのショートカットの使い分けと VBA からの再計算 (Application.Calculate) を解説しています。
計算方法を「手動」に切り替える手順
リボンの数式タブ → 計算方法の設定 → 「手動」を選びます。これでセルを編集しても自動再計算が走らなくなり、F9 を押した瞬間だけ計算されます。揮発性が原因で重い場合、手動に切り替えた瞬間にサクサク動くようになるので、原因切り分けとして有効です。VBA からは Application.Calculation = xlCalculationManual で同じことができます。
現在の計算モードを数式で取得する
計算モードはセルからも取得できます。次の数式は、自動なら「自動」、手動なら「手動」を返します。チームでブックを使い回すときに、自動に戻し忘れていないかをセル上で確認するのに便利です。
=INFO("recalc")OFFSET を INDEX に置き換える
OFFSET から INDEX への置き換えは、Excel の高速化 Tips としてよく紹介されますが、per-cell (1 セル単独) の評価コストはほぼ同等で、Excel 2024 build 19929 の 1 万行実測では OFFSET の方が速いケースもあります。それでも置換を勧めるのは、OFFSET が揮発性なので、無関係なセル変更でもブック全体の OFFSET セルが毎回再計算されるからです。INDEX に置き換えると、参照元の範囲が変わらないかぎり再計算がかからなくなり、累計の重さが大きく下がります。
動的範囲を指定する代表例とその INDEX 版
OFFSET の典型的な使い方は、基準セルから「行・列をずらして 1 セルを参照する」または「行数・列数を指定して範囲を作る」の 2 つです。1 セル参照は INDEX で素直に書き換えられます。
=OFFSET($B$2,ROW()-2,0)
これと同じ結果を INDEX で書くと次のようになります。$B$2:$B$10001 の範囲を変えないかぎり、無関係なセルを編集しても再計算されません。
=INDEX($B$2:$B$10001,ROW()-1)

1 万行で計測した per-cell の評価コスト
配布 .xlsm の「速度比較」シートで、上の 2 数式を 1 万行ぶん並べて Range.Calculate で 10 回反復平均を取り、それを 3 回分計測した中央値です (QueryPerformanceCounter で計測)。
| 数式 (1 万行) | 1 回目 | 2 回目 | 3 回目 | 中央値 |
|---|---|---|---|---|
=OFFSET($B$2,ROW()-2,0) | 0.0072 s | 0.0058 s | 0.0057 s | 0.0058 s |
=INDEX($B$2:$B$10001,ROW()-1) | 0.0080 s | 0.0087 s | 0.0131 s | 0.0087 s |
ここを誤解しないでください。1 セル単独の評価では OFFSET の方が速いことすらあります。それでも実際のブックで OFFSET が重くなるのは、揮発性で「再計算が走る回数」が圧倒的に多いからです。OFFSET が 1 万セルあれば、無関係な編集 1 回ごとに 1 万セル全部が再評価されます。INDEX なら参照範囲が変わらないかぎり 0 回です。10 万行クラスのベンチマークや行数別グラフ、INDIRECT の速度比較は、別記事で扱う予定です。
名前付き範囲で動的範囲が必要な場合
「行数を自動で伸ばしたい」のように、可変の範囲を返す名前付き範囲を作りたい場合は、INDEX を使った定義に書き換えるのが定石です。詳しい比較は次の記事を参考にしてください。

INDIRECT を非揮発性で代替する
INDIRECT も OFFSET と同じ理由で重くなります。INDIRECT を非揮発性の関数で置き換えられないか、用途別に検討しましょう。INDIRECT の基本的な使い方やシート参照の作り方そのものは「ExcelのINDIRECT関数を理解しよう!参照形式の使い分けも解説」にまとめています。
シート切替なら CHOOSE / SWITCH で代替
「セル A1 に入力したシート名で参照先を切り替える」用途は、対象シートが少数なら CHOOSE や SWITCH で書けます。両関数とも非揮発性なので、無関係なセルを変更しても再計算されません (A1 や参照先の各シートのセルが変わったときに再評価されます)。
=CHOOSE(MATCH($A$1,{"4月";"5月";"6月"},0),'4月'!$B$5,'5月'!$B$5,'6月'!$B$5)シート名を SWITCH で書くこともできます。可読性で好みの方を選んでください。
=SWITCH($A$1,"4月",'4月'!$B$5,"5月",'5月'!$B$5,"6月",'6月'!$B$5)
INDEX + MATCH で間接参照を再構築する
同一シート内で「行番号や列番号をセル値から決めたい」用途は、INDIRECT より INDEX + MATCH の方が安全です。INDEX も MATCH も非揮発性で、無関係なセル変更では再計算されません (検索値・検索範囲・戻り範囲のいずれかが変わったときに再評価されます)。
=INDEX($B$2:$D$100,MATCH($F$1,$A$2:$A$100,0),MATCH($G$1,$B$1:$D$1,0))
テーブルの構造化参照に寄せる
「データ範囲が伸び縮みする」用途で INDIRECT を使っている場合、データをテーブル化して構造化参照 (テーブル名[列名]) に置き換えると、テーブルの自動拡張で範囲が追従します。INDIRECT を使わずに済むので、揮発性ごと消えます。
業務で INDIRECT が必須なケース
シート名を文字列で組み立てて複数シートを集計する用途では、INDIRECT が事実上必須になることがあります。たとえば「SUMIFSを別シートにまたがって使う方法」や「複数のシートからのデータ集計: INDIRECT関数とSUMIFS関数を使った効率的な方法」のような集計です。この場合は INDIRECT を残したうえで、計算方法を「手動」にする運用に切り替えるのが現実解です。
NOW / TODAY を値貼り付けで固定する
毎回更新する必要がない日付や時刻は、いったん入力した結果を「値貼り付け」で固定します。揮発性関数が消えるので、その後はブックが軽くなります。
単独セルの値貼り付け
対象セルを選択 → Ctrl+C → 同じセル上で右クリック → 「値の貼り付け」 → 「値」 (またはショートカット Ctrl+Alt+V → V → Enter) で確定します。
記録目的のタイムスタンプは VBA の方が安全
「行を追加したときの日時を残す」のように、後から書き換わってほしくない記録用タイムスタンプは、関数より VBA で Now をいったん値として書き込む方が安全です。詳しくは VBA でユーザー定義関数を扱う「ユーザー定義関数を自動再計算型に改良する方法・揮発性の設定」も合わせて参考にしてください。
RAND 系を確定後に値へ置き換える
RAND・RANDBETWEEN・RANDARRAY の結果を「抽選結果」「仮の連番」として使うときは、結果が決まった時点で値貼り付けに切り替えます。そうしないと F9 のたびに当選者が入れ替わります。
抽選結果を確定する手順
結果の出ている範囲をすべて選択 → Ctrl+C → 同じ範囲に「値の貼り付け」を行います。値で固定すれば乱数は再生成されません。
RANDARRAY の値貼り付けで起きやすい罠
RANDARRAY はスピル関数なので、結果が複数セルに広がります。スピル先頭セル (例: D2) だけを選んで値貼り付けすると、D2 の 1 値だけが固定されてスピルが消えてしまいます。RANDARRAY の値固定では、必ずスピル範囲全体を範囲選択 (D2 セルを選んで Ctrl+Shift+End または範囲全選択) してから貼り付けてください。
SUMIF は公式記述と Excel 2024 実測の差分
「SUMIF を使いすぎるとブックが重くなる、なぜなら SUMIF は揮発性だから」という解説をネット上で見かけます。ここは公式記述と実機の差分があるので、本記事では両方を提示します。
Microsoft 公式の記述
Microsoft Learn の「Excel Recalculation」では、SUMIF が揮発性関数の一覧に「引数依存 (depending on its arguments)」として含まれています。引数の組み合わせ次第で揮発性扱いになるという書き方です。
Excel 2024 build 19929 の実測
配布 .xlsm の VolatileProbe で、範囲一致 (SUMIF_match) と範囲不一致 (SUMIF_mismatch) のケースを並べて検証したところ、いずれも備考列に「非揮発性として観測」のラベルが付き非揮発性として観測されました。

=SUMIF($B$5:$B$10,">0",$C$5:$E$15)
「SUMIF を使いすぎると重い」の本当の原因
SUMIF が大量にあるブックが重くなるのは、揮発性ではなく依存範囲の広さや、参照する元データの再計算が走った時の連鎖が主因と考えるのが自然です。SUMIFS を含む集計の重さ対策は「SUMIFSを別シートにまたがって使う方法」も参考にしてください。Excel のバージョンや引数の組み合わせ次第で揮発性扱いになる可能性は否定できないので、心配な場合は配布 .xlsm の VolatileProbe で手元の数式を実測するのが確実です。
ユーザー定義関数 (UDF) を揮発性にする方法
VBA で書いた自作関数 (UDF) も、宣言を 1 行追加するだけで揮発性にできます。常に最新の値を返したい計算ロジック (例: 自前の現在時刻関数、行番号依存の動的計算) に向いています。
Application.Volatile True で揮発性にする
関数の冒頭で Application.Volatile True を呼ぶと、その UDF は無関係なセル変更でも毎計算で再評価されるようになります。配布 .xlsm の VolatileCounter / NonVolatileCounter で挙動の差を直接確認できます。
Public Function VolatileCounter() As Long
Application.Volatile True
g_volatileCount = g_volatileCount + 1
VolatileCounter = g_volatileCount
End Function逆に「揮発性にしたくない」ことを明示する
Application.Volatile False で「明示的に非揮発性」と宣言できます。何も書かなければ非揮発性が既定なので必須ではありませんが、UDF の意図をコードで残しておきたい場合に有効です。
UDF 揮発性化の詳細手順
UDF を実際に揮発性化する詳細な手順や、自動再計算型に改良する具体例は次の関連記事にまとめています。

まだ重いときの応急対策
関数の置き換えがすぐにできない場合の応急策です。即効性が高い順に並べました。
計算オプションを「手動」にして必要なときだけ F9
計算方法を「手動」にすると、セルを編集しても自動再計算が走らなくなります。意図したタイミングで F9 を押して再計算できるので、揮発性関数が大量にあっても入力作業の重さは消えます。配布が必要なブックでは、開いた人が自動に戻し忘れないよう、シート上で =INFO("recalc") を出して可視化しておくと親切です。
不要な揮発性関数を一括で探す
シート上で揮発性関数を含むセルを一気に洗い出すには、隣に =FORMULATEXT(対象セル) を出して、ISNUMBER + SEARCH で関数名を検索する方法が手軽です。
=ISNUMBER(SEARCH("OFFSET",FORMULATEXT(A1)))OFFSET / INDIRECT / NOW / TODAY / RAND / RANDBETWEEN / RANDARRAY / CELL / INFO の 9 関数を OR でまとめて検索すれば、揮発性が混じっているセルがすぐに見つかります。
VBA から強制再計算を仕掛ける
「特定のシートを開いたとき」「特定のセルをクリックしたとき」だけ再計算したいなら、VBA の Worksheet_SelectionChange や Worksheet_Activate イベントから Application.Calculate を呼びます。範囲・タイミングは「特定の範囲をクリックするたびに再計算が行われるVBAマクロの設置」と「セルをクリックするたびに再計算が行われるVBAマクロの設置」を参考にできます。
条件付き書式・データの入力規則を整理する
条件付き書式の数式に揮発性関数が含まれていると、ルールが当たっている範囲のセル数だけ再計算がかかります。条件が不要になっているルールは削除し、必要なルールも揮発性関数を使わない形に書き換えると、ブック全体が軽くなります。
まとめ|揮発性関数を扱うときに覚えておく 5 つ
記事のポイントを 5 つに整理しました。
- Excel 2024 で揮発性として観測されたのは NOW / TODAY / RAND / RANDBETWEEN / RANDARRAY / OFFSET / INDIRECT の 7 関数と、CELL / INFO の引数依存 2 関数。SUMIF は Microsoft 公式では引数依存とされるが、Excel 2024 build 19929 の実測では非揮発性として観測された。
- 揮発性関数を参照したセルも連鎖して再計算される。OFFSET 1 個でも、それを参照する数式が数千行あれば数千セル全部が「揮発性扱い」になる。
- 「揮発性が原因か」の切り分けは計算方法を「手動」に切り替えて F9 を押すのが最短。
=INFO("recalc")で現在のモードを取得できる。 - INDEX への置換は「1 セル単独の速さ」ではなく「揮発性を消して再計算回数を減らすこと」が目的。per-cell の評価コストは OFFSET と INDEX で同等またはむしろ OFFSET が速いケースもある (Excel 2024 build 19929 / 1 万行で実測)。それでも置換を勧めるのは、累計の再計算回数が桁違いに減るから。
- 記録用タイムスタンプや確定後の乱数は、値貼り付けで固定する。RANDARRAY はスピル範囲全体を選択して貼り付ける。
本記事で使った VolatileProbe / 揮発性連鎖 / 1 万行 OFFSET vs INDEX ベンチは、ページ冒頭の配布マクロブックでそのまま試せます。手元の Excel が揮発性のせいで重いのかを切り分けたいときに、ぜひ使ってみてください。
サンプルファイル(xlsm)
VolatileProbe / 揮発性連鎖 / 1 万行 OFFSET vs INDEX ベンチを 1 ブックにまとめた配布マクロブックです。
コメント