Python in Excel ってどんなもの？

この記事は[NTTコムウェア Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nttcomware)の14日目の記事です。

# はじめに
こんにちは、NTTコムウェアの北山です。普段の業務では Azure などの Microsoft のサービスを用いた開発や技術的なサポートを行いつつ、業務外ではサーモンランでたくさんのシャケからイクラを手に入れています。

最近は生成 AI に関わるサービスが数多くリリースされており、Microsoft においても同様に Azure OpenAI Service や Copilot などのサービスがリリースされています。そんな中、生成 AI とは異なる分野でも動きがありました。

# Python in Excel

Microsoft は、2023年8月22日に Python in Excel をパブリックプレビュー版でリリースしました。2023年12月1日時点でも継続してパブリックプレビュー版として公開されています。

https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439

## まとめ
* Excel 上で pandas や matplotlib などを用いて、データの加工やプロット、ビジュアライゼーションを行うことができる
* Python は**クラウド**で実行される
   * ローカルで Python を実行することやローカルのファイルへのアクセスはできない
* Python in Excel のユースケースを考える際には、**(自動化ではなく)分析に重点を置いたもの**であること、コードをシンプルに短く記載できるものであることが重要

## 概要
Python in Excel とは、その名の通り、Excel で Python を実行できる機能です。
セルに直接 Python のソースコードを入力することで、Python が Microsoft Cloud で実行され、データの加工やプロット、ビジュアライゼーションを行うことができます。

例えば、下記のように Python in Excel を用いてプロットやビジュアライゼーションを行うことができます。

1. scikit-learn でデータを取得して、テーブルで表示(A1セル)
1. pandas で要約統計量をテーブルで表示(F1セル)
1. matplotlib で散布図を表示(F11セル)

![sample_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635196/bbc2bdf4-a863-f9bd-e9fe-d769a2cb4281.png)

```py:A1セル
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
```

```py:F1セル
df.describe()
```

```py:F11セル
import matplotlib.pyplot as plt
plt.scatter(xl("A2:A151"), xl("B2:B151"))
plt.xlabel('sepal_length (cm)')
```

### 利用方法
2023年12月1日時点では、パブリックプレビュー版であるため、[Microsoft 365 Insider Program の展開](https://learn.microsoft.com/ja-jp/deployoffice/insider/deploy/options)が必要です。
筆者は、[レジストリコマンドを使用する方法](https://learn.microsoft.com/ja-jp/deployoffice/insider/deploy/registry)で展開を行っています。下記の記載があるため、個人的に利用する場合は、こちらの方法がおすすめです。
> Microsoft 365 Insider を必要とするデバイスがほんの一部しかない場合は、この方法を使用することをお勧めします。

```powershell
reg add HKLM\Software\Policies\Microsoft\office\16.0\common\officeupdate /v updatebranch /t REG_SZ /d BetaChannel
```

また、[リリース記事に記載されている情報](https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439/page/4#:~:text=While%20in%20Preview%2C%20Python%20in%20Excel%20will%20be%20included%20with%20your%20Microsoft%20365%20subscription.%20After%20the%20Preview%2C%20some%20functionality%20will%20be%20restricted%20without%20a%20paid%20license.%20More%20details%20will%20be%20available%20before%20General%20Availability.)によると、パブリックプレビュー終了後は、一部の機能は有償ライセンスがないと制限される予定で、詳細は一般提供開始前に公開するとされています。

>While in Preview, Python in Excel will be included with your Microsoft 365 subscription. After the Preview, some functionality will be restricted without a paid license. More details will be available before General Availability.

### Python の挿入
セルに｢=PY｣と入力するか、[数式] タブ - [Python の挿入] をクリックすることで、Python のソースコードを記載できます。

![insert_python_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/2a1b4285-e87b-314e-2153-3713de82aece.png)

![insert_python_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/c0814f55-4be0-b574-6db6-090c84fed2c2.png)

### 実行結果の表示
Python コードの実行結果はセルに出力されます。 Python は、テキスト、数値、画像、Python オブジェクトといった複数のタイプの出力を持つことができ、これらはすべてセルの内容として出力できます。

![result_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/0508e44f-e90f-b0f3-72eb-52df43454d3f.png)

pandas.DataFrame (二次元の表形式のデータ) や二次元の list などは、自身のセルだけでなく、データの形状に合わせて他のセルにも展開されて表示されます。
例えば、A1 セルの 2 × 2 の list は、A1 セルだけでなく、A2, B1, B2 セルに展開されて表示されます。

![result_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/8a2ee287-b242-a015-0d78-c8a04ec51580.png)

また、表示形式は 2 つから選択できます。
[Excel の値] を選択すると、上図のようにテキストなどが各セルに出力されます。
[Python オブジェクト] を選択すると、下図のように Python オブジェクトの型が表示されます。

![result_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/cd3d5104-27a7-c91c-f315-f1fbfd7c8e14.png)

![result_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/f4bfad7c-9816-9404-9ffb-71fff75393dc.png)

なお、コードが出力を生成しない場合 (例えば、import 文しか含まない場合など)、セルに ｢None｣ と表示されます。

![result_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/d304e9e2-727a-b84b-c96c-cd2ab3902e9b.png)

### 実行順番
Python コードは、どのセルにも入力することができ、実行順番は最初のワークシートの A1 セルから始まり、行順で進みます。
下図は、A1 セルで ｢x = 1｣ として、B1 セル以降は ｢x += 1｣ で x をインクリメントしています。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/b63c54c3-8691-cd59-d83b-9af8dd61ed5c.png">

また、1 つのセルの Python を実行すると、ワークブック全体のセルの Python が基本的に実行されますが、 [計算方法の設定] を [自動] から [手動] へ変更することで、ワークブック全体のセルではなく、1 つのセルの Python を実行することができます。

![order_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/51e7c4b5-4dfc-7ab8-a1fb-3837aa8ab70a.png)

例えば、A1 セルで ｢x = 1｣ を実行した後に、A5 セルで ｢x + 10｣ を実行すると、 [自動] の場合は 19 と出力されますが、 [手動] とすると 11 が出力されます。

![order_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/863ee701-8b71-d6dc-e09b-eea367a4d435.png)

ただし、[Anaconda の Python in Excel についての記事](https://www.anaconda.com/blog/5-quick-tips-for-using-python-in-excel#:~:text=5.%20Use%20Python%20to%20Create%20Custom%20Logic%20in%20Excel)によると、Excel における Python の基本的な実行モデルは、グローバルな名前空間を想定しており、行順で実行することを前提としています。そのため、基本的には [計算方法の設定] を [自動] とすべきと考えられます。
いくつかのセルに Python コードを記載する形になることが予想されるため、｢手動で特定の順序で実行する必要がある｣ような形となってしまうと、保守が困難です。

> We can define Python functions in a cell, and those functions can then be reused in multiple cells throughout the entire workbook. In fact, the underlying execution model of Python in Excel assumes a global namespace shared among each cell. The execution order starts in the top-left cell of the first worksheet and proceeds in a row-major fashion.

### 利用できる Python ライブラリ
Python in Excel の実行環境は Anaconda を用いています。そのため、Anaconda に含まれている Python ライブラリを基本的に利用可能です。
また、numpy や pandas などのライブラリは予めインポートされています。 [初期化] をクリックすると、予めインポートされているライブラリを確認できます。

![initiate_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/bf0cb503-f4e3-6266-ba46-4dcea0e268a5.png)

### コンソールへの出力
print() の出力やエラーメッセージなど、通常はコンソールへ出力されるものは、[診断]というパネルに表示されます。

![console_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/7be371e4-cc1d-ac28-c8c7-e1e39242308c.png)

![console_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/0f61dc42-bcf9-e999-30b3-dff6d128a9d8.png)

## ベストプラクティス
Anaconda が [5 点の Tips](https://www.anaconda.com/blog/5-quick-tips-for-using-python-in-excel) を公開しており、その中で Python in Excel を用いる際のベストプラクティスについて記載されており、重要だと考えられるので、本記事でも取り上げます。

### ソースコードは最小限に！
コードエディタや統合開発環境 (IDE) で Python コードを書くことと比べると、Excel は Python コードを書き難いです。しかし、Excel で Python を扱う主な目的は、Python コードを開発することではなく、Excel (データ) を用いて強力なデータ洞察を生み出すことです。
このことを念頭に置くと、Python コードは最小限とすることが望ましいです。また、Python コードを短くしてシンプルなセルにすることで、保守が容易になります。

### 常に値を出力する(None としない)
前述したように、Python は、テキスト、数値、画像、Python オブジェクトといった複数のタイプの出力を持つことができ、これらはすべてセルの内容として出力できます。逆に、コードが出力を生成しない場合 (例えば、import 文しか含まない場合など)、セルに "None" と表示されます。
しかし、セルの出力が "None" であると、そのセルで何が行われているか分かりませんし、他の人にはエラーのように見えるかもしれません。

この理由から、もし Python コードが出力を生成しない場合は、下記のように文字列を出力することが適切です。

![output_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/1fcc16df-4826-ff8b-6dd1-7670deff8030.png)

## その他あれこれ
### Python をクラウドではなく、ローカルで実行できるか(ローカルで実行できるようにする予定はあるか)
ローカルでは実行できません。また、[今後ローカルで実行できるようにする予定も無い](https://techcommunity.microsoft.com/t5/microsoft-365-blog/introducing-python-in-excel-the-best-of-both-worlds-for-data/bc-p/3909186/highlight/true#M8268)とのことです。

> there are currently no plans to allow Python code to be run locally and it will require an internet connection.

上記のリンク記事のコメントを見ても、ローカルで実行したい人が多いみたいです。ただ、それらのコメントに対して、Excel を他の人に共有したときに各人のローカル環境で Python を実行できるようにするための管理は大変であるし、セキュリティ面を考えてもクラウドで実行する方が良いと回答しています。

### Python から外部(ローカルファイルやインターネットなど)へ直接アクセスできるか
Python in Excel はローカルファイルへアクセスできないため、ローカルファイルへの出力などはできません。
また、requests や urllib など使用したインターネットへのアクセスもできません。

ローカルファイルやインターネットから外部データを取得したい場合は Power Query を利用してデータを取得してから、Python in Excel でそのデータへアクセスします。
なお、scikit-learn などの Python のライブラリを用いて、データへ直接アクセスできる場合は、Python in Excel でデータを取得可能です。

### Excel で使えるコードエディタは無いの？
Excel labs というアドオンをインストールすることで、コードエディタとして利用できます。

![editor_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398440/6518e6d3-29a3-4178-a543-b92aebc6ad9a.png)

https://techcommunity.microsoft.com/t5/excel-blog/introducing-the-python-editor-from-excel-labs/ba-p/3928986

上図のように、各セルの Python コードが表示され、コードを書くことができます。また、行順に上から表示されるため、実行順番の確認も行えます。

### Python in Excel は、 VBA の代わりってこと？
Python in Excel は [VBA の代わりではありません](https://techcommunity.microsoft.com/t5/microsoft-365-blog/introducing-python-in-excel-the-best-of-both-worlds-for-data/bc-p/3909186/highlight/true#M8268:~:text=we%20don%27t%20intend%20this%20feature%20to%20be%20an%20alternative%20or%20replacement%20for%20VBA)。
自動化ではなく、分析に重点を置いています。

> we don't intend this feature to be an alternative or replacement for VBA

> Our current focus, as detailed in our announcement post, is centered around analytics scenarios rather than automation scenarios.

自動化については、 [Office スクリプト](https://learn.microsoft.com/ja-jp/office/dev/scripts/)を利用できます。

# おわりに
改めて、まとめを再掲します。

* Excel 上で pandas や matplotlib などを用いて、データの加工やプロット、ビジュアライゼーションを行うことができる
* Python は**クラウド**で実行される
   * ローカルで Python を実行することやローカルのファイルへのアクセスはできない
* Python in Excel のユースケースを考える際には、**(自動化ではなく)分析に重点を置いたもの**であること、コードをシンプルに短く記載できるものであることが重要

ここからは所感です。

今まで、[OpenPyXL](https://openpyxl.readthedocs.io/en/stable/index.html) や [xlwings](https://docs.xlwings.org/ja/latest/index.html) 、[pandas](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html) などの Excel を扱う Python ライブラリが使われてきました。これらのサードパーティーのものだけではなく、公式のものとして Python で Excel を扱えるようになったことは大きいのではないでしょうか。
Python in Excel は自動化向けではないので、自動化においては前述の Python ライブラリなどを用いて実施し、Excel (データ) を用いた分析においては Python in Excel を用いるような形になるのかなと思っています。

記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。

# 参考

https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439/page/4#comments

https://www.anaconda.com/excel