いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Python in Excel)長い桁の計算をする

 Excelでは数値として正確に扱える桁数が限られており、例えばセルに16桁以上の数値を入力すると16桁目以降が0に変更されてしまいます。しかしPython in Excelを利用することで16桁以上の計算も正確に行うことができます。ただし結果を数値として受け取っても正しく表示させることはできないので、文字列として表示させます。

手順

 次の画像ではB3セルに数式を入力し、32桁の数値と10桁の数値の2つの数値の足し算を行っています。

 B3セル(Python in Excel)

str(12345678901234567890123456789012+5019583393)

 入力手順は次のようになります(2,3は順不同)。

  1. B3セルに「=PY(」と入力、または数式タブから「Pythonの挿入」を選択してセルを変化させる。
  2. 数式バーの左にあるアイコンをクリックして「Excelの値」を選択(に変わる)
  3. 上記の式を入力してCtrl+Enterで確定する。

 Pythonでは簡単に長い桁の計算ができるのですが、そのままセルに数値として出力しようとするとExcel側の都合で通常の指数表示に変換されてしまいます。
 そこで文字列に変換したうえでセルに出力しています。「str()」を付けずにアイコンをのままにしてオブジェクトのまま受け取り、そこから文字列を取得する方法もありますがここでは省略します。



 次の画像はカンマを入れた結果を取得する例です。

 B3セル(Python in Excel)

format(12345678901234567890123456789012+5019583393,',')

 カンマの入れ方はいくつかありますが、そのうちの1つとしてformatを使った例です。



 次の画像はセル内に入力された数字(文字列として入力しています)の足し算を行う例です。
 なお、A4セルのプラスの記号は単なる表示用(飾り)です。

 B3セル(Python in Excel)

str(int(xl("B3"))+int(xl("B4")))

 セルの文字列を数値に変換して足し算を実行し、また文字列に戻しています。



 次の画像ではB3:B7の範囲の数字(文字列)を合計しています。

 B3セル(Python in Excel)

str(sum([int(i) for i in xl("B3:B7").unstack()]))

 Excelの感覚で「sum(int(xl("B3:B7")))」などとやりたくなりますが、これはうまくいきません。
 「[int(i) for i in xl("B3:B7").unstack()]」の部分で、配列を1次元に変換(pandas.DataFrame→Series)して各文字列を数値に変換しています。あとはsumで合計してstrで文字列に変換しています。
 リスト内包表記([ ]の部分。for文に相当)のおかげで1行で済んでいますがなかなか面倒です。ただしもうちょっと簡単にできるかもしれません。



 Pythonの仕様上は桁数の上限はないので、次のような長桁の値も余裕で出力できます。実際にどこまでできるかは試してませんが、セルの文字数制限の方がネックになりそうです。
 なお、「**」がべき乗の記号です。

 

 ちなみに引き算は「-」、割り算は「/」、整数商は「//」です。
 次の画像では割り算と整数商は「//」を試していますが、小数(込み)の計算では大した精度が出ないので注意してください。精度を高めて計算する方法もありますが本記事では省略します。