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%。
要旨── 開いて計算するところまでは、作れた
マクロはいらない。シートの関数と CSV が使えて、人からもらったファイルが開ければいい。それなら、エクセルはひとりで作れるのか。
難しい部分を自分で書く必要はない。ファイルを読む部品(SheetJS)と、数式を計算する部品(HyperFormula)は、どちらも無料で手に入る。問題は、それを組み合わせたものが、本物の Excel と同じ答えを出すかどうかである。
そこで、手元にある実物の Excel ファイル165本を自作の側で開き、数式121,932個をすべて計算し直して、Excel が保存していた答えと1個ずつ比べた。
部品を組んだだけの状態では、Excel で作られたファイルの答えは97.25%しか合わなかった。最初に見つかったずれは、箱の見積書の単価だった。875円が、876円になった。ずれの原因を6か所直すと、一致は99.93%まで上がった。残った75個は、すべて「作成日」の欄だった。
最後まで直せなかったのは、計算ではなく日付だった。
方法── もらったファイルで、答え合わせをする
- 材料
- 手元にある .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本(重複を除く)の文字コードを調べた。
521の関数のうち、使われていたのは24── 自作で足りないのは、1つだけだった
Microsoft の一覧によると、Excel の関数は521ある。HyperFormula が持っているのはそのうち384で、全体の74%にあたる。数字だけ見ると、4分の1が足りない。
ところが、165本の数式12万個に出てくる関数を数えると、24種類しかなかった。多い順に、IF が63,557回、ROUNDUP が12,647回、COUNTIF が10,285回、SUM が6,371回である。上の4つだけで、数式の大半が書けている。
24種類のうち、HyperFormula に無かったのは、数を「1,234.5」のような文字にする FIXED だけだった。国立保健医療科学院が配っている死因の統計15本で、見出しの文を組み立てるのに1,080回使われていた。
足りない137の中身を見ると、日本語だけで使う関数がまとまって抜けている。全角と半角を変える ASC と JIS、ふりがなを取り出す PHONETIC、バイト数で文字を数える LENB である。今回の165本には出てこなかったが、名簿を整える表なら出てきそうな関数ばかりだ。
関数の数で比べると74%、使われ方で比べると96%。
875円が、876円になる── コンピュータは、0.405を正確に覚えられない
最初に見つかったずれは、紙器の見積の計算書に集まっていた。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桁目の誤差から生まれていた。
6か所を直すと、99.93%── 残ったのは「作成日」だけ
Excel など、Google 以外のソフトで作られた133本のうち、数式があるのは62本、数式は101,722個だった。ずれの原因を1つずつ直し、そのたびに全部を計算し直した。
| 直したところ | 増えた | 一致 | 全部合った |
|---|---|---|---|
| 部品を組んだだけ | ― | 97.25% | 34本 |
| 切り上げの前に15桁へ丸める | +55 | 97.30% | 42本 |
| 日本語のシート名を引用符で囲む | +51 | 97.36% | 42本 |
| FIXED を足す | +540 | 97.89% | 42本 |
| 空のセルを指す式は0と答える | +109 | 97.99% | 45本 |
| TRUE・FALSE を関数なしで書いた式を読む | +2 | 97.99% | 46本 |
| HYPERLINK の表示名を数のまま返す | +1,965 | 99.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日」、つまり開いた日に変わる。
これは直すものではなく、作り方の問題だった。人からもらったファイルを見るときに計算し直すと、作成日は毎日書き換わる。見るだけなら、保存されていた答えをそのまま出し、触ったセルから先だけを計算すればいい。
計算し直さないほうが、正しく見える欄がある。
開けても、合わないファイル── Google 製・名前だけの .xlsx・書き戻し・CSV
答え合わせの外側で、作る前に知っておきたいことが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本すべて開けた。答えが合うかは、そのファイルを作ったソフトで変わる。返すなら、どの部品で保存するかで、相手のファイルが残るかどうかが決まる。
切り上げを、2通りで計算する── 素直な切り上げと、Excel の切り上げ
見積書で見つかった式を、このページの中で計算し直せる。数と桁を変えると、どこでずれが生まれるかが見える。
- コンピュータの答え
- 素直に切り上げる
- Excel の切り上げ
「コンピュータの答え」は有効数字17桁まで出している。「Excel の切り上げ」は、答えを15桁に丸めてから切り上げる。今回の答え合わせで差し替えたのと同じ計算である。
結論── 自分用なら、作れる
エクセルは、人からもらったファイルを開いて計算するところまでなら、ひとりで作れる。無料の部品2つと、6か所の直しで、Excel で作られた62本・数式10万個の答えが99.93%合った。合わなかったのは作成日だけで、これは保存された答えをそのまま見せれば済む。
作る前に想像していた難しさと、実際の難しさは違っていた。関数の数(521)は、ほとんど問題にならなかった。手間がかかったのは、小数の16桁目、引用符の無いシート名、空のセルが0か空欄か、といった、Excel が黙ってやっている小さな約束のほうだった。どれも、実物のファイルで答え合わせをしなければ見つからなかった。
線を引くなら、次の3つになる。見るのは自作でいい。自分で作って CSV や .xlsx で渡すのも自作でいい。人のファイルを直して返すなら、書式を残せる部品を選び、グラフは崩れると先に決めておく。
次の問い:Google 製の14%は、どこまで Excel の言葉に訳せるのか。
ネタもと── 部品・一覧・仕様
- ASheetJS Community Edition
.xlsx と .xls を読み書きする部品。読み込みと、無料版での書き戻しに使った(0.20.3)。 - BHyperFormula
数式を計算する部品(3.5.0)。自分用なら GPLv3 のライセンスで使える。 - CExcelJS
書式を残して書き戻せる部品。書き戻しの比べ相手(4.4)。 - DMicrosoft「Excel functions (alphabetical)」
Excel の関数の一覧。名前を数えて521とした(2つの名前が1行にある7行は2つと数えた)。 - EMicrosoft「Floating-point arithmetic may give inaccurate results in Excel」
Excel が数を有効数字15桁で扱うことの説明。切り上げの直しはこれに合わせた。