#CALC!エラーとは?
#CALC!
Excelは2020年に動的配列の導入と併せて#CALC!エラーを導入しました。#REF!(リンク切れ)や#DIV/0!(計算エラー)とは異なり、#CALC!はエンジンが数式のロジックは理解しているものの、単に結果を生成できないことを意味します。通常、数式が空のセットを返そうとしたり、内部的な入れ子の制限を超えたりした場合に発生します。
発生の原因
通常、このエラーは主に次の3つの理由で発生します:
- 空の結果:
FILTER関数で10,000行を検索した結果、一致するデータが1件もなかった場合。 - 入れ子になった配列: 配列の中に別の配列を入れようとした場合。現在のExcelでは「不正な」操作として扱われます。
- メモリの過負荷: 数式が重すぎる場合(数百万のセルを処理している、または
LAMBDA関数で無限ループが発生しているなど)。
具体的な解決策
1. 空のFILTER結果を処理する
これが最も一般的な原因です。=FILTER(A2:B500, A2:A500="プロジェクトX")を使用し、「プロジェクトX」が存在しない場合、Excelはグリッドに何を表示すべきか判断できず、#CALC!を返します。
修正方法: if_empty引数を使用して、Excelに代替値を指定します。
// 失敗する検索の代わりに:
=FILTER(A2:B500, A2:A500="プロジェクトX")
// 代替の文字列を使用:
=FILTER(A2:B500, A2:A500="プロジェクトX", "プロジェクトが見つかりません")
デフォルトの文字列や「0」を指定することで、データが見つからない場合でもエラーを回避できます。
2. 入れ子になった「配列の配列」エラーを修正する
Excelはまだ「配列の配列」をサポートしていません。MAPを使用し、内部計算が1つの行に対して複数の値を返す場合、数式は壊れます。これは、弁当箱の中にスーツケースを詰め込もうとするようなものです。
// 1つのIDが複数の結果に一致する場合、これは失敗します:
=MAP(A1:A10, LAMBDA(id, FILTER(C1:C100, D1:D100=id)))
修正方法: TEXTJOINを使用して、サブ結果をセルあたりの単一の文字列にフラット化します。
// エラーを避けるためにサブ結果をフラット化する:
=MAP(A1:A10, LAMBDA(id, TEXTJOIN(", ", TRUE, FILTER(C1:C100, D1:D100=id))))
3. Python in Excelを最適化する
Python in Excelを使用している場合、スクリプトが生のデータベース接続や複雑な辞書など、Excelがレンダリングできないオブジェクトを返すと、#CALC!が発生することがよくあります。
修正方法: 結果を返す前に、必ずリスト、辞書の値、またはPandasのDataFrameにキャストしてください。
# Pythonセル
import pandas as pd
df = xl("SalesData[#All]", headers=True)
# データをクリーンアップしてExcelのグリッドに収まるようにする
return df.query('Total > 1000').values.tolist()
4. LETを使用して大規模データを管理する
数式が複数の条件で50,000行以上を処理する場合、エンジンがタイムアウトすることがあります。ロジックを分割することで、Excelがメモリ使用量を最適化できるようになります。
修正方法: LET関数を使用して変数を一度定義し、同じ計算を何度も繰り返さないようにします。
// LETを使用して複雑なフィルタを高速化する:
=LET(
raw_data, Sheet2!$A$1:$Z$100000,
target, "西日本地域",
filtered, FILTER(raw_data, CHOOSECOLS(raw_data, 5)=target, "なし"),
filtered
)
修正の確認方法
修正したつもりで終わらせず、以下の手順で確認しましょう:
- 強制再計算:
Ctrl + Alt + F9を押します。これにより、Excelは計算の依存関係ツリー全体を強制的に再構築します。 - 配列のテスト: 結果に対して
=TYPE(A1)を使用します。値が64であれば正常な配列であることを確認でき、16であればエラーが残っていることを意味します。 - エッジケースの確認: フィルタ条件を削除します。セルに
#CALC!ではなく「結果なし」などのメッセージが表示されれば、数式は堅牢です。
プロのヒント
- 常に
FILTERの第3引数を定義しましょう。これにより、#CALC!による悩みの9割を回避できます。 - 計算方法の設定を確認してください。「手動」に設定されている場合、動的配列に古いエラーが表示されたままになることがあります。
- 10,000行を超えるデータセットを扱う場合、
BYROWやMAPを相互に入れ子にすることは避けてください。

