【自動化】無料になったPower Automate DesktopでExcelとWebブラウザを自動操作する

## Power Automate Desktopが無料に
2021/3/3からMicrosoftのRPAツールである**Power Automate Desktop**がWindows10ユーザーに**無償提供**されるようになりました。
これは**お金をかけずにWindows10上でのあらゆる操作を自動化**できる可能性を意味します。
胸が熱くなりますね。

早速ダウンロードして使ってみましたので、本記事でご紹介させていただきます。

## 株価の調査を自動化する
やはり、自動化したい操作の2トップは**Webブラウザ**と**Excel**ではないでしょうか。
この2つは定型業務でもよく使われますから、これらを自動化するコツをつかめれば非常に役立ちそうです。

そこで、今回は
**「Excelにリスト化されている銘柄の株価をWebサイトで調べて、結果をExcelに記入する」**
という一連の操作をPower Automate Desktopで自動化してみたいと思います。

## Power Automate Desktopのインストール

下記の公式ページから、「無料でダウンロードする」をクリックしてインストーラをダウンロードしてください。
[Power Automate Desktop公式](https://flow.microsoft.com/ja-jp/desktop/)

あとはインストーラの指示通りに進めていけばOKです。特に迷うところはありません。

## Power Automate Desktopでフローを作成する

### Power Automate Desktopの起動

1.Power Automate Desktopを初めて起動すると、サインイン画面が表示されます。
![pad_app_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/f752e2e7-cc4c-e752-bd3a-033976ced444.png)

メールアドレスを入力して、サインインしましょう。
![pad_app_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/b6a586ec-e28a-41ed-2df8-e073ae9631b2.png)

2.サインインに成功すると「国/地域の選択」画面になるので、お住いの国を選択して「開始する」をクリックします。
![pad_app_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/88f2527f-ff60-ed96-8234-60fe8ad0049b.png)

3.開始するとフローの管理画面になります。初めはフローは1つもないので、「新しいフロー」から作成していきます。
![pad_app_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/74358d9a-cca9-6b6f-880d-a025c998d6fd.png)

#### 新しいフローの作成
「新しいフロー」をクリックすると、フローの作成画面が表示されます。
ここではフロー名を「株価調査」として作成します。
![pad_flow1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/fa859c38-cc52-59fb-e3ee-1c439dd200a8.png)

これがフローの初期画面です。左側の「アクション」から所望の操作を選んで、真ん中の余白部分にドラッグ&ドロップし、フローチャートのような形でグラフィカルにフローを作成していきます。

![pad_flow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/d78a4fd9-740d-5564-0a2a-a5230f593edc.png)

フローの作り方には大きく2つの方法があります。

1. レコーダーを使い人間の行った操作を記録してフローのベースを作り、そこから微調整する
2. 最初からアクションを1つずつ組み立てていく

今回はアクションとフローを基礎から理解していくため、2の方法でやってみましょう。

#### おおまかなフローのイメージ
実際に作業を始めて行く前に、フローの大枠を考えてみましょう。
今回は下記のようなフローになるはずです。

1. Excel(株主優待人気銘柄.xlsx)を開く
2. Excelのリストの1番目の銘柄コードを株価検索のWebサイトで検索する
3. 検索結果から株価情報をExcelのリストにコピペする
4. 2番目から10番目まで3,4を繰り返す

#### Excelを開く

「株主優待人気銘柄.xlsx」というExcelファイルを開き、銘柄コードの列を1行ずつ読み込んでいくという操作を自動化してみましょう。
左側のアクションから
`Excel > Excelの起動`をドラッグ＆ドロップします。

![pad_flow3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/8bdae63c-273c-0b5f-0e1c-ceb02c36b1a7.png)

ドラッグ＆ドロップするとアクションの詳細画面が開きます。
![pad_flow4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/a6420b74-37e5-bcee-3f4a-10709acf6e31.png)

`Excelの起動`は"次のドキュメントを開く"
と指定して、
`ドキュメントパス`では、株価情報が記載されているExcelファイル(株主優待人気銘柄.xlsx)を選択します。


#### Excelからデータを読み込む
Excelを開いたら次はデータを読み込んでいきます。
1行ずつデータを**繰り返し処理**していきたいので、まず左側のアクションから
`ループ > Loop`をドラッグ＆ドロップします。

![pad_flow6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/de85bc1f-3f21-da98-0328-ef750d1f986e.png)

![pad_flow7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/f3fa7234-ede0-a391-89cb-d1fc3c2b2af7.png)

株主優待人気銘柄.xlsxは1行目が表のラベルで、株式のデータは2行目から11行目に記載されています。
なので、ループは
`開始値`：2
`終了`：11
`増分`：1
とします。
この変数は`LoopIndex`として格納されます。

次はLoopとEndの間に処理を追加していきます。

左側のアクションから
`Excel > Excelワークシートから読み取り`をドラッグ＆ドロップします。

![pad_flow8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/65f965c3-5085-b7d9-ac97-8d33892851b7.png)

![pad_flow9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/3f7d2c11-7167-8923-9264-eb220ae7497f.png)

Excelインスタンスはすでに自動で選択されていますね。
`取得`では"単一セルの値"を選択します。
`先頭列`と`先頭行`には、読み取りたいセルの行番号と列番号を入力します。
今回はB列のLoopIndex行を読み取りたいので、
列については、A列→1、B列→2、C列→3、…と変換して数字で入力します。
つまり、`先頭列`は"2" となりますね。
`先頭行`にはLoopIndexという**変数**を指定したいので、入力欄の右端の**{X}**というマークを押して、変数の中からLoopIndexを選択します。
ここで、読み取った値は変数`ExcelData`に格納されます。

### 動作確認

では、このあたりで本当に銘柄コードを一行ずつ読み取れるのか確認してみましょう。

左側のアクションから
`メッセージ ボックス > メッセージを表示`をドラッグ＆ドロップします。

![pad_flow10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e674d062-8cb4-820e-8bdd-ce3ccb9a54b5.png)
![pad_flow11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/c67e8792-fecf-cbb1-1549-5ec2b40978fa.png)

`メッセージボックス`のタイトルは"銘柄コード"として、
`表示するメッセージ`に`ExcelData`という変数を指定します。
フローの上の方にある三角のマーク（「実行」ボタン）をクリックしてフローを動かしてみましょう。

きちんと動作しましたか？
表示が確認できたら、この`メッセージを表示`のアクションはジャマなので無効化しておきましょう。
`メッセージの表示`の上で右クリックをして"無効にする"を選択します。薄い灰色になったら無効化されています。

![pad_flow12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/c6dc8240-7abe-cd47-522e-36dc20954c74.png)

### Webの操作を自動化する
Excelから銘柄コードを取得できたので、次はこの銘柄コードで株価を検索します。
つまり、Webブラウザの操作を自動化していきます。

https://minkabu.jp/stock

というサイトで銘柄コードを入力して結果を読み取っていきましょう。

#### Webブラウザを起動する

Chromeの場合、Power Automate Desktop拡張機能が必要らしいので事前にインストールしておきます。

左側のアクションから
`Webオートメーション > 新しいChromeを起動する`をドラッグ＆ドロップします。
![pad_flow13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/8346ec29-9a91-39ee-b29a-6fe47829b4e3.png)


`新しいChromeを起動する`の詳細設定画面では、
`新しいインスタンスを起動する`を選択して、  
`初期URL`には先ほどのサイトのURL"https://minkabu.jp/stock"を入力します。
`ウィンドウの状態`はとりあえずここでは"最大化"にしておきます。

#### Webブラウザに入力する
次にサイトの「銘柄名、銘柄コードから株価を調べる」というところにExcelから取得した銘柄コードを入力して検索してみたいと思います。

![pad_flow17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/3e329b64-e82a-f3c1-575f-00ffd6361be6.png)

アクションから
`Webオートメーション > Webフォーム入力 > Webページ内のテキストフィールドに入力する`をドラッグ＆ドロップします。
Excelで銘柄コードを読み取ったあとに検索するので、「Excelワークシートから読み取り」の下にドラッグ＆ドロップしましょう。

![pad_flow15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/d851f384-728d-3d3a-ca9d-efac548534c3.png)
![pad_flow16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/7fc66025-04a7-3d6d-7235-9d776bca2e26.png)


詳細画面では、どこのフィールドに入力するかを**UI要素**で選択します。

`UI要素`の右端の**下矢印のようなマーク**をクリックして、`新しいUI要素の追加`を選びます。
すると、**追跡セッション**というウィンドウが立ち上がります。

ここでWebページの各要素にマウスを当てると赤い枠がホバーします。
Ctrlキーを押しながら該当の要素をクリックするとその要素を認識して追加される仕組みです。

![pad_flow17_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/dbcab3fa-c80f-284a-939d-fd34566d2a6d.png)

ここでは目的の検索フィールドにマウスを合わせると`<input:search>`というWeb PageのUI要素として認識されます。
Ctrlキーを押しながらクリックしてUI要素として追加します。

![pad_flow18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/ac58d764-731f-c611-fcca-626270095220.png)

こんな感じでUI要素として追加されたらOKです。

ここで注意が必要というか、私がハマってしまった点です。

追跡セッションで目的の検索フィールドにマウスを合わせると`Edit`となってしまうことがあります。
こうなってしまうと、Web PageのUI要素ではなく、通常のアプリケーションのテキスト入力の要素として認識されてしまうようでうまくいきません。
**Webブラウザ内の要素がうまく認識されるときとされないときがあり**、どう対処すればいいのか正確には不明です。
ブラウザを立ち上げ直したり、他の要素を選択させたりしていると、Web PageのUI要素をうまく認識してくれるようになります。  
原理はよくわかりません。

UI要素がうまく認識されたら、次にテキストフィールドに入力したい文字列を`テキスト`に入力します。
ここではExcelから読み取った銘柄コード(ExcelDataという変数)を入力したいので、それを入力して保存します。

### Webのボタンをクリックする
同じ要領で次は、キーワード検索の横にある「検索」ボタンを押して検索を行います。
アクションから「Webページのリンクをクリックします」を選択します。

アクションから
`Webオートメーション > Webフォーム入力 > Webページのボタンを押します`をドラッグ＆ドロップします。

![pad_flow21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/c5349598-43ce-b67a-03bc-646835bbacad.png)

`UI要素`では、先ほどと同じく追跡セッションを起動させて、サイト上の「検索ボタン」を認識させてCtrlを押しながら選択します。

#### Webから情報を読み取る
さて、ここで検索ボタンを押して検索結果が表示されたとして、どこから情報を読み取るかを考えます。

![pad_flow24_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/aae4c2a6-86fb-b610-7e1a-81b91a65c96b.png)

- 株価
- 売りか買いか
- 目標株価

あたりから情報を抜き出すことにしましょう。

アクションから
`Webオートメーション > Webデータ抽出 > Webページからデータを抽出する`をドラッグ＆ドロップします。

![pad_flow23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/cf88f143-fde3-fae9-02a4-c650b93ea5f3.png)

![pad_flow24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/1f6b6aeb-8547-c194-2544-c40d513f9dc0.png)

「このダイアログが開いている間に、実際のWebブラウザーウィンドウをフォアグラウンドに表示すると、ライブWebヘルパーがアクティブ化されます。」
という一見よくわからないメッセージが書いてありますが、
要は今の状態でWebサイトを開くと、先ほどと同じような追跡セッション状態となっているわけです。
Webサイト上の要素にマウスカーソルを合わせると赤枠が表示されると思います。
ここで**抽出したい要素にカーソルを合わせて右クリック**します。
するとメニューが出てくるので`要素の値を抽出 > テキスト`と選択します。

![pad_flow25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/49b2c135-29ab-2053-6eee-4f9d5ed69991.png)

![pad_flow26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/085ea64d-b455-869f-2922-0dd68c44d402.png)

- 株価
- 売りか買いか
- 目標株価

をそれぞれ読み取りましょう。

### Excelにデータを入力
Webサイトから読み取った値をExcelに書き込んでいきましょう。

アクションから
`Excel > Excelワークシートに書き込み`をドラッグ＆ドロップします。

![pad_flow28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/1d3610ab-b82b-edf8-cedb-7ccdea1f3066.png)
![pad_flow29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e1614c91-ca49-9765-7a1c-dabc46106ee8.png)


`書き込む値`には先ほどWebサイトから読み取った値が格納されているDataFromWebPageという変数を選択します。

この変数はデータテーブルという**二次元配列**の形式になっています。
今回のケースであれば、抽出した値は3つあるので1行3列の形になっています。

二次元配列で特定の値を取り出したいときには、
DataFromWebPage[行番号][列番号]
の形で指定します。ただし、行番号、列番号は**0から始まる**ことに注意してください。

[参考：変数のデータ型](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/variable-data-types)

DataFromWebPage[0][0]
をExcelのE列に書き込みたいので
列：5
行：LoopIndex
を選択します。

同様にして
DataFromWebPage[0][1]
をExcelのF列に書き込みたいので
列：6
行：LoopIndex


DataFromWebPage[0][2]
をExcelのG列に書き込みたいので
列：7
行：LoopIndex

とします。
ちなみにアクションはコピペできます。

#### Webページの操作
Excelに値を書き込んだら、Webページで元の検索画面に戻って、次の行に進みます。

アクションから
`Webオートメーション > Webページに移動します`をドラッグ＆ドロップします。

![pad_flow31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/4fdba591-56cc-7f06-8199-2c93c59b322a.png)

![pad_flow32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/c2ea3216-0f78-c555-48f4-c6b7c22a55d1.png)

`移動`：戻る
を入力して保存します。

あとはこれをLoopで繰り返すだけですね。

すべてが終わったら、最後にブラウザを閉じて終了にします。
![pad_flow34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/0bf84d67-a885-613d-0a72-e982a0b72de4.png)

これで完成です。
![pad_flow35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/8ab1691e-c508-464b-13ae-76f4604afa19.png)

このフローを実行すると、ちゃんとExcelに株価が追記されています。

![pad_flow36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/05a01112-01f7-b649-9608-1c7ca693d59a.png)



## 参考
私の書いた他の自動化シリーズはこちらです。ご興味があればどうぞ！

【自動化】PDF内の表をPythonで抜き出す
https://qiita.com/konitech913/items/4ef70e1f7753c824b40f

【自動化】PythonでOutlookの予定を抜き出す
https://qiita.com/konitech913/items/2ec831863ad84db23558

【自動化】Pythonでマウスとキーボードを操る
https://qiita.com/konitech913/items/301bb63c8a69c3fcb1bd

【自動化】PythonでWordの文書を読み取る
https://qiita.com/konitech913/items/c30236bdf47775535e2f

【自動化】Pythonコードをexeファイル化する
https://qiita.com/konitech913/items/6259f13e057bc25ebc23

【自動化】PythonでOutlookメールを送信する
https://qiita.com/konitech913/items/51867dbe24a2a4272bb6

【自動化】PythonでOutlookのメールを読み込む
https://qiita.com/konitech913/items/8a285522b0c118d5f905

【自動化】Pythonでメール(msgファイル)を読み込む
https://qiita.com/konitech913/items/fa0cf66aad27d16258c0

【自動化】Pythonでクリップボードを操作してExcelに表を貼り付ける
https://qiita.com/konitech913/items/83975332e395a387eace