Power Automate DesktopでExcelの表データを扱う

Power Automate Desktopのデスクトップレコーダーは簡単に利用できますが、人間が操作した作業を自動記録するだけです。つまり人間にできる作業以上のことを記録、自動化できません。

これは劇的な業務効率化をなしとげるには必要不可欠な繰り返し・条件分岐といったロジックを組み込むことはできないということを意味します。そこで今回はフローを直接編集することで繰り返し処理を組み込んでみます。

フローを自動記録なしで作成する

さっそく、新規フローを作成しましょう。デスクトップレコーダーの自動記録は使いません。Power Automate Desktopを起動したら新しいフローボタンを押します。フロー名は適当に決めます。

フロー編集画面になります。ここの左ペインにズラッと並んでいるのがアクションと称するもので、Power Automate Desktopができること一覧です。

デスクトップレコーダーはユーザーの操作に応じて自動的にこのアクションからピックアップして記録しているわけです。

アクションをざっと見ていくだけでも、いろいろ企むには十分な機能がそろっていて夢が広がりんぐですが、その中でも我らがExcelは特別扱いで専用のアクションが用意されています。グループ化されているので展開してみると

基本的なことをするには申し分なさそうですね。マクロの実行というアクションがあるので、最終手段としてマクロでゴリ押すという本末転倒RPAもできるんじゃないでしょうか。

では、今回の本題です。

Excelの表からWEBページを開くRPA

手持ちに過去のネタで使用した次のようなExcelファイルがあったので、これを使います。

さいたま市の区のWEBサイトURLです。RPAを使うからには複数アプリ間の連携をやりたいので、このExcelの表からURL列のアドレスを順次読み取りブラウザでそれぞれをタブとして開いてみます。

フローにしやすいように処理をステップ単位にして書くと

1.Excelを開く
2.シートの表範囲を取得する(1行目はタイトル)
3.ブラウザを開く
4.表データを1行読み込む
5.ブラウザに新しいタブを作成して表のURL列に入力されているURLを開く
6.表データの次の行へ移動し4へ戻る

となります。

事前準備としてブラウザにはPower Automate Desktopの拡張機能を追加しておく必要があります。

Excelを起動する

アクションをフローに追加するには、追加したいアクションを真ん中の何にもないところへドラッグ&ドロップします。もしくはアクションをダブルクリックでもいいです。

まずはExcelを起動したいので、アクションから Excel → Excelを起動 を追加します。

するとパラメーターを指定する次のような画面になります。

パラメーターは読んで字のごとくなので、設定していきます。

Excelの起動:次のドキュメントを開くに切り替えると、ドキュメントパス:に起動時に開くファイルを指定できます。ドキュメントのアイコンをクリックするとエクスプローラーが開くので開きたいファイルを選択すればOKです。

一番下に生成された変数という項目がありExcelInstanceとあります。以降の処理でここで開いたExcelファイルを使いたい場合はこのExcelInstanceを指定することで利用できます。

VBAerのかたにわかりやすく説明するとSet ExcelInstance = Workbooks.Open(DocPath)ということです。このようにアクションの実行結果に戻り値がある場合は変数に格納されます。

変数名は自動生成されますが、自分で命名もできます。変数名ダブルクリックで編集モードになります。

ここで自分の好きな名前にリネームできます。両端についている%は、これが変数であることを示す記号で、消しても確定後に勝手に付与されますので上書きして大丈夫です。

Power Automate Desktopのアクションの追加はすべてこの方式で行います。以降この繰り返しでフローを組み立てていきます。

Excelから表データ取得

次のステップとしてExcelから表部分のデータを取得します。Power Automate(クラウド)ではテーブル名を指定するだけでデータ範囲を特定できたのですが、Desktopではまだテーブル名で取ることはできなさそうなので一手間かかります。

やり方はいろいろあるのですが、今回はVBAでいうところのRange.CurrentRegionに近い方法で取得してみます。

アクションから Excel → Excelワークシートから最初の空の列や行を取得 を追加します。

このアクションはExcelファイルのアクティブなシートの使用範囲から最初の空白列、最初の空白行が何列目、何行目なのかを特定してくれます。

パラメーターには対象となるExcelインスタンス:を指定するだけで、ここでは自動的に前段のExcelInstanceが入っています。

生成される変数のFirstFreeColumnFirstFreeRowに名前の通りの行列のインデックス(数値)が入ります。

今回の表はセルをB列11行まで使用しているので

FirstFreeColumn = 3
FirstFreeRow = 12

となります。この数値は次段以降で使用できます。

次のステップで表のデータを変数へ格納します。

アクションから Excel → Excelワークシートから読み取り を追加します。パラメーターは次のように読み取るセル範囲を設定します。

Excelインスタンス:は先に起動しているExcelInstanceが自動的に入っているのでそのままです。

取得:セル範囲の値に変更すると範囲を指定するために先頭行、先頭列、最終列、最終行を設定できるようになります。

表の先頭はA1セルなので

先頭行 = 1
先頭列 = 1

を設定します。

最終行・列は絶対に変動しないのであれば数値決め打ちでも構いませんが、今回はデータ数により可変の想定で前段で取得したFirstFreeColumnFirstFreeRowを使って設定します。

それぞれの{x}をクリックすると、これまでに作成された変数がリストで表示されます。リストから選択するとその変数がパラメーターとして設定されます。

ただし、FirstFreeColumnとFirstFreeRowは最初の空白行・列数なので、このままだと次の画像でしめす赤枠内が対象範囲になってしまいます。

これでは困るのでそれぞれの変数(数値)を1減らしたいです。アクションには変数を加算、減算するものがあり、それでもできるのですが、もっと簡単にパラメーター設定枠内で計算ができるのでやってしまいましょう。

やり方は変数を示す%~%の中で四則演算記号を使います。具体的には

%FirstFreeColumn – 1%

とします。これで計算された結果、この場合2がパラメーターとして設定されます。同様に行のほうも1減らしておきます。

最後に詳細を展開して範囲の最初の行に列名が含まれていますを有効にします。これを有効にしておくと、列を番号ではなく列名で参照できるようになります。

取得した範囲はExcelDataという変数に格納されます。

ブラウザを起動する

次のステップでブラウザを起動します。ブラウザは拡張機能をインストールしてあるものを使います。今回はEdgeです。

Webオートメーション → 新しいMicrosoft Edgeを起動する で初期URLを設定します。空白ページでの起動は現時点ではできないので、適当なURLを入れておきましょう。

生成された変数Browserは次段以降でブラウザに対して操作したい場合に使います。

繰り返し処理 For each

次のステップでExcelの表データを1行ごとに取り出すループを作成します。ループは種類がいくつかあるのですが、表を総当たりするのには一番簡単なFor eachを使います。

ループ → For each を追加します。パラメーター設定は1つだけです。

反復処理を行う値:に{x}でExcelDataを設定します。生成された変数CurrentItemは表のうちの1行のデータが入ります。VBAerの皆さんには「VBAのFor Eachと一緒」で説明終了ですが、そうでないかたがわかりやすいように、実際に実行中の変数の値を見ることができるので見てみましょう。

ExcelDataの中身は次のようになっています。Datatableというのが変数型です。

For eachではこの表の#0から順番に1行ずつ取り出してDatarowという型でCurrentItemへ格納します。

例えば1回目のループでは

2回目のループでは

となります。

なので、ループの中でCurrentItemに対していろいろやると、表データすべてに対して処理していくことができるということです。

For eachループのしくみがわかったところで、仕上げにブラウザでURLを片っ端から開いて終わりです。この処理は当然ループの中に入れる必要があります。

Webオートメーション → 新しいタブを作成 をFor each~Endの中に追加します。フローの途中に新しくアクションを追加する場合は、次の画像のようにアクションをドラッグしていくと追加位置に線がでるので狙ったところでドロップすればOKです。

For each~Endに挟まれたアクションをCurrentItemが取り出せなくなるまで繰り返す、というのがFor eachループのうごきです。

パラメーターは次のように設定します。

Webブラウザーインスタンス:には先に起動したEdgeを示すBrowserが自動的に設定されていますのでこのままでいいです。

移動先のURL:にはループで取り出したCurrentItemを使います。{x}でCurrentItemを選択します。CurrentItemは先述のとおり行のデータですので

のようになっています。ここから必要な列のデータだけを取り出すには列名を指定します。列名の指定は[‘列名’]とします。

必要なのはURL列なので%CurrentItem[‘URL’]%とします。注意点として列名は%~%の中に記述しなければなりません。外に書いてしまうと単なる文字列として認識されてうまくいきません。

以上でフローが完成しました。全体像は次のようになりました。

フローを実行する

さっそく組み上げたフロー実行してみましょう。フロー編集の上のほうにある実行ボタンを押しても実行できますが、今回は通常の実行方法でやります。

フロー編集画面で保存ボタンを押したらメインメニューに戻って実行ボタン(再生マーク)を押します。

メインメニューから実行すると通知領域でフローの開始・終了が通知されます(うるさかったら消せます)。

Excelとブラウザが起動してタブがたくさん開いていきます。

結果このようになりました。

さいたま市の全区のWEBサイトが別タブで開いています。これで私クラスの特級さいたま市民の嗜みである、全区の最新情報取得がはかどります。

まとめ

このような繰り返し処理もPower Automate Desktopであれば多少のプログラミングのセンスは必要ですが、プログラミング言語の文法を一切覚えることなく実現できます。

もはやVBAを使えることが何のアドバンテージにもならない時代がすぐそこまできています。さらにMicrosoftは今後、Excel関数ライクのローコードプログラミング言語Power Fxをリリースします。完全にVBAを消し去るつもりです。

我々VBAerがこの先生きのこるには(←一度言ってみたかった)プログラミングセンス=効率的なロジックを組み立てる力を磨きあげていくしかないでしょう。

Power Automate Desktopはめちゃくちゃ遊べるので、しばらくこのネタでいきます。

つづく。

つづきができました。