Excelを使って日々行っている集計作業を自動化しようと考えました。意気揚々とPythonのopenpyxlを使い始めた時のことです。コード自体はエラーも出ません。完璧に動いているように見えました。ところが、出力された結果を確認して、私は自分の目を疑ったのです。
本来であれば合計金額や計算結果が入っているはずのセルがあります。それがすべて「None」という空っぽの状態になっていたのです。計算式が壊れてしまったのでしょうか。それともファイルが破損したのかと血の気が引きました。この「数式セルがNoneになる問題」は非常に有名です。openpyxlを使い始めた初心者が必ずと言っていいほどぶつかります。誰もが経験する大きな壁だったのです。
調べているうちに、openpyxlの仕様として「数式は計算しない」というシンプルな事実にたどり着きました。知ってしまえば対処はできます。ただ、知るまでがしんどかったので、同じ場所でつまずいている方に向けて、自分が試したことをそのまま書いておきます。
初自動化、Noneの衝撃
初めて自分だけの自動化ツールを完成させたときのことです。私は大きな達成感でいっぱいでした。しかし、実際にそのツールで読み込んだ集計結果を確認します。その瞬間、心臓が止まるかと思いました。画面に並んでいたのは、待ち望んでいた売上合計の数字ではありません。冷淡な「None」という文字の羅列だったからです。
毎日2時間かけて手作業で作成していた売上報告書があります。これをPythonで一瞬で終わらせようと張り切ってコードを書きました。ところが、実行してみると一番大事な「当月合計」のセルがおかしいのです。すべてNoneになっていて、計算が1円も合わない事態に陥りました。ファイルが壊れたのかと思い、バックアップを何度も確認します。しかしExcelで開くと正常に表示されるため、原因がわかりません。深夜まで頭を抱えることになってしまいました。

ExcelとPythonのギャップ
実は、この現象はコードの書き間違いではありません。ライブラリの仕様によるものだったのです。当時の私は、openpyxlの機能を信じ切っていました。Excelの画面で動いているものがそのままPythonでも動くと思ったのです。ところが、実際には「見えるはずのものが見えない」ギャップが存在します。
この時、私は「PythonがExcelファイルを読み込む」行為について考えました。私たちが手動でファイルを開くのとは全く異なる仕組みで動いています。
openpyxlの数式計算機能不足
なぜ、Excelで計算されているはずの値がNoneになってしまうのでしょうか。その答えは非常にシンプルなものでした。実は、openpyxlに機能が不足しているのです。「数式を計算する機能」が備わっていないのです。
Excelの計算エンジンが処理できる関数は数百種類あります。一方で、openpyxlが自前で計算できる関数は0種類です。
つまり、数式が入っているセルの中身を実際に確認してみると、私は正直ぽかんとしました。そこには「=SUM(…)」という文字列しか入っていません。計算結果としての「数字」が存在する条件は限られています。Excelが気を利かせて「一時的なキャッシュ」として保存している場合のみです。

そのため、特別な設定をせずにファイルを読み込むと問題が起きます。openpyxlは「数式そのもの」を読み取ろうとします。しかし、読み取る側が計算の仕方を知りません。結果として「値はまだ決まっていない」と判断されてしまうわけです。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。
data_only=True:計算値の取得条件
原因がわかれば、しっかりとした対策があります。openpyxlには、便利なオプションが用意されています。数式ではなく「計算済みの値」を優先して取得するための機能です。それが、load_workbook関数を使う際に指定する引数になります。追加するのは「data_only=True」という引数です。
data_only=Trueという一行を見つけたときのことです。これでもう勝ったと思いました。早速コードに書き加えて実行してみます。それまでNoneだったセルにしっかりと数字が入るようになりました。あまりの嬉しさに、その日は同僚に少し自慢げに話してしまいます。「PythonでExcelの数式も完璧に制御できるようになった」と伝えました。しかし、その自信は数時間後にまた打ち砕かれることになります。
Excel計算結果の利用と条件
このオプションを指定すると、openpyxlは内部の情報を探しに行きます。セルの中に保存されている「最後にExcelで保存したときの計算結果」です。これによって、あたかもPythonが計算してくれたように振る舞います。無事に目的の数値を取得できるようになるわけです。

ただし、これには非常に重要な「条件」があります。そのExcelファイルが特定の状態である必要があります。「一度でもExcel本体で開かれ、計算が実行された状態で保存されていること」です。
Excel数式、Pythonで書くと値は空
せっかくdata_only=Trueを使ったのに、なぜかまだ値が取れません。そんな状況に陥ることがあります。実は、Excelの数式には「再計算」のタイミングというものがあります。ファイルが保存された瞬間にすべての値が確定するわけではありません。常にキャッシュされているとは限らないのです。
手動でExcelを開いてCtrl+Sを押すだけなら1回30秒もかかりません。ただ、毎日の作業として積み重なると、自動化の意味が薄れてきます。
特に、Pythonのプログラム自身がExcelファイルを作成した時が厄介です。そこに数式を書き込んだ直後の処理を考えてみましょう。同じプログラム内でその値を読み取ろうとする場合にこの問題が発生します。openpyxlで数式を書き込んでも、その場ですぐには計算されません。それはただの「テキスト」としてセルに置かれるだけです。
本末転倒な手動保存
そのため、そのファイルをすぐに読み込み直しても意味がありません。中身はまだ空っぽのままなのです。これを解決する最も確実な方法は、少し皮肉な結果となります。「一度Excelで手動で開いて上書き保存すること」なのです。こうすることで、Excelの強力な計算エンジンが走ります。セルに正しい値がしっかりと刻印されることになります。
しかし、自動化が目的なのに「手動で開いて保存してね」というのは不便です。あまりにも本末転倒と言えるでしょう。
PythonでExcel裏操作:威力と課題
どうしても手動でExcelを開きたくない場面があります。そんなとき、私はいくつかの代替案を試してみました。最も強力だったのは、Windows環境に限定される方法です。pywin32(pywin32-ctypes)というライブラリを使います。バックグラウンドで本物のExcelをこっそり起動させるというテクニックです。
この方法を使えば、Pythonから「本物のExcel」にアクセスできます。「このファイルを開いて、再計算して、保存して閉じて」という命令を送るのです。これなら、openpyxlでは不可能な「数式の実行」を完璧に自動化できます。

もちろん、この方法にも明確な弱点が存在します。Excelがインストールされているパソコンでしか動かないということです。しかし、社内の事務作業用のパソコンであれば、大抵はExcelが入っています。そのため、この「本物のExcelを裏で操る」という力技は効果的です。非常に実用的な解決策になりました。
Excel機能のPython代替と高速化
サーバー上で動かすスクリプトではExcelが使えません。pywin32が動かなくて絶望したこともありました。結局、その時は数式で計算するのを完全に諦めます。Python側で同じ計算ロジックを実装するように書き換えました。単価×数量などをプログラム内で処理したのです。処理速度が5倍以上に跳ね上がったのは大きな収穫でした。
openpyxlとpandasの賢い使い分け術
最近の私がたどり着いた最終的な答えがあります。「openpyxlとpandasを賢く使い分ける」という戦略です。実は、データ分析で有名なライブラリであるpandasが役立ちます。read_excel関数を使うと、数式の計算結果をよりスムーズに取得できるのです。その場面が意外と多いことに気づきました。

一方で、セルの色を変えたり、罫線を引いたりする場面もあるでしょう。そうした「見た目の装飾」が必要な場合は、引き続きopenpyxlが主役になります。私は「データの計算や抽出はpandas」というルールを決めました。そして「帳票としての仕上げはopenpyxl」という役割分担をしています。これを徹底することで、数式問題に悩まされる時間を大幅に減らすことに成功しました。
この使い分けを覚えたことで、私の意識も変わりました。以前のように「Noneが出てきたから今日はもう終わりだ」と落ち込みません。パズルのように組み合わせることこそが、非エンジニアにとって大切です。
Excel読み込み解決ルーティン
私がたどり着いた順番としては、まずdata_only=Trueを試して、それでもNoneが続くなら「そのExcelファイルをExcel本体で一度も開いていないかも」と疑うのが早かったです。それでもどうにもならないときはpandasのread_excel()を試す、というのが今のルーティンになっています。
無料プレゼント
Excel業務を自動化する前に確認するチェックリスト(PDF)
自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。
¥980 ミニキット
コピペで動かせる3スクリプト+自動化チェックリスト
最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。
関連リンクとチェックリスト
関連記事
ExcelをPythonで操作し始めたとき、openpyxlより先に詰まりがちな環境構築の話です。
関連書籍
Python業務自動化関連書籍を、手元で見返せる形にしておきたい場合
Pythonやデータ処理の自動化は、作りながら同じ基礎を何度も確認する場面が多いです。手元で見返せる本があると、調べ直しの時間を減らしやすいです。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。
[アンケート] この記事は役に立ちましたか?

