Python in Excelが一般公開されたのでお試ししてみた
今回の目的
Python in ExcelをVBAで扱えるのか?
結論
若干苦戦しましたが
簡単に扱えました
内容
サンプルセットが用意されているので今回はその中の"pandasで説明する"をお借りして検証
- データフレーム作成
- 統計情報 (Describe)
の二つが実装されているので、同様のことをVBAで実装してみる
検証コード
Sub test()
Dim dRng As Range
Dim str_CodePy As String
Set dRng = Range("G2")
'式: =PY("sample_df = xl(""IrisDataSet1[#すべて]"", headers=True)",1)
str_CodePy = "=PY(""sample_df = xl(""""IrisDataSet1[#すべて]"""", headers=True)"",1)"
dRng.Formula2Local = str_CodePy
Set dRng = Range("G4")
'式: =PY("sample_df.describe()",0)
str_CodePy = "=PY(""sample_df.describe()"",0)"
dRng.Formula2 = str_CodePy
End Sub
解説
選択セルにPythonコード "sample_df.describe()"を埋め込む
何か所か詰まったのでメモ
- RangeオブジェクトにはFormula2プロパティを使用する
Formulaプロパティではエラーになります
Formula2プロパティは通常のFormulaと違い、スピルなどの動的配列に対応
.describe()の結果も動的に変化するためこちらを使用する
また、テーブルを指定する際、
・ "[#すべて]"と記載するならFormula2Local
・ "[#All]"と記載するならFormula2 でも可
というところが地味に詰まりました
- PY関数 コードの後に ",0"をつける
単純にPY関数の仕様 (ちゃんと把握してませんでした 汗)
第1引数:Pythonコード
第2引数:戻り値の型 (0:Excelの値, 1:Pythonオブジェクト)
データフレームはPythonオブジェクトなので 1 を指定
describe()はセルに書き出すので 0 を指定
- その他
ダブルクォーテーションの数に注意
エスケープも必要なため、イミディエイトウィンドウに書き出すなどして確認が必要
まとめ
VBAでPython in Excelを扱うには、通常の計算式と同じように扱える
Python in Excelの使い方自体がこれから模索する必要はあるが、VBAと併用できるならば幅が広がるなぁって思いました
課題
VBA実行中はPythonの結果が表示されない (#Busy!表示)
下記はいずれも意味がなかった
DoEvents
Application.Wait [Now() + "0:00:01"]
Application.Calculate
何かしら方法がないか探してみたい