Python in Excel は VBAを置き換えることができるのか

結論。無理。

Python in Excel は VBAの代替にはならない

2023年8月23日 Microsoftは Python in Excel を発表しました。

かねてよりOfficeのスクリプト言語がVBAからPythonになるという、まことしやかな噂が流れていたこともあり「なっ、なんだってー!VBA最期の日がついに・・・」と、そのニュースを聞いた私は戦慄と期待を胸にいだき、Excelをアップデートしたのでした。

そして、ざっと触ってみた結果、VBAerの皆さん、ご安心ください。まだ滅亡しません。

Python in Excel とは何なのか

ExcelPython動かすことができるのではなくExcelから・・Python使えるです。

VBAのようにアプリケーションそのものへ介入していろいろやることはできません。あくまでワークシート関数の延長としてセル内に入力したPythonスクリプトが処理した結果をセル内に返しますよ、という機能です。

公式サイトの説明にも”Python in Excel brings the power of Python analytics into Excel.”とあります。訳すと「Python in ExcelはPython分析のパワーをExcelにもたらします」となり、主にPythonのデータ解析系のモジュール群をExcelから扱えることを売りにしています。

入力したPythonスクリプトはMicrosoftのクラウドサーバーで実行されます。要するにWEB-APIを呼んでいます。オンライン環境必須です。動作もかなりもっさりです。個人的な見解ですが、オフラインでもフルスペックで動作するのがExcel+VBAの最強のメリットだと思っているので、これは痛いです。

図にするとこうです。

それと現在はベータテストなので無料ですが、正式版は365とは別のサブスクリプションサービスにするつもりのようです。「あっ、ないわ」ですよね~。

私はデータサイエンティストではないので、ExcelとPythonのデータ解析系ライブラリの連携により、どれほどの恩恵があるのかわかりませんが、私達一般Peopleの用途の範囲では課金してまで使おうという人は少数でしょう。

Python in Excel のはじめかた【ベータ版】

投稿日時点ではMicrosoft 365 Insiderに参加している場合のみ使用できます。Microsoft 365 Insiderでは、まだ試作段階の機能のテスターになることで、Microsoftへ試用情報の提供(自動)をする見返りに最新の機能をいち早く使用できます。が、当然予期せぬ不具合に遭遇する可能性も高まります。よって初期状態では不参加となっています。

Microsoft 365 Insiderに参加するにはExcelを起動して ファイル → アカウント → Microsoft 365 Insiderのアイコンをクリックします。

Microsoft 365 Insiderに参加 画面ですべてに同意のうえチェックを入れて、チャンネルをベータチャンネルにしてOKボタンを押します。Python in Excelはベータチャンネルでしか使えません。

アップデートがはじまりベータチャンネルのプログラムが適用されます。順次適用のようなのでアップデートが来ない場合はおとなしく待ちましょう。

注意書きにも書いてありますが、ベータチャンネルはリスキーです。バグを含んだ更新が適用されるかもしれません。重要な業務を行っているPCでは参加しないほうがよいかと思います。

アップデートが適用されるとPython in Excelが使えるようになります。

Python in Excel の使い方

公式サイトにわかりやすい解説があるのでここではざっくり。

基本はワークシート関数と同じです。適用したいセルを選択して
数式 → Pythonの挿入 → Python in Excel

もしくはセルに直接 =py( と入力します。

数式バーとセルにPYの表示が出たらPythonスクリプトを書けます。

セル値は参照式でスクリプトに呼び込めます。関数と同じくセルをクリックすれば自動入力されます。xl( )の書式がセルの参照を示します。

Pythonスクリプトは数式バーにそのままコーディングしていきます。Enterキーは改行になり、Ctrl+Enterキーでスクリプトを実行できます。結果はセルに表示されます。コードの最終行の結果がセルへの返値となります。

モジュール名などは補完されますが、スクリプトエディタとしては超貧弱なので、別でコーディングしたコードをコピペするのが良いでしょう。

スクリプト実行後のセルには標準では返値がPythonのオブジェクトとして存在しています。カードアイコンをクリックすると持っているプロパティが確認できます。

関数式でPYセルのアドレスにつづけてこれらのプロパティを指定するとそのセルに値を表示できます。

候補からも選べます。

数式バーアイコンから、Pythonオブジェクトではなく単なる文字列、数値として返値を出すようにすることもできますが、再利用性の点からPythonオブジェクトが推奨されています。

配列様のデータは折りたたまれた状態で表示されるので

データの挿入アイコンからarrayPreviewで展開できます。

スピルと同じようにセルに展開されます。

展開したいセルに =PYセルアドレス.arrayPreview と入力しても同じことができます。

データ解析系モジュールを使用してグラフの表示もできるようです。当WEBサイトの範疇ではないのでここではやりません。

Python in Excel の制約

私が使ってみた範囲で気になったのは2点です。まだまだあると思いますが。

1.外部モジュールの制限

Python in Excel はMicrosoftのクラウドサーバー上で実行されます。その環境はAnacondaで構築されています。つまりはAnacondaに含まれていないモジュールは利用できません。

当WEBサイトでは利用頻度の高いqrcodeモジュールでQRコードを作成するコードを実行しようとします。

すると、そんなモジュールねーからエラーがでます。

普段、超高性能IDEを使用しているので、この手のコーディングの段階で判明するエラーに遭遇することは皆無で逆に新鮮でしたが、importしたモジュールが存在しないと言われています。

このように足りないモジュールがあっても、こちらではどうすることもできません。Microsoftが環境内に導入してくれるのを待つのみです。Pythonの優位性がごっそり削られてしまいました。

2.WEBページへリクエストを送れない

requestsモジュールはAnacondaに含まれているので、WEBスクレイピングがセル1つで完結するのではと思いましたが、ダメでした。当WEBサイトへアクセスする次のコードは実行するとエラーになります。当然ながらピュアPythonでは通るコードです。

Connection refused とか retries exceeded とか言っているので、見にいこうとしているがMSサーバーがそれを許さないということでしょうか。踏み台としての悪用防止のため?

後述しますが、ワークシート関数のWEBSERVICE関数を使えばWEBページからExcelのセルにデータを持ってくることができるので、WEBSERVICE関数で取得した文字列をBeautifulSoupでパースするという手法でVBAなしでWEBスクレイピングはできます。

Python in Excel 実践編

データサイエンス分野の活用方法は今後いっぱい出てくるでしょう。ここではそのような高尚な目的では使いません。えぇ、どうでもいい用途に使ってやりますとも。

以前の記事でExcelのセルに気象庁のWEBサイトから目的の日の気象データを引っ張ってくるネタをやりました。まさしくPython in Excelをスタンドアローンでやっていたようなものなので、これを改造します。

シート構成はこうです。水色セルはパラメータ、桃色は途中経過、黄緑色は目的のデータです。

URL(B6)セルには、気象庁の過去データページの目的のエリアと日時が表示されるアドレスになるように各パラメータを埋め込んだ次の参照式を設定してあります。

="https://www.data.jma.go.jp/obd/stats/etrn/view/hourly_a1.php?prec_no=" & B3 & "&block_no=" & B4 & "&year=" & YEAR(B1) & "&month=" & MONTH(B1) & "&day=" & DAY(B1)

このURLに対してWEBSERVICE関数でGETリクエストした結果がRES(B7)セルです。

=WEBSERVICE(B6)

そして今回の主役、Python in Excelは(B8)セルにおられます。スクリプトはこうです。

WEBSERVICE関数の結果をBeautifulSoupでパースして目的のデータを取得しています。詳細は過去記事でご確認ください。

結果はタプルでリターンしているので、(B10)セルの次の式で展開します。

=B8.arrayPreview

別途、Pythonスクリプトファイルを用意することもなく、面倒な連携のVBAを書くこともなくExcelファイル単体で気象庁のデータを利用できました。素晴らしい!

なお、データの更新(=MSクラウドサーバーのレスポンス)ですが、はげしくもっさりです。たぶん新しもの好きの皆さんが試している影響だと思われますが、誇張なしで10秒以上待たされることがあります。

追記 WEBSERVICE関数バグる

突如として、WEBSERVICE関数が#VALUE!しか返さなくなる事象が発生しました。本当に突如です。昨日までちゃんと表示してただろと。

いくらがんばっても復旧しないので、2台のPCで検証して状況としては次の通りです。

  • PC1では#VALUE!しか返さない。
  • PC2では正常にテキストを返す。
  • PC1で作成した#VALUE!のファイルをPC2で開いて更新するとテキストを返す。
  • PC2で正常な状態のファイルをPC1で開いて更新すると#VALUE!を返す。
  • PC1のブラウザで関数で指定しているURLを開くと正常に見える。
  • PC1はInsider参加。
  • PC2はInsider不参加。

ということで、私はExcelアプリケーションの欠陥と判断しました。同じ症状に遭遇した方がいた場合のため共有しておきます。

思い当たる節は、セキュリティの警告で「Webサービス機能を無効にしている」という表示が出たときに、×でメッセージを閉じたら、以降、一切確認されなくなったことでしょうか。

ファイル名を変えて、もう一度警告を出して「コンテンツの有効化」を押してみたり、トラストセンターで設定を変えてみたりしたのですが効果なし。

やむなく365のオンライン修復を実行したら、途中で見たことないエラーが出てOfficeの全アプリが削除された状態で放置されてしまったので、はじめからインストールしなおしたあと、件のExcelファイルのWEBSERVICE関数を更新したら正常なテキストが返ってくるようになっていました。

その後、Insiderプログラムを再度適用したら無事エラーが出る状態に戻りました。おまえか!何で最初は問題なかったんだ・・・。Webサービス機能無効のフラグがどっかに立ったままなのか?

最後にダメ元でInsiderの配信チャンネルをベータ→最新に変更してみたら、なんと正常になりました。ということでやっぱベータチャンネルなんだなと。ひととおりPython in Excelで遊んだら最新チャンネルにも~どそっと。

まとめ

365サブスクリプションに標準搭載なら使わなくもないかなぁ。別途料金発生なら「ない」ですね。これがクラウドではなく、スタンドアローンで自分の持っているPython環境と連携できるだったら課金してしまうかも。

Microsoft様、Pythonの始祖の開発者殿もゲットされたのですから、さっさとWindowsにPythonをバンドルすれば良いのでは??

おわり。

Microsoftによる概要説明サイト

Excel での Python の概要 - Microsoft サポート
Excel スプレッドシート データ内で直接 Python 関数の使用を開始します。