Power Automate Desktopでみずほの為替レートを自動取得


Power Automate Desktopを使ってみずほのWebサイトにある為替レート表(Table)をExcelに保存してみました。私自身、Power Automate Desktopについては見よう見まねなので、参考程度にご覧ください。

Power Automate Desktop

Microsoftからデスクトップの自動化ツールが無償提供されることになりました。


みずほの為替レートを取得

妻がみずほの為替レートをExcelに取り込みたいと話していたので、そんなのExcelの基本機能でできるでしょ、とやってみたところ、一向にページが表示されません。放置して随分後に見たらようやく表示されていました。

みずほは、ATMの故障や海外送金トラブルだけでなく、Webサイトの作りも悪いのかと思いました。(ちなみに妻は300件しかなかった海外送金トラブルに当たった一人でした)

そこで、試しにPower Automate Desktopでやってみようかと思いました。


参考動画

とても参考になったのは次の勉強会の中のデモ部分です。

Microsoft Power Automate Desktop for Windows 10 初心者向け勉強会

これで、Power Automate Desktopでのループ処理のやり方を理解しました。


機能説明

次のサイトに表示されている為替レートの二つの表を新しいExcelブックのワークシートにコピーします。

外国為替公示相場 みずほ銀行

今回はブラウザにChromeを使いました。


実際のコード

次のコードが実際に作成したPower Automate Desktopからコピペしたものです。ご自分の空のフローにコピペすればアクションが再現されると思います。

WebAutomation.LaunchChrome Url: $'''https://www.mizuhobank.co.jp/market/quote/index.html''' WindowState: WebAutomation.BrowserWindowState.Normal ClearCache: False ClearCookies: False BrowserInstance=> Browser
@@timestamp: '2021-03-12T10:31:18.2684477Z'

WebAutomation.GoToWebpage BrowserInstance: Browser Url: 'https://www.mizuhobank.co.jp/market/quote/index.html'
@@timestamp: '2021-03-12T10:31:56.6127132Z'

WebAutomation.DataExtraction.ExtractList BrowserInstance: Browser Control: 'html > body > div:eq(2) > div > div:eq(2) > div:eq(1) > article > div > div:eq(1) > div:eq(0) > div:eq(0) > table > tbody > tr' ExtractionParameters: { ^['Css Selector', 'Attribute', 'Regex'], ['', 'Own Text', ''] } ExtractedData=> OutputData

WebAutomation.DataExtraction.ExtractList BrowserInstance: Browser Control: $'''html > body > div:eq(2) > div > div:eq(2) > div:eq(1) > article > div > div:eq(1) > div:eq(1) > table > tbody > tr''' ExtractionParameters: {['', 'Own Text', ''] } ExtractedData=> OutputData2

Excel.Launch Visible: True LoadAddInsAndMacros: False Instance=> ExcelInstance

SET Counter TO 1

LOOP FOREACH CurrentItem IN OutputData
    Text.Split Text: CurrentItem StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
    Excel.WriteCell Instance: ExcelInstance Value: TextList[0] Column: 1 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[1] Column: 2 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[2] Column: 3 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[3] Column: 4 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[4] Column: 5 Row: Counter
    Variables.IncreaseVariable Value: Counter IncrementValue: 1 IncreasedValue=> Counter
END

LOOP FOREACH CurrentItem IN OutputData2
    Text.Split Text: CurrentItem StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
    Excel.WriteCell Instance: ExcelInstance Value: TextList[0] Column: 1 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[1] Column: 2 Row: Counter
    Excel.WriteCell Instance: ExcelInstance Value: TextList[2] Column: 3 Row: Counter
    Variables.IncreaseVariable Value: Counter IncrementValue: 1 IncreasedValue=> Counter
END

Display.ShowMessage Title: $'''終了通知''' Message: $'''処理が完了しました''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed


アクション画像

次の画像はPower Automate Desktopで見たところです。クリックで拡大できます。



アクションの説明

以下のリストの番号はアクションの番号に対応します。

  1. Chromeを起動し、インスタンス(簡単に言えばChrome)をBrowser変数に格納して、操作可能にします。
    (正確にはPower Automate DesktopがChromeを操作するためのオブジェクトへの参照値が代入されるということになるのでしょう)

  2. 為替レートのページに移動していますが、1のステップで指定してあるのでこれは削除しても動作するかもしれません。

  3. 一つ目の表をOutputData変数に格納しています。
    これは取得方法の説明が必要なので、後でご説明します。

    取得対象の表の一部

    取り込んだOutputDataを表示したところ

  4. 同様に二つ目の表をOutputData2に格納しています。

  5. 新規にExcelを起動します。
    インスタンス(要はExcel)が変数ExcelInstanceに代入され、これを使ってExcelを操作できるようになります。

  6. Excelのワークシートのどの行に書き込むかを制御する変数Counterを定義します。
    最初の値は1です。
    (今にして思うと、初期値を0にして、各処理の手前でカウントアップした方が理解しやすかったと思います。スクリーンショットを撮った後で面倒なので直しませんが)

  7. ここからアクション15までが最初のループ。レートの表が複数行なので繰り返し処理を行います。
    ループにはFor eachを使います。これはOutputDataから一行ずつデータを取り出してCurrentItemにコピーして、全てのOutputdataの行を処理するという便利アクションです。
    これがないと自分でアクセスするデータ行を管理しないといけないので少し面倒になります。

  8. CurrenItemにはレート表の一行が入っています。レート表の各列は改行コードで分割されているようだったので、「テキストの分割」を使って行ごとに分割してTextList変数に格納してみました。

  9. TextListの1列目の値をExcelのワークシートに書き込んでいます。


    操作対象となるExcelはExcelインスタンスで指定します。

    書き込む値は%TextList[0]%のように[]の番号で指定します。
    番号は、アクション8の画像の#に対応しています。

    0で始まっているのは指定の仕方がオフセット(ずれ)だからです。番号そのものを指しているわけではなく、最初の位置からどれだけずれているかを示しているものだからです。例えば、1番目からオフセット(ずれ)0なら1番目、オフセット1なら2番目ということになります。オフセットは相対位置だという言い方もできます。

    今回の場合は列ごとに別のアクションで書き込んでいるためアクション9の列番号は常に1です。

    それに対して、書き込む行は毎回1だと同じ場所に書き込んでしまうので、Counter変数を使って、行を処理するごとに1ずらして書き込みます。

  10. レート表2列目の処理
  11. 3列目
  12. 4列目
  13. 5列目

  14. Counter変数を1増やして次の行の書き込みに備えます。

  15. 一つ目のループの終了

  16. 移行、二つ目の表を同様に書き込みます。

プログラミングをされている方なら、アクション9から13の繰り返しを見てダサッと思われるかもしれません。私も最初はもう一つ列を処理するループを書いたのですが、速度の面と分かりやすさの面からループを開きました。(人間オプティマイザー)

速度についてはループのアクションに対して、実効遅延1ミリ秒(1/1000秒)を指定したところ十分高速になったので開く必要はなかったかもしれません。

アクションを選択して画面下で指定


ただ、プログラミング初心者だとループのネストは分かりにくいし、変数の管理が増えるのでやめておきました。

ちなみに、実効遅延の指定はコピーしたアクションのコードには見当たらないので、フローのアクションのデータとして管理されるようです。コードを貼付したら実効遅延も指定し直しではないかと思います。


結果

以上のアクションを実行した結果がこちらです。

後は、関数を使うなりExcelマクロ(VBA)を使うなりして処理することになります。

今回は、新規エクセルファイルにコピーしましたが、既存ファイルを開いてコピーするのも一つでしょう。

コピーしたファイルを「Excelの保存」アクションを使って保存するのも一つです。


Webレコーダーを使ったリスト指定

はじめての表の取り込みで少々てこずったので書いておきます。


  1. 表データの取り込みにはWebレコーダーを使います。

    Webレコーダー


    今回はChromeを使います

  2. ブラウザが起動してくるので次のURLに移ります。
    https://www.mizuhobank.co.jp/market/quote/index.html

  3. 記録の開始


  4. マウスポインターを取得したい表のセルの上に持って行くと、赤枠で囲まれます。
    (囲まれない時には、Chromeの拡張機能が入っていないので1の手順の画面に従い拡張機能をインストールします。)

    右クリックして、「親UI要素の選択」をクリックします。
    すると行が選択状態になります。


    行が選択状態になる

  5. 再度行を右クリックして、「要素の値を抽出」をクリックし「テキスト」をクリックします。

    すると行が緑の破線で囲まれます。

    右クリックしてテキストを選択

    行が緑の破線で囲まれる

    レコーダーではこのように表示されます

  6. 次の行も同様に選択して抽出します。
    すると、自動的にすべての行が選択され、抽出も要素からリストに代わっています。


    行を抽出

    他の行も自動的に抽出

    データの抽出が要素からリストになっています


一行一行指定しないといけないのかと気が遠くなりかけましたが便利な仕組みがあってよかったです。

コードを見ると正規表現を使って表のデータを取得しているように見えます。

これ、逆に特定の行だけ抽出したいとなったらどうなるのか疑問もありますが。

以上、表の抽出方法でした。


今後

とりあえず、ExcelやWeb、そして基本的なソフトウェアの操作はできそうです。

日時のアクションが妙に少ないけれど、これどうするんだろうと思ったけれど、PowerShellなどを呼び出せば何とかなりそうです。次の例では、Power Automate Desktopで取得した現在時刻をPowerShellに渡して一か月追加して返してもらい、メッセージ表示しています。

DateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime

System.RunPowershellScript Script: $'''$date=[DateTime]\"%CurrentDateTime%\"
echo $date.addMonths(1)
''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError

Display.ShowMessage Message: PowershellOutput Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed


日付の処理等は適当です。最初に単純に%CurrentDateTime%を貼り付けてみたら、時刻部分が理解されずエラーになったのでダブルクォーテーションで囲みました。

そしたら、今度は$dateが文字列になってしまってaddmonthの処理でエラーが出たので、[DateTime]でキャストしました。

しばらくPowerShellを触っていなくて忘れてしまったので適当です。


それはさておき、いちいちPowerShellを起動したら実行速度が遅いのではないかと思いますが、やる事自体はできそうです。

これが可能なら、PowerShellからExcelを制御することもできるかもしれません。例えば、上記アクションでコピーした表を加工するなど。


マクロのコール

Power Automate DesktopのExcelアクションは少ないので本格的な処理をするとなったらExcel側のマクロを呼び出すことになるでしょう。速度面を考えてもそうなると思います。

さて呼び出しはと思ったら、PowerShellのExcelオブジェクトにあるRUNメソッドで呼び出せるようです。

PowerShell から VBA を実行させる sutefu7.com

ExcelからPower Automate Desktopをコールしたいなと思っていましたが、できなさそうな気がします。これができてしまうと簡単にフローのスケジュール化ができてしまい、有償ライセンスの意味がなくなってしまいますから。ちょっと検索してみましたけれど見つかりません。



コメント

アクセスランキング(過去30日間)

Excel 2019 クエリが原因で日本語入力の一文字目が勝手に確定する

iPhone 12 Proと iPhone 8 Plusのサイズを比較

Amazon Prime Videoで4K UHD映画を検索する方法

テント アメニティドームM を購入しました

Microsoft Flight Simulator (2020)のPS4コントローラー設定

コールマン タフスクリーンタープ/400 を購入しました

77型有機ELテレビ BRAVIA KJ-77A9G を購入

無印良品 南乗鞍キャンプ場に二泊しました。

iPhone 12 Pro Maxでも裸族かも

タレックス(TALEX)のサングラスには寿命がある