043刊行 2026-10-22 ・ 読了約6分

エクセルは、ひとりで作れるのか。

Can One Person Build Excel?

手元の Excel 165本を自作の部品で開き、数式12万個を計算し直した。最初にずれたのは見積書の単価で、875円が876円になった。6か所を直すと99.93%が一致し、最後まで合わなかったのは「作成日」だけだった。

調べ方SheetJS と HyperFormula で、実物の xlsx 165本の数式121,932個を計算し直し、Excel が保存した答えと照合

規模
165本・数式121,932個
触れる
見積書の切り上げを、素直な計算と Excel の計算で比べられる
結論
作れる。一致は99.93%。
Abstract

要旨

マクロはいらない。シートの関数と CSV が使えて、人からもらったファイルが開ければいい。それなら、エクセルはひとりで作れるのか。

難しい部分を自分で書く必要はない。ファイルを読む部品(SheetJS)と、数式を計算する部品(HyperFormula)は、どちらも無料で手に入る。問題は、それを組み合わせたものが、本物の Excel と同じ答えを出すかどうかである。

そこで、手元にある実物の Excel ファイル165本を自作の側で開き、数式121,932個をすべて計算し直して、Excel が保存していた答えと1個ずつ比べた。

部品を組んだだけの状態では、Excel で作られたファイルの答えは97.25%しか合わなかった。最初に見つかったずれは、箱の見積書の単価だった。875円が、876円になった。ずれの原因を6か所直すと、一致は99.93%まで上がった。残った75個は、すべて「作成日」の欄だった。

最後まで直せなかったのは、計算ではなく日付だった。

Method

方法

材料
手元にある .xlsx のうち、自分で作ったものと中身が同じ重複を除いた165本。官公庁が公開している統計など74本と、仕事で受け取った見積の計算書・進行表・名簿など91本である。シートは738枚、値の入ったセルは約1,666万個になる。仕事のファイルは、社名も中身も出さず、数だけを使う。
部品
ファイルを読むのは SheetJS(0.20.3)、数式を計算するのは HyperFormula(3.5.0)。どちらも JavaScript で動き、ブラウザの中でも使える。
答え合わせ
.xlsx の中には、式と一緒に、保存した時点の答えも入っている。値と式を HyperFormula に移して全部を計算し直し、保存されていた答えと比べた。数は相対差10億分の1まで同じなら一致、文字は1字でも違えば不一致とした。TODAY と NOW を直接使う19個は、開くたびに答えが変わるので比べる対象から外した。
書き戻し
読み込んだファイルを、SheetJS の無料版と ExcelJS(4.4)でそれぞれ保存し直し、書式・画像・グラフなどが何本で残るかを数えた。
CSV
受け取った CSV 643本(重複を除く)の文字コードを調べた。
Result 1

521の関数のうち、使われていたのは24

Microsoft の一覧によると、Excel の関数は521ある。HyperFormula が持っているのはそのうち384で、全体の74%にあたる。数字だけ見ると、4分の1が足りない。

ところが、165本の数式12万個に出てくる関数を数えると、24種類しかなかった。多い順に、IF が63,557回、ROUNDUP が12,647回、COUNTIF が10,285回、SUM が6,371回である。上の4つだけで、数式の大半が書けている。

521
Excel の関数
384
HyperFormula にもある関数
24
165本で実際に使われていた関数

24種類のうち、HyperFormula に無かったのは、数を「1,234.5」のような文字にする FIXED だけだった。国立保健医療科学院が配っている死因の統計15本で、見出しの文を組み立てるのに1,080回使われていた。

足りない137の中身を見ると、日本語だけで使う関数がまとまって抜けている。全角と半角を変える ASC と JIS、ふりがなを取り出す PHONETIC、バイト数で文字を数える LENB である。今回の165本には出てこなかったが、名簿を整える表なら出てきそうな関数ばかりだ。

関数の数で比べると74%、使われ方で比べると96%。

Result 2

875円が、876円になる

最初に見つかったずれは、紙器の見積の計算書に集まっていた。8本・55個で、どれも ROUNDUP(切り上げ)の答えだった。

ある見積では、材料費の欄が =ROUNDUP(C81/I81/K81/L81*1.05,0) になっている。中身は 10,000,000 ÷ 6 ÷ 250 ÷ 8 × 1.05 で、手で計算すると875ちょうどになる。ところがコンピュータの答えは 875.00000000000011 だった。小数を2進数で持つため、最後の桁にわずかな誤差が乗る。素直に切り上げると、これが876になる。

Excel が876にしないのは、計算の答えを有効数字15桁に丸めてから使っているからである。875.00000000000011 は、15桁に丸めると875になる。HyperFormula は丸めずに切り上げていた。

1個のずれは、そこで止まらない。別の見積では、単価の1円のずれが下の合計欄に流れ込み、10,445が10,446になった。同じ理由で、0.405 × 5,000 の切り上げは2,025.1になった。どれも、見積の金額に直接つながる欄である。

直し方は短い。ROUND・ROUNDUP・ROUNDDOWN の3つだけ、切り上げる前に15桁に丸める版に差し替えた。それで55個すべてが Excel と同じ答えになり、ほかの答えは1つも変わらなかった。

見積の1円は、16桁目の誤差から生まれていた。

Result 3

6か所を直すと、99.93%

Excel など、Google 以外のソフトで作られた133本のうち、数式があるのは62本、数式は101,722個だった。ずれの原因を1つずつ直し、そのたびに全部を計算し直した。

Google 以外で作られた62本・数式101,722個の答え合わせ(上から順に直しを足した)
直したところ増えた一致全部合った
部品を組んだだけ―97.25%34本
切り上げの前に15桁へ丸める+5597.30%42本
日本語のシート名を引用符で囲む+5197.36%42本
FIXED を足す+54097.89%42本
空のセルを指す式は0と答える+10997.99%45本
TRUE・FALSE を関数なしで書いた式を読む+297.99%46本
HYPERLINK の表示名を数のまま返す+1,96599.93%47本

どれも、計算の難しさではなかった。「シート1!A1」のように半角カナのシート名を引用符なしで書くのは、Excel では普通である。HyperFormula の読み取りはそれを受け付けず、式が丸ごと読めなかった。空のセルを指す =A1 は、Excel では0と出るが、HyperFormula は空欄を返す。HYPERLINK は、厚生労働省の市区町村別生命表1本の目次で1,965回、表示名に数の0を入れて使われていた。Excel はそれを数として返し、HyperFormula は文字として返した。

直し終えても、75個が残った。死因の統計15本に5個ずつある、「作成日」の欄である。式は =TODAY() を使っていて、Excel は保存したときに「作成日:2025年10月20日」と答えを残していた。計算し直すと、それが「作成日:2026年10月22日」、つまり開いた日に変わる。

これは直すものではなく、作り方の問題だった。人からもらったファイルを見るときに計算し直すと、作成日は毎日書き換わる。見るだけなら、保存されていた答えをそのまま出し、触ったセルから先だけを計算すればいい。

計算し直さないほうが、正しく見える欄がある。

Case

開けても、合わないファイル

答え合わせの外側で、作る前に知っておきたいことが4つ見つかった。

Google 製
仕事で受け取った32本は、Google スプレッドシートから書き出したものだった(Excel なら書く作成ソフトの欄が無い)。数式20,210個の一致は85.59%にとどまった。式の中に #REF! が書かれたままのものが1,585個あった。Excel に無い QUERY や SORT は「Excel では計算できない」という目印をつけて書き出されていて、これが996個あった。COUNTIF の条件に範囲を渡す書き方も、Google と Excel で答えが違う。どれも、Excel の計算規則で書かれた式ではない。
名前だけ .xlsx
官公庁の統計のうち3本は、名前が .xlsx なのに、中身は2003年までの古い .xls だった。SheetJS は中身を見て読み分けるので、3本とも開けた。拡張子で読み方を決めていたら開けなかった。
書き戻し
SheetJS の無料版で保存し直すと、162本中146本で書式(色・罫線・表示形式)が減った。1本あたりの書式の数は中央値で94から1〜3になった。画像15本、グラフ15本、条件付き書式7本、入力規則29本は、すべて消えた。残ったのは、セルの結合(108本)とコメント(4本)だけだった。ExcelJS で保存し直すと、書式は154本で8割以上残り、画像・条件付き書式・入力規則も全部残った。消えたのはグラフ15本だけである。
CSV
受け取った CSV 643本のうち、468本(72.8%)が Shift_JIS だった。UTF-8 は167本で、そのうち102本には先頭の目印(BOM)が無い。Excel は、目印の無い UTF-8 をダブルクリックで開くと文字化けしやすい。自作なら、読む前に文字コードを判定すればいいので、ここだけは本物より楽に作れる。

「開ける」と「同じ答えになる」と「崩さずに返せる」は、それぞれ別の問題だった。開くだけなら165本すべて開けた。答えが合うかは、そのファイルを作ったソフトで変わる。返すなら、どの部品で保存するかで、相手のファイルが残るかどうかが決まる。

Try it

切り上げを、2通りで計算する

見積書で見つかった式を、このページの中で計算し直せる。数と桁を変えると、どこでずれが生まれるかが見える。

コンピュータの答え
素直に切り上げる
Excel の切り上げ

「コンピュータの答え」は有効数字17桁まで出している。「Excel の切り上げ」は、答えを15桁に丸めてから切り上げる。今回の答え合わせで差し替えたのと同じ計算である。

Conclusion

結論

エクセルは、人からもらったファイルを開いて計算するところまでなら、ひとりで作れる。無料の部品2つと、6か所の直しで、Excel で作られた62本・数式10万個の答えが99.93%合った。合わなかったのは作成日だけで、これは保存された答えをそのまま見せれば済む。

作る前に想像していた難しさと、実際の難しさは違っていた。関数の数(521)は、ほとんど問題にならなかった。手間がかかったのは、小数の16桁目、引用符の無いシート名、空のセルが0か空欄か、といった、Excel が黙ってやっている小さな約束のほうだった。どれも、実物のファイルで答え合わせをしなければ見つからなかった。

線を引くなら、次の3つになる。見るのは自作でいい。自分で作って CSV や .xlsx で渡すのも自作でいい。人のファイルを直して返すなら、書式を残せる部品を選び、グラフは崩れると先に決めておく。

次の問い:Google 製の14%は、どこまで Excel の言葉に訳せるのか。

※ 自分用の表計算を作る前に、部品の実力を測った記録です。
比べたのは、ファイルに保存されていた答えと、計算し直した答えです。Excel を実際に動かして比べてはいません。仕事で受け取ったファイルは、社名や中身を出さず、件数と一致の数だけを使いました。数字はすべて、2026年10月22日に手元で書き出したログから取りました。
References

ネタもと