[完全自動化]openpyxlで数式(関数)が消える原因と対処法[Python]

スポンサードリンク
アイキャッチ Python
過去の自分
過去の自分

openpyxlでエクセルを編集していたら、なぜかセル内の数式が消えた…。
原因と対処法を教えて!

今の自分
今の自分

了解!
完全自動で解決できる対処法も紹介いたします!

【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

スポンサードリンク

openpyxlで数式が消える原因

原因として考えられるのは以下の2つです。

  • 自動で数式を書き込んでいる
  • 自動で値貼り付けを行っている

この「自動で」というのは、「openpyxl」などを使って行っているということです。
上記のどちらも心当たりがあるのではありませんか?

両方とも当てはまれば、数式が消える可能性があります。
では本当に数式が消えるのか検証してみましょう。

数式が消えるのか検証

まずはわかりやすくするために、真っ白のエクセルファイルを用意しました。

▼input.xlsx

見本

それでは、下記コードを実行して、A1セルに数式を書き込んでみます。

import openpyxl

wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']

ws['A1'] = '=B1'

wb.save('output.xlsx')
見本

まだ数式はあります。数式を書き込んだばかりですので、当然ですね。
ではこの数式を値貼り付けしてみましょう。

import openpyxl

wb = openpyxl.load_workbook('output.xlsx', data_only = True)

wb.save('output2.xlsx')
見本

A1セルの数式が消えました。

やはり「数式の書き込み」「値貼り付け」の両方を自動で行うと数式が消えるようです。

では、どうしたら回避できるのでしょうか?
次項で対処法を紹介いたします。

スポンサードリンク

openpyxlで数式が消える場合の対処法

対処法は以下の3つです。

  • 「数式の書き込み」または「値貼り付け」を手動でする
  • 値貼り付け前に、手動でエクセルを開いて保存する
  • xlwingsを使うオススメ!

1つ1つ解説いたします。

「数式の書き込み」または「値貼り付け」を手動でする

前項で「数式の書き込み」と「値貼り付け」の両方を自動で行うと数式が消えるとお伝えしました。
なのでどちらかを手動で行えば数式は消えません。

とはいえ、それでは自動化の意味がほとんどないですよね。
どうしても残りの対処法ができないならやってもいいとは思いますが、
ひとまず2つ目の対処法を見てみましょう。

値貼り付け前に、手動でエクセルを開いて保存する

こちらの対処法なら「数式の書き込み」と「値貼り付け」のどちらも自動で行うことができます。
手順は下記のとおりです。

  1. 自動で数式を書き込む
  2. (手動でエクセルを開き、なにもせずに保存する)
  3. 自動で値貼り付けする

う~ん、どちらも自動でできるとはいえ、間に手動の作業が入ってしまっています。
こちらも第2候補にとどめておいた方がいいです。
では、本命の3つ目を見ていきましょう。

xlwingsを使う

1つ目と2つ目はどちらも手動操作が入るため効率的ではありません。
こちらの「xlwings」を使う方法は、2つ目の「エクセルを開いて保存する」を自動で行ってくれるというもので、一番効率的です。

少し長くなりますが、コードを見ていきましょう。

#これ以前に、数式書き込みのコードを記述

import xlwings

excel = xlwings.App()
workbook = excel.books.open('input.xlsx')
sheet = workbook.sheets['Sheet1']
workbook.save()
workbook.close()
excel.quit()

#これ以降は、値貼り付けのコードを記述

では、やっていることを要約します。

5行目:エクセルを開く
6行目:ワークブックを開く
7行目:ワークシートを開く
8行目:ワークブックを保存する
9行目:ワークブックを閉じる
10行目:エクセルを閉じる

「エクセルを開き、なにもせずに保存する」というのを自動で行っていることがわかります。

これで数式が消えることはなくなり、自動化も継続できるようになりました。

見本

xlwingsを初めて使う場合、インストールが必要となります。
まずは下記コードを実行して、インストールを完了させてください。

pip install xlwings

詳細は下記記事で解説しております。

スポンサードリンク

最後に

openpyxlで数式が消える場合の原因と対処法を解説いたしました。

openpyxlを使った自動化を目指す人なら必ず経験する問題ですので、珍しいことではありません。
今回ご紹介した対処法をお試しください。

当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました