• #excel-viewer
  • #hyperformula
  • #sheetjs
開発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内で範囲を連結して配列を生成する」構文をサポートしていない。

エラーの連鎖

  1. K6, K7 → #VALUE!(配列数式が未対応)
  2. O6, O7 → =H6-SUM(J6:M6) — SUMの範囲にK列が含まれるため #VALUE! が伝播
  3. K11, O11 → =SUM(K4:K10) / =SUM(O4:O10) — 同様に伝播

対処の選択肢

方法メリットデメリット
HyperFormulaエラー時にSheetJSのキャッシュ値にフォールバックコード修正のみExcelで最後に保存した値なので古い可能性
Excel側でXLOOKUPに書き換え根本解決全シートの数式を修正する必要がある
配列数式を作業列に分解するHyperFormula互換になるExcelの構造が変わる

現時点では未対応。実用上はExcelで開いて確認すればいいので、優先度は低い。

HyperFormulaの対応関数と制限まとめ

正常に動作する関数

  • SUM, IF, IFERROR
  • INDEX / MATCH(単純な使い方)
  • 四則演算、セル参照、シート間参照

未対応・制限がある機能

  • 配列数式(CSE): INDEX(範囲A & 範囲B, ) パターン
  • SORT, SORTBY, UNIQUE: 動的配列関数(Excel 365)
  • SEQUENCE, RANDARRAY: スピル関数
  • 3D参照: SUM(Sheet1:Sheet3!A1) 形式