開発excel-viewerメモ
Excel Viewer: HyperFormulaで#LIC!と#VALUE!エラーが出る原因と対処
Excel ViewerでSheetJS + HyperFormulaを使って数式を再計算する構成で、2種類のエラーに遭遇した。
#LIC! エラー — ライセンスキー未設定
症状
数式が入っているセルがすべて #LIC! と表示される。定数のセルは正常に表示される。
原因
HyperFormula.buildFromSheets() の初期化時に licenseKey を渡していなかった。
// NG: ライセンスキーなし → 全数式セルが #LIC!
hfInstance = HyperFormula.buildFromSheets(sheets)
HyperFormulaはGPLv3のOSSだが、初期化時にライセンスキーを明示しないと全数式セルがライセンスエラーを返す仕様。
対処
// OK: 'gpl-v3' を指定
hfInstance = HyperFormula.buildFromSheets(sheets, { licenseKey: 'gpl-v3' })
#VALUE! エラー — 配列数式(CSE)が未対応
症状
INDEX/MATCHを使った一部のセルが #VALUE! になる。単純なSUMやIFERRORは正常に動く。
原因
HyperFormulaが対応していない配列数式(CSE: Ctrl+Shift+Enter)パターンを使っていた。
問題の数式(資本政策シートとのクロスリファレンス):
=INDEX(
'TPL_資本政策'!$R$3:$R$10,
MATCH(
$C6 & $C$2,
INDEX('TPL_資本政策'!$Q$3:$Q$10 & 'TPL_資本政策'!$P$3:$P$10, ),
0
),
MATCH(K$3, 'TPL_資本政策'!$R$2:$R$2, 0)
) * -1
ポイントはこの部分:
INDEX(範囲A & 範囲B, )
2つの範囲を & で連結してインメモリの配列を作り、MATCHの検索対象にするExcelの配列数式パターン。HyperFormulaはこの「INDEX内で範囲を連結して配列を生成する」構文をサポートしていない。
エラーの連鎖
- K6, K7 →
#VALUE!(配列数式が未対応) - O6, O7 →
=H6-SUM(J6:M6)— SUMの範囲にK列が含まれるため#VALUE!が伝播 - K11, O11 →
=SUM(K4:K10)/=SUM(O4:O10)— 同様に伝播
対処の選択肢
| 方法 | メリット | デメリット |
|---|---|---|
| HyperFormulaエラー時にSheetJSのキャッシュ値にフォールバック | コード修正のみ | Excelで最後に保存した値なので古い可能性 |
| Excel側でXLOOKUPに書き換え | 根本解決 | 全シートの数式を修正する必要がある |
| 配列数式を作業列に分解する | HyperFormula互換になる | Excelの構造が変わる |
現時点では未対応。実用上はExcelで開いて確認すればいいので、優先度は低い。
HyperFormulaの対応関数と制限まとめ
正常に動作する関数
SUM,IF,IFERRORINDEX/MATCH(単純な使い方)- 四則演算、セル参照、シート間参照
未対応・制限がある機能
- 配列数式(CSE):
INDEX(範囲A & 範囲B, )パターン - SORT, SORTBY, UNIQUE: 動的配列関数(Excel 365)
- SEQUENCE, RANDARRAY: スピル関数
- 3D参照:
SUM(Sheet1:Sheet3!A1)形式