マイクロソフトの無償RPA(自動化ツール)である「Power Automate Desktop(PAD)」で、Excel関数の実行結果を取得する方法ついて解説しています。
今回の解説は一部プログラミング知識を前提とした表現や、技術的な前置きがわかる方向けの書き方になっている(あまりかみ砕かずにそのまま書いている)内容が含まれています。
初めてPower Automate Desktopに触れる方やこれからRPAツールでのプロセス自動化にチャレンジしてみたいかたは、以下でも解説を行っていますのでご覧になってみてください。
Excel関数を実行する
Power Automate Desktopでは、Excelファイルを開いたり、ワークシートの内容を読み取ってセルの内容を処理したりなど、Excelをコントロールするためのアクションが豊富に用意されています。
しかしながら、これらはあくまでExcelを遠隔操作(ファイルのオープンやクローズ)して必要なデータ(データテーブル)を取り出すための用途が中心のアクションとなっているため、セル単位のワークシートの編集や、関数を使った応用などを行うようなものとは構成が異なっています。
例えば、Excelの特定のセルの値を何らかの関数を使って加工する、のようなExcelの関数自体をそのままワークシートの処理に関与させることなどができません。
ここでは代わりに別のアクションを使ってExcel関数の値を取得するサンプルをご紹介します。
Excel関数を実行するフロー
ここではExcel関数を実行するサンプルとして、テキスト変数に格納されたExcel関数の文字列(LEFT関数)を使って文字列を取り出すサンプルテンプレートをご紹介します。
実行するExcelの関数は以下です。
LEFT("あいうえおかきくけこ",5)
LEFT関数は指定された値(文字列)の左からn文字を取り出すための関数で、今回は「あいうえおかきくけこ」という文字列の左から5文字(あいうえお)を取り出す例としています。
サンプルフロー
サンプルフローのスクリーンショットです。
Robinソースコード
サンプルフローのRobin言語ソースコードです。
コピー&ペーストで貼り付けることで、お手元のPower Automate Desktopで動作を確認することができます。
SET ExcelFunction TO $'''LEFT(\"あいうえおかきくけこ\",5)'''
System.RunPowershellScript Script: $'''$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $False
$book = $excel.Workbooks.Add()
$book.Sheets(1).Name = \"temp\"
$sheet = $book.Sheets(\"temp\")
$sheet.Range(\"A1\") = %ExcelFunction%
echo $sheet.Range(\"A1\").Text
$excel.Quit() ''' ScriptOutput=> ExcelFunctionResult ScriptError=> ScriptError
Display.ShowMessage Title: $'''Excel関数実行結果''' Message: ExcelFunctionResult Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
フローの共有、共有されたコードの利用の詳細については作成したフローを他のユーザーに共有する方法でも解説しているので、併せてご参照ください。
アクション解説
各アクションの設定について解説します。
変数の設定
Excelの関数を記述するための変数をひとつ用意します。
変数名は%ExcelFunction%
としておき「宛先」に具体的な関数を記述します。
この時、Excelのセルに入力するときのような=
は記述しません。(今回の例では次のアクションに記載していますが、代わりにこちらに=
を書いても問題ありません)
PowerShellスクリプトを実行
そして、Excelの実行はPowerShellスクリプトを通じて行っています。
実行するPowerShellコードは以下のようにしています。
$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $False
$book = $excel.Workbooks.Add()
$book.Sheets(1).Name = "temp"
$sheet = $book.Sheets("temp")
$sheet.Range("A1") = ’=%ExcelFunction%'
echo $sheet.Range("A1").Text
$excel.Quit()
テンポラリのExcelインスタンスを作って、変数の関数をA1にいれて、結果(Text)プロパティを返す。という流れです。
PowerShellの出力はPower Automate Desktopに戻り値として変数に格納されるため、変数名を%ExcelFunctionResult%
という変数名で保管しています。
これを書くぐらいなら初めからPowerShellでExcel全部自動化すればいいじゃない、と思いますが、このアクション単体は他のPower Automate Desktopにそのままコピペして流用が効くので、テンプレート的に用意しておけばどこかで使い道があるんじゃないかと思って作ってみました。
メッセージを表示
このアクションではシンプルに結果(%ExcelFunctionResult%
)を表示するだけのものになっています。
関数の結果が正しく取得できていれば「あいうえお」のダイアログボックスが表示されるはずです。
応用次第、、、かも?
今回のポイントを挙げるとすると、「PowerShellスクリプトを実行」アクションで指定するソースコードはコードの実行前に評価されるので、PADの変数などを使って内容を動的に変化させることができます。
もちろん変数も同様なので、別で取得したデータテーブルなどの処理の際に関数の文字列を作り、PowerShellのアクションを挟むことで、疑似的にExcelに処理させたデータを使う、みたいなことができそうな感じです。
(下記は関数の内容も別の変数で変更する例)
SET Count TO 3
SET ExcelFunction TO $'''LEFT(\"あいうえおかきくけこ\",%Count%)'''
System.RunPowershellScript Script: $'''$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $False
$book = $excel.Workbooks.Add()
$book.Sheets(1).Name = \"temp\"
$sheet = $book.Sheets(\"temp\")
$sheet.Range(\"A1\") = \'=%ExcelFunction%\'
echo $sheet.Range(\"A1\").Text
$excel.Quit() ''' ScriptOutput=> ExcelFunctionResult ScriptError=> ScriptError
Display.ShowMessage Title: $'''Excel関数実行結果''' Message: $'''%ExcelFunctionResult%
%ScriptError%''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
実際メンテナンスなども面倒なのであまり活躍の機会もなく、Excelの関数周りの処理はのちのち標準のアクションに追加されそうな気もしますが、応用のアイデアとしてご参考までに。
コメント